我有一个名为" 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?"
我该如何解决这个问题?还有更好的方法吗?
答案 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 });
}