2015-09-04 60 views
0

我有一个类:传递null到一个SQL命令

public class Intlist 
{ 
    public int yesFlag{ get; set; } 
    public int? noFlag { get; set; } 
} 

我需要更新数据库表,但有时值为null的可空整数。我使用

CommandText = @"UPDATE thetable 
       SET Yes = " + list.yesFlag + 
        ",NoFlag = " + (list.previous == null) ? DBNull.Value : list.previous + 
        ",NextValue = 10" 

我想要得到它,这样,如果noFlag为null,它进入数据库空,但我发现了错误:

无法隐式转换类型'串”到‘布尔’

类型条件表达式不能确定,因为有 'System.DBNull'和'string'之间没有隐式转换

+2

不使用参数? – Sayka

+0

使用您正在使用的命令无法将DBNull传递到SQL中。尝试使用“NULL”作为值。 – Jason

回答

4

Sayka已经达到目标。 使用参数

您不仅可以保护数据库免受SQL注入攻击,还可以利用.Nets内置的功能来处理这些类型的问题。

CommandText = @"UPDATE thetable SET Yes = @yesFlag, NoFlag = @noflag, NextValue = 10"; 
    Command.Parameters.AddWithValue("@yesFlag", list.yesFlag); 
    Command.Parameters.AddWithValue("@noFlag", list.previous); 
+0

这绝对是最干净的解决方案。 – jwueller

+0

我改变了它,但现在我'期待参数'@noFlag',它没有提供。'因为它的空 – rigamonk

+1

尝试创建参数,然后传入值或DBNull.Value(如果值为null)。然后将参数添加到参数集合中。 - >“SqlParameter noFlag = new SqlParameter(”@ noFlag“,SqlDbType.Int); noFlag.Value =(object)list.previous ?? DBNull.Value; cmd.Parameters.Add(noFlag);” –

1

强烈建议使用参数。但在你的情况下,你只需输入'Null'。它会工作。

CommandText = @"UPDATE thetable SET Yes = " + 
      list.yesFlag.ToString() + ",NoFlag = " + (list.previous == null 
      ? "NULL" : list.previous) + ",NextValue = 10"; 

该查询将会保持原样。

+0

@cubrr是正确的。这不会编译。做'(list.previous == null?“NULL”:list.previous)'而不是。 – jwueller

+0

我得到了“无法确定条件表达式的类型,因为'string'和'int?'之间没有隐式转换。 \t“error – rigamonk

+0

您已经在该类中声明了yes标志,因此您可能需要使用.ToString()。看到我更新的答案 – Sayka