C# 具有空值的SQL Server查询

C# 具有空值的SQL Server查询,c#,sql,sql-server,null,C#,Sql,Sql Server,Null,在我的C代码中,我必须执行如下SQL查询: context.ExecuteStoreQuery("SELECT * FROM MyTable WHERE Field0 = {0} AND Field1 = {1}", field0, field1) 当field1=null(在c中)和null(在数据库中)时,此查询不起作用。我必须对IS NULL使用不同的语法 我如何在不做假设的情况下纠正这个问题?事实上,我有10个字段 您可以使用if语句的简短变体。 如果没有if声明,我认为你无

在我的C代码中,我必须执行如下SQL查询:

context.ExecuteStoreQuery("SELECT * FROM MyTable WHERE Field0 = {0} AND 
    Field1 = {1}", field0, field1)
当field1=null(在c中)和null(在数据库中)时,此查询不起作用。我必须对IS NULL使用不同的语法


我如何在不做假设的情况下纠正这个问题?事实上,我有10个字段

您可以使用if语句的简短变体。 如果没有if声明,我认为你无法处理你的问题。 例如:

还可以使用@ParameterName参数化查询

context.ExecuteStoreQuery<ProductionUnit>(
  String.Format("SELECT * FROM MyTable WHERE Field0 {0} @Parameter1",
  value==null ? "IS", "="), new SqlParameter("@Parameter1", value));
问候

public string appendCondition(String sqlQuery, String field, Object value)
{ 
 string resultQuery = sqlQuery + " " + value == null ? " IS NULL " : "=" + value.ToString();
 return resultQuery;
}

希望您可以添加简单的逻辑来添加WHERE或AND。默认情况下,SQL server不允许您将值与null进行比较。所有的比较结果都是错误的,即使是逻辑上相反的。换句话说,您可以执行以下操作:

其中字段=1,其中字段1。如果字段为空,则两者在逻辑上都解析为false

在任何情况下,都需要在查询中显式检查null:

context.ExecuteStoreQuery(@"SELECT * FROM MyTable WHERE 
    (Field0 = {0} or (Field0 is null and {0} is null))  AND 
    (Field1 = {1} or (Field1 is null and {0} is null))", field0, field1)

我要做的第一件事就是删除select*。糟糕

我要做的第二件事是把它变成一个存储过程

    create procedure dbo.MyTableSelect
    @field0 int,
    @field1 int=null
as
begin

    select
        *
    from MyTable
    where Field0=@field0
        and (@field1 is null or Field1=@field1)



end
然后,您可以将代码更改为

context.ExecuteStoreQuery("exec dbo.MyTableSelect @field0={0}, @field1 = {1}", field0, field1) 

SQL注入的时机似乎已经成熟@Oded:ObjectContext.ExecuteStoreQuery与string.Format不同,尽管语法相似。ObjectContext.ExecuteStoreQuery自动参数化查询。@Adam Robinson-感谢您提供的信息。我会把我之前的评论留在这里,这样你的信息就会被放在上下文中:这么多事情都错了。。。时间太少了…有趣的方法。{1} 当然仍然可以参数化您将有NullReferenceException,因为String.Format将调用value.ToString,即使第一个条件将返回true。@水泥:您可以将null传递给String.Format,尽管此设计在这种特定情况下不起作用。用户正在使用的ObjectContext.ExecuteStoreQuery不仅仅是一个字符串格式函数,因为它使用提供的值自动参数化查询。这种方法不会产生有效的SQL。@亚当·罗宾逊:感谢您的澄清。@亚当·罗宾逊:感谢您的良好反馈。我已经更新了我的帖子。`AND[_-TYPE]=CASE当NULL为NULL时,那么[_-TYPE]ELSE@TYPE END`这在SQL Server 2008中运行良好,这让我非常恼火,因为它不能在C SQL字符串中使用。
context.ExecuteStoreQuery("exec dbo.MyTableSelect @field0={0}, @field1 = {1}", field0, field1)