在查询字符串中传递NULL值

Say*_*awy 0 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);
}
Run Code Online (Sandbox Code Playgroud)

这就是我如何称呼它.

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

我试图做以下事情

if (!Salary.HasValue)
            Salary = DBNull.Value;
Run Code Online (Sandbox Code Playgroud)

但它给我以下错误"不能隐式地将system.DBNull转换为int?"

我怎样才能解决这个问题?还有更好的方法吗?

ike*_*ami 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 });
}
Run Code Online (Sandbox Code Playgroud)