クエリ文字列を埋めるためのパラメータを受け取る "InsertEmpolyee"という関数があります。問題は、これらの変数の一部をオプションにしたい、つまり、これらのパラメータに値を渡さずに関数を呼び出し、データベースにNULLを挿入して正しいクエリ文字列を作成できるようにしたいと考えています。クエリ文字列に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に変換することができませんか?」
どうすればこの問題を解決できますか?これを行うにはより良い方法がありますか?
クエリに文字列連結を使用しないで、代わりにパラメータ付きクエリを使用します。これにより、コードがSQLインジェクション攻撃に対して脆弱でないことが保証されます。入力パラメータの1つが 'null'のときにパラメータ値として' System.DBNull.Value'を渡すことができるので、あなたの問題も解決します。 – Igor
'model'は' SqlCommand'のインスタンスですか? – Igor
@Igorいいえ、それは私が書いたクラスです。私はパラメータ化されたクエリについて読んでいます。実際に私は文字列連結がSQLインジェクションのために脆弱であることを知っていましたが、これは文字通りデータベースを扱う私の初めてのことです。 –