在查询字符串中传递NULL值

时间:2017-10-24 21:10:18

标签: c# sql database dbnull

我有一个名为" InsertEmpolyee"接收参数以填充查询字符串。问题是,我想让这些变量中的一些变成可选的,换句话说,我希望能够在不将值传递给这些参数的情况下调用函数,并且仍然通过将NULL插入数据库来生成正确的查询字符串。

这是InsertEmployee函数

public int InsertEmployee(string FirstName, char Minit, string LastName, int SSN
 , int? Salary)
{
    string query = "INSERT INTO Employee (Fname, Minit, Lname, SSN, Salary) " +    "Values ('" + FirstName + "','" + Minit + "','" + LastName + "'," + Salary + ");";
    return model.ExecuteNonQuery(query);
}

以下是我的称呼方式。

int res = Controlobj.InsertEmployee(txtbox_FirstName.Text, txtbox_Minit.Text[0],
                   txtbox_LastName.Text, Int32.Parse(txtbox_SSN.Text), null);

我试过以下

if (!Salary.HasValue)
            Salary = DBNull.Value;

但它给了我以下错误"无法将system.DBNull隐式转换为int?"

我该如何解决这个问题?还有更好的方法吗?

1 个答案:

答案 0 :(得分:5)

您的代码不仅在null上失败,而且在包含撇号的字符串上失败。也可能存在其他陷阱。这就是我们使用参数的原因。

public int InsertEmployee(string Fname, char Minit, string Lname, int SSN, int? Salary)
{
    return model.ExecuteNonQuery(
        @"
            INSERT INTO Employee (
                       Fname, Minit, Lname, SSN, Salary
                   ) VALUES (
                       @Fname, @Minit, @Lname, @SSN, @Salary
                   )
        ",
        new SqlParameter("@Fname",  SqlDbType.VarChar) { Value = (object)Fname  ?? System.DBNull.Value },
        new SqlParameter("@Minit",  SqlDbType.VarChar) { Value =         Minit                         },
        new SqlParameter("@Lname",  SqlDbType.VarChar) { Value = (object)Lname  ?? System.DBNull.Value },
        new SqlParameter("@SSN",    SqlDbType.Int    ) { Value =         SSN                           },
        new SqlParameter("@Salary", SqlDbType.Int    ) { Value = (object)Salary ?? System.DBNull.Value });
}