Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/273.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/69.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在sql中使用“if”_C#_Sql_Sql Server Express - Fatal编程技术网

C# 在sql中使用“if”

C# 在sql中使用“if”,c#,sql,sql-server-express,C#,Sql,Sql Server Express,我的应用程序中有一个搜索字段,我正在使用SQL 我的应用程序有3个独立的组合框,允许用户选择他/她想要搜索的内容 例如,我们在搜索字段中有姓名、姓氏和年龄,我想选择20岁的人或20岁的人,并命名为john或其他州 那么我应该使用IF,ELSE,WHERE的一般过程来支持所有这些状态吗?sql中IF-ELSE的语法是 IF yourconditon BEGIN //sql query END ELSE BEGIN //sqlquery End 假设变量@Age、@Name

我的应用程序中有一个搜索字段,我正在使用SQL

我的应用程序有3个独立的组合框,允许用户选择他/她想要搜索的内容

例如,我们在搜索字段中有姓名、姓氏和年龄,我想选择20岁的人或20岁的人,并命名为john或其他州


那么我应该使用IF,ELSE,WHERE的一般过程来支持所有这些状态吗?

sql中IF-ELSE的语法是

IF yourconditon
BEGIN
  //sql query
END
ELSE
  BEGIN
     //sqlquery
   End
假设变量@Age、@Name和@FamilyName


不需要做if。但是,如果您想在sql中执行if,则是WHEN THEN ELSE END

如何在数据库中执行sql? 它是数据库中的存储过程,还是只向数据库发送sql语句


如果是第二个,只需在c代码中执行If-then-else,并将不同的sql语句发送到数据库。

您应该做的是根据用户的选择在windows项目中创建sql

StringBuilder mySQL = new StringBuilder();

if(Name != "")
  mySQL.Append("Name like '%" + Name + "'%");

if(mySQL != "" && (familyName != "" || age != ""))
  mySQL.Append(" AND");

if(familyName != "")
  mySQL.Append(" familyName like '%" + familyName + "%');
然后继续你的其他状况。 将stringbuilder字符串附加到SELECT查询

string finalSQL = "SELECT * FROM MyTable WHERE " + mySQL.toString();

您有一些不同的选择,并会一如既往地建议进行性能测试

动态SQL。 根据所使用的参数动态构建SQL,因此

declare sqlTxt VARCHAR(max)
delcare params VARCHAR(128)

params = 'Age INT, Name VARCHAR(128), FamilyName VARCHAR(128)'
sqlText = 'SELECT field Name From Table WHERE 1=1'

IF (IS NOT NULL) sqlText += 'AND Age == @Age '
IF (IS NOT NULL) sqlText += 'AND Name LIKE %@Name%'
IF (IS NOT NULL) sqlText += 'AND FamilyName LIKE %FamilyName%'

EXEC sp_executesql @sqlText, @params, @Age = @Age, @Name = @Name, @FamilyName = @FamilyName
SQL中的句柄 使用Eli Gassert发布的解决方案

一般来说,对于较小的查询,您可以使用选项2,但如果您扩展搜索范围以包含许多不同的参数,请注意“参数嗅探”,这可能会降低您的速度


基本上,如果性能是一个问题,则测试两种方法。

你知道吗?你自己说过,只需稍微更改一下英语的语法:age=20或age=20,name='John'。从逻辑上讲,这与age=20或name='John'相同。从name=@name and Family=@Family and age=@age的表中选择*并从组合框中传递值。你试过什么?从字里行间读出他想做什么。在我看来,他想搜索,但只有在组合框中填好的情况下。如果是,则过滤。我可能弄错了,但如果不是这样的话,它应该简单到:tnx Eli它是有用的nice SQL注入孔,那么他仍然需要验证用户输入的内容以防止出现这种情况,但这不是问题!!不,您不会通过验证输入来修复注入;您可以通过使用参数来修复注入—这显然不是本文所示的内容。上面显示的代码是非常危险的,应强烈劝阻。如果您的代码验证用户输入的内容,然后使用串联,那么您的代码从根本上就被破坏了。好吧,我理解您关于它是vunerabily的观点,但它从根本上被破坏是什么意思?一种非常非常危险、无法使用正确类型的数据的组合会影响索引和解析,无法重复使用查询计划,所有这些都是完全不必要的,可以避免的;对我来说,这听起来很糟糕。不清楚这里的文字从哪里开始和结束;这很重要,因为您可能正在创建一个SQL注入孔,或者您可能在文本中包含参数名,并使用sq_executesql,这很好,但这行不通。如果用户不想通过这三个选项中的任何一个进行过滤,会发生什么?现在我认为没有必要进行ifTnX@CathalMF那么这三个都将被忽略。所有三个变量都将为NULL,这将满足所有三个OR语句的前一半,因此不进行任何筛选。那么,当用户要求全部时,我该怎么办?例如,在年龄组合框中,用户选择全部以查看每个年龄段的所有人???我的意思是,在这种情况下,我应该只搜索姓名和姓氏,年龄并不重要。我说的对吗?是的,这是一个存储过程
declare sqlTxt VARCHAR(max)
delcare params VARCHAR(128)

params = 'Age INT, Name VARCHAR(128), FamilyName VARCHAR(128)'
sqlText = 'SELECT field Name From Table WHERE 1=1'

IF (IS NOT NULL) sqlText += 'AND Age == @Age '
IF (IS NOT NULL) sqlText += 'AND Name LIKE %@Name%'
IF (IS NOT NULL) sqlText += 'AND FamilyName LIKE %FamilyName%'

EXEC sp_executesql @sqlText, @params, @Age = @Age, @Name = @Name, @FamilyName = @FamilyName