C#学习教程:SqlDataSource中的动态WHERE子句我允许用户通过文本框为SDS的选择命令设置多个搜索参数,每个参数一个文本框(想想txtFirstName、txtLastName等)。我打算使用按钮单击事件处理程序来设置SqlDataSource的SelectCommand属性,默认情况下它将返回所有记录(出于我的目的)。我想改进此选择命令,可能会添加一个或多个WHERE子句,具体取决于用户是否在我的任何文本框中输入搜索条件。我不清楚的示例:默认情况下,我的SqlDataSource的SelectCommand属性将如下所示:SELECT*FROMMyTable如果用户在txtFirstName中输入“Bob”,我希望SelectCommand属性如下所示:SELECT*FROMMyTableWHERE[FirstName]='Bob'如果用户在txtLastName中输入“Jones”,我希望SelectCommand属性如下所示:SELECT*FROMMyTableWHERE[FirstName]='Bob'AND[LastName]='Jones'我的问题:有没有办法动态创建这些WHERE子句,而我不必测试空文本框并手动构建WHERE子句?我的小应用程序只有三个参数,所以暴力破解它不会很痛苦,但我想知道是否有更简单的方法来做到这一点,而且我将来可能需要添加更多参数。另外,我可能想添加通配符搜索。正如您所说,构建该查询并不困难,因为您总是AND和where子句中的字段。请注意,如果您这样做,请不要格式化字符串。使用SqlParameters避免SQL注入:http://en.wikipedia.org/wiki/SQL_injection所以你可以从WHERE开始,对于每个有值的文本框,附加[(fieldName)]=@(fieldname)并绑定设置sql参数.请参阅:http://msdn.microsoft.com/en-us/library/system.data.sqlclient.sqlparameter.aspx如果您愿意使用LinqtoSQL或实体框架,请参阅此谓词生成器:http://www.albahari.com/nutshell/predicatebuilder.aspx如果您使用的是SqlDataSource控件并且参数值来自页面控件,您可以提供ControlParameters并使用带有短路参数的静态where子句。这可能只是快速破解某些代码的门票。"SelectCommand="SELECTFirstName,LastName,AgeFROMContactsWHERE(FirstName=@FirstNameor@FirstName='')AND(LastName=@LastNameor@LastName=''AND(Age=@Ageor@Age=0">您可以设置ConvertEmptyStringToNull="false"并执行:SELECT*FROMMyTableWHERE[FirstName]=CASE@firstnameWHEN''THEN[FirstName]ENDAND[LastName]=CASE@lastnameWHEN''THEN[LastName]END或者您可以设置ConvertEmptyStringToNull="true"并执行:SELECT*FROMMyTableWHERE[FirstName]=ISNULL(@firstname,[FirstName])AND[LastName]=ISNULL(@lastname,[LastName])在其中任何一个中,如果用户愿意文本框留空,然后CASE或ISNULL语句ISNULLwhere语句的每个部分都与自身进行比较,它返回TRUE并产生相同的记录,就好像where子句的那部分根本不存在一样。这是一个不-brainer使用该解决方案,您可以保持查询和参数静态,并将逻辑推送到SQL端。但是,与只说“SELECT*FROMMyTable”相比,它会对性能产生(小的)影响。那些CASE和ISNULL操作不是免费的;)如果这是一个问题,Bryanmac的解决方案是完全可以接受的。您可以使用CancelSelectOnNullParameter=false,如本例所示。以上就是C#学习教程:SqlDataSource中动态WHERE子句分享的全部内容。如果对大家有用,需要进一步了解C#学习教程,还望大家多加关注——本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处:
