新手求教个问题C#中如何写复杂的复杂sql语句分析

> 请帮忙 在c#中sql语句写法解决方法
请帮忙 在c#中sql语句写法解决方法
labview2008 & &
发布时间: & &
浏览:30 & &
回复:6 & &
悬赏:0.0希赛币
请帮忙 在c#中sql语句写法请问
string & sqlStr= &select & city,city1,addr2 & from & postcode & where & code= &&this.tb1.Text& & &;
其中this.tb1.Text是一个textbox的文本,编译无法通过,请问我该如何写
string sqlStr= &select city,city1,addr2 from postcode where code= ' &+this.tb1.Text+ & ' &;
lacrimosa123 & &
09:54:21 & &
& & (0)(0)string sqlStr= &select city,city1,addr2 from postcode where code= & + this.tb1.T
lack1001 & &
09:54:21 & &
& & (0)(0)一楼是文本类型,也可是time类型,二楼是数值类型,看你的code类型,选择使用。记得给分。
lacrimosa & &
09:54:21 & &
& & (0)(0)string sqlStr= &select city,city1,addr2 from postcode where code= ' &+this.tb1.Text+ & ' &;
這也太簡單了吧!!!
lacuscurs & &
09:54:21 & &
& & (0)(0)string sqlStr= &select city,city1,addr2 from postcode where code= ' &+this.tb1.Text+ & ' &;
lacrimosa & &
09:54:21 & &
& & (0)(0)string sqlStr= &select city,city1,addr2 from postcode where code= ' &+this.tb1.Text+ & ' &;
应该是这个lachesis & &
09:54:21 & &
& & (0)(0)
本问题标题:
本问题地址:
温馨提示:本问题已经关闭,不能解答。
暂无合适的专家
&&&&&&&&&&&&&&&
希赛网 版权所有 & &&  今天下午同事问我一个比较基础的问题,在拼接sql语句的时候,如果遇到Like的情况该怎么办。
  我原来的写法就是简单的拼接字符串,后来同事问我如果遇到sql注入怎么办。我想了下,这确实是个问题。
  刚在网上找了下相关的说明,原来是这样写的。
  如这样一个sql语句:
select * from game where gamename like '%张三%'
  用c#表示的话:
string keywords = "张三";
StringBuilder strSql=new StringBuilder();
strSql.Append("select * from game where gamename like @keywords");
SqlParameter[] parameters=new SqlParameter[]
new SqlParameter("@keywords","%"+keywords+"%"),
这里虽然采用了仍然是用% 来写,但是可以有效过滤sql注入的情况,还是挺简单实用。
是个小知识点,希望对你能有所帮助! ^_^
阅读(...) 评论()【面试题】怎样根据结果写出sql语句! 求大神指教【c#吧】_百度贴吧
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&签到排名:今日本吧第个签到,本吧因你更精彩,明天继续来努力!
本吧签到人数:0成为超级会员,使用一键签到本月漏签0次!成为超级会员,赠送8张补签卡连续签到:天&&累计签到:天超级会员单次开通12个月以上,赠送连续签到卡3张
关注:106,268贴子:
【面试题】怎样根据结果写出sql语句! 求大神指教收藏
一个表,有时间(只有两个不同的时间)和性别(男,女)两个字段,求根据时间分组查询出每个时间段的男女人数
AutoTDS-V1型全自动热解吸仪是一款20位常温二次全自动热解吸仪,气路采....
解决了,感谢大神
登录百度帐号推荐应用
为兴趣而生,贴吧更懂你。或在C#里面如何写参数化sql语句,参数个数不定,就像多条件查询
在C#里面如何写参数化sql语句,参数个数不定,就像多条件查询
发布时间: 5:21:35
编辑:www.fx114.net
本篇文章主要介绍了"在C#里面如何写参数化sql语句,参数个数不定,就像多条件查询",主要涉及到在C#里面如何写参数化sql语句,参数个数不定,就像多条件查询方面的内容,对于在C#里面如何写参数化sql语句,参数个数不定,就像多条件查询感兴趣的同学可以参考一下。
在C#里面如何写参数化sql语句,参数个数不定,就像多条件查询在C#里面怎么写参数化sql语句,参数个数不定,就像多条件查询如题
写一个存储过程[code=sql] ALTER search ( @bmid smallint = null, @xm varchar(10)=null, @xb varchar(10)=null, @strage smallint=null, @endage smallint=null, @zzmm varchar(10)=null, @xl varchar(10)=null, @zw varchar(10)=null ) AS /* SET NOCOUNT ON */ declare @sql varchar(100) if @bmid is not null begin set @sql=' where 部门ID='+Convert(varchar(10),@bmid) end if @xm is not null begin if @sql is not null set @+' and 姓名like' else set @sql=' where 姓名like' end if @xb is not null begin if @sql is not null set @+' and 性别=' else set @sql=' where 性别=' end if @strage is not null begin if @sql is not null set @+' and 年龄between '+Convert(varchar(10),@strage) else set @sql=' where 年龄between '+Convert(varchar(10),@strage) end if @endage is not null begin set @+' and '+Convert(varchar(10),@endage) end if @zzmm is not null begin if @sql is not null set @+' and 政治面貌=' else set @sql=' where 政治面貌=' end if @xl is not null begin if @sql is not null set @+' and 学历=' else set @sql=' where 学历=' end if @zw is not null begin if @sql is not null set @+' and 职位=' else set @sql=' where 职位=' end exec('select 职工号,姓名,性别,年龄,学历,婚姻状况,政治面貌from yuangong') RETURN [/code]
public static IDataReader ExecuteReader(DbCommand comm, string sql, params object[] value) { mandText = if (value != null && value.Length &= 0) { if (mandText.IndexOf(&?&) == -1) { string[] temp = sql.Split('@'); for (int i = 0; i & value.L i++) { string pN if (temp[i + 1].IndexOf(& &) & -1) { pName = &@& + temp[i + 1].Substring(0, temp[i + 1].IndexOf(& &)); } else { pName = &@& + temp[i + 1]; } //pName = &@p& + (i + 1).ToString(); DbParameter p = comm.CreateParameter(); p.DbType = DbType.S p.ParameterName = pN p.Value = value[i]; comm.Parameters.Add(p); } } else { string[] temp = sql.Split('?'); for (int i = 0; i & value.L i++) { temp[i] = temp[i] + &@p& + (i + 1).ToString(); string pName = &@p& + (i + 1).ToString(); DbParameter p = comm.CreateParameter(); p.DbType = DbType.S p.ParameterName = pN
一、不得利用本站危害国家安全、泄露国家秘密,不得侵犯国家社会集体的和公民的合法权益,不得利用本站制作、复制和传播不法有害信息!
二、互相尊重,对自己的言论和行为负责。
本文标题:
本页链接:天极传媒:天极网全国分站
您现在的位置:
& >>在C#中建立复杂的、灵活的SQL查询/命令
在C#中建立复杂的、灵活的SQL查询/命令博客园 06:00分享到:
  SelectQueryBuilder类允许在你的代码中建立复杂的SQL语句和命令。它也能帮助于避免SQL注入式攻击。  介绍  承认,并且我们都这样作过,也认为下面的方式是最好的和唯一的方式。就是我们建立大量的字符串包含所有的Where子句,然后提交到数据库去执行它。来断的加语句到我们的SQL字符串,极有可能会带来Bugs和SQL注入式攻击的危险。并且也使得我们的代码更难看也不易于管理。  这种情况必须停止,但如何停止?有人说使用存储过程。但它并没有真正的解决这个问题。你还得动态建立你的SQL语句,只不过有问题移到数据库层面上了,依然有SQL注入的危险。除了这个“解决方案”外,可能还有非常多的选择供你考虑,但它们都会带来一个基本的挑战:让SQL语句工作的更好、更安全。  当我从我的在线DAL(数据访问层)生成工具http://www./建立#模板时,我想提供一个易于使用的方法来定制查询数据。我不再想使用“字符串查询”(我以前开发的模板)来查询数据。我厌烦这种凌乱的方式来得到数据。我想用一种清晰的、直觉的、灵活的、简单的方式从表中选择数据,联接一些别的语句,使用大量的Where子句,用一些列来分组数据,返回前X个记录。  我开始开发所想的有这种严密功能的SelectQueryBuilder类。它暴露了许多属性和方法,你能很容易地在Select语句中使用它们。一旦调用BuildQuery()和BuildCommand()方法,它能提供一种更好的旧的“字符串查询“或可以使用命令参数的DbCommand对象来查询数据。  使用代码  旧的方式的代码  下面的代码阐明了以前建立SELECT语句的方法,它使用许多类变量来说明应该使用那种连接操作(WHERE,或者OR),同时也给你的数据库带来了可能的SQL注入式攻击。
string statement = "SELECT TOP " + maxRecords + " * FROM Customers ";string whereConcatenator = "WHERE ";if (companyNameTextBox.Text.Length & 0){ statement += whereC statement += "CompanyName like '" + companyNameTextBox.Text + "%' "; whereConcatenator = "AND ";}if (cityTextBox.Text.Length & 0){ statement += whereC statement += "City like '" + cityTextBox.Text + "%' "; whereConcatenator = "AND ";}if (countryComboBox.SelectedItem != null){ statement += whereC statement += "Country = '" + countryComboBox.SelectedItem + "' "; whereConcatenator = "AND ";}  我相信上面的代码对你来说是非常熟悉的,你可能在过去的十多年一直是这样使用的,或者你曾经编码过数据库驱动的搜索功能。让我告诉你这种思想:这种查询你的数据库的方法不能再使用了,它是难看的也是不安全的。  SelectQueryBuilder方式的代码  同样的查询能够使用SelectQueryBuilder类建立。
SelectQueryBuilder query = new SelectQueryBuilder();query.SelectFromTable("Customers");query.SelectAllColumns();query.TopRecords = maxRif (companyNameTextBox.Text.Length & 0) query.AddWhere("CompanyName", Comparison.Like,companyNameTextBox.Text + "%"); if (cityTextBox.Text.Length & 0)  query.AddWhere("City", Comparison.Like,  cityTextBox.Text + "%"); if (countryComboBox.SelectedItem != null)  query.AddWhere("Country", Comparison.Equals,  countryComboBox.SelectedItem);  string statement = query.BuildQuery();  // or, have a DbCommand object built  // for even more safety against SQL Injection attacks:  query.SetDbProviderFactory(  DbProviderFactories.GetFactory(  "System.Data.SqlClient"));  DbCommand command = query.BuildCommand();  你能看到,这种方式比直接使用连接字符串更直观。考虑到第一个例子SQL注入的危险,通过SelectQueryBuilder建立的SELECT查询是非常安全的,并不用担心使用的TextBoxs中的内容。事实上它也非常简单!  使用SQL函数  如果你想在你的查询中使用SQL函数,你能使用SqlLiteral类来打包函数的调用。说明这个类能作什么的最好方式就是给你显示一小段代码例子:
SelectQueryBuilder query = new SelectQueryBuilder();query.SelectFromTable("Orders");query.AddWhere("OrderDate", Comparison.LessOrEquals,new SqlLiteral("getDate()"));  如果我们没有打包getDate()函数调用到SqlLiteral类中,建立的查询就会产生WHERE子句:OrderDate&=’getDate()’。当然,我们希望在语句中的这个函数没有被单引号包围。这时SqlLiteral就可以派上用场了:它直接拷贝字符串到输出,并没有把它格式化成字符串。现在的输出WHERE子句应当是OrderDate&=getDate()!  查询中使用JOINs  要创建到其它表的JOINs,你能使用AddJoin方法。下面的代码显示了如何创建一个从Ordres表到Customers表的INNER JOIN。
SelectQueryBuilder query = new SelectQueryBuilder();query.SelectFromTable("Orders");query.AddJoin(JoinType.InnerJoin,"Customers", "CustomerID",Comparison.Equals,"Orders", "CustomerID");query.AddWhere("Customers.City",Comparison.Equals, "London");  这段代码选择所有居住在London的客户的订单。一旦调用了BuildQuery方法,就会产生下面的SQL语句:
SELECT Orders.*FROM OrdersINNER JOIN Customers ON Orders.CustomerID = Customers.CustomerIDWHERE (Customers.City = 'London')  注意到缺省的查询只会建立所选择的表的selects * 语句(这个例子中的Orders.*)。如果你也想选择连接表的列的话,你必须得显式地选择它们。你能调用query.SelectColumns(“Orders.*”,”Customers.*”)。
  建立计算查询  如果你想对你的数据库执行一个计算查询。你能使用SelectCount方法如同下面显示的:  Query.SelectCount();  在更加复杂的计算查询中,你可能想使用GROUP BY语句。看一下下面的例子,它显示了如何使用GroupBy和AddHaving方法。
SelectQueryBuilder query = new SelectQueryBuilder();query.SelectColumns("count(*) AS Count", "ShipCity");query.SelectFromTable("Orders");query.GroupBy("ShipCity");query.AddHaving("ShipCity", Comparison.NotEquals, "Amsterdam");query.AddOrderBy("count(*)", Sorting.Descending);  上面的代码选择了每个城市的订单数,并用订单数目排序,不考虑来自制Amsterdam的订单,BuildQuery方法的输出结果应当是:
SELECT count(*) AS Count, ShipCityFROM OrdersGROUP BY ShipCityHAVING (ShipCity && 'Amsterdam')ORDER BY count(*) DESC  复杂的Where语句  如果你曾经用过的Access或SQL Server的内置的查询生成器的话,是否惊讶你能建立和代码一样的包含多层ANDs和Ors,并没有关心()符号的位置的查询?是的?我也能!  你能使用SelectQueryBuilder类实现!你能加多层的WHERE语句到你的查询。缺省,所有对query.AddWhere的调用被放在查询的第一层上。你可以把它比作SQL Server查询生成器的’Criteria’列;第二、三、四层等相应地对应于’Or…’列。  看一下下面的SQL Server查询生成器的快照,通过它我能快速地把简单的假的SELECT语句放在一起来:  如你看到的,我创建一个查询,它选择所有在1-1-2005日期之前的客户’VINET’的订单,和所有30-6-2004日期之前或1-1-2006日期之后的客户’TOMSP’的订单(请不要问为什么有人想查询某个人的订单,这仅仅是一个 例子)。这个查询能够建立:
SelectQueryBuilder query = new SelectQueryBuilder();query.SelectFromTable("Orders");// Add 'Criteria' column to level 1query.AddWhere("CustomerID", Comparison.Equals,"VINET", 1);query.AddWhere("OrderDate", Comparison.LessThan,new DateTime(), 1);// Add first 'Or...' column to level 2query.AddWhere("CustomerID", Comparison.Equals, "TOMSP", 2);query.AddWhere("OrderDate", Comparison.LessThan,new DateTime(), 2);// Add second 'Or...' column to level 3query.AddWhere("CustomerID", Comparison.Equals,"TOMSP", 3);query.AddWhere("OrderDate", Comparison.GreaterThan,new DateTime(), 3);  当调用 BuildQuery时,所有定义的层将被OR到一起,几乎和SQL Server生成的一样。  如果你到所产生的语句接近一样时,想让查询更复杂,你可能会说“我的放两个随后的语句一起放在一个语句中,在两个日期间使用OR”。你能够这样作。在SQL Server查询生成器中,这个查询看起来像:  同样,它也可能使用SelectQueryBuilder通过创建’嵌套的WHERE子句’来实现。
SelectQueryBuilder query = new SelectQueryBuilder();query.SelectFromTable("Orders");// Add 'Criteria' column to level 1query.AddWhere("CustomerID", Comparison.Equals, "VINET", 1);query.AddWhere("OrderDate", Comparison.LessThan,new DateTime(), 1);// Add 'Or...' column to level 2query.AddWhere("CustomerID",Comparison.Equals, "TOMSP", 2);// Add the date selection clauseWhereClause clause =query.AddWhere("OrderDate", Comparison.LessThan,  new DateTime(), 2);// Add a nested clause to the captured clauseclause.AddClause(LogicOperator.Or,Comparison.GreaterThan, new DateTime());  注意到我用了一个WhereClause对象,它由AddWhere调用返回。接着调用clause.AddClause创建一个嵌套的子句柄,并且选择通过指定LogicOperator.Or来把它OR到第一个子句上。所产生的语句如下:
SELECT Orders.*FROM OrdersWHERE( (CustomerID = 'VINET') AND (OrderDate & ' 12:00:00'))OR( (CustomerID = 'TOMSP') AND (OrderDate & ' 12:00:00' OR OrderDate & ' 12:00:00'))  请注意这个例子中日期包含’12:00:00’,这是因为我在DateTime构造体中忽略了时间。但这只要由于我的习惯。如果我使用new DateTime(,0,0,0),日期字符串将包含’00:00:00’。  结论  在介绍中我就提到,SelectQueryBuilder是CodeEngine框架的一部分。这个框架 也包含了DeleteQueryBuilder,UpdateQueryBuilder,InsertQueryBuilder。我在通过我的#DAL产生器生成的代码中使用这些生成器。你能从www.上下载一份 框架DLL的拷贝。在这期间我也将发布其它的查询生成器的源代码。同时如果你有什么问题,评价或建议,请及时与我联系。
(作者:蒋涛责任编辑:方舟)
欢迎在新浪微博上关注我们

我要回帖

更多关于 复杂sql 语句编写经验 的文章

 

随机推荐