在查询字符串中传递 NULL 值

Passing NULL values in a query string

我有一个名为 "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;

但是它给了我以下错误"Can't implicitly convert system.DBNull to int?"

我该如何解决这个问题?有没有更好的方法来做到这一点?

您的代码不仅在 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 });
}