2017-10-24 2 views
0

クエリ文字列を埋めるためのパラメータを受け取る "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に変換することができませんか?」

どうすればこの問題を解決できますか?これを行うにはより良い方法がありますか?

+4

クエリに文字列連結を使用しないで、代わりにパラメータ付きクエリを使用します。これにより、コードがSQLインジェクション攻撃に対して脆弱でないことが保証されます。入力パラメータの1つが 'null'のときにパラメータ値として' System.DBNull.Value'を渡すことができるので、あなたの問題も解決します。 – Igor

+0

'model'は' SqlCommand'のインスタンスですか? – Igor

+0

@Igorいいえ、それは私が書いたクラスです。私はパラメータ化されたクエリについて読んでいます。実際に私は文字列連結がSQLインジェクションのために脆弱であることを知っていましたが、これは文字通りデータベースを扱う私の初めてのことです。 –

答えて

4

あなたのコードは、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 }); 
} 
+0

これはあなたが使用しなければならない 'SqlParameter'のコンストラクタではありません。渡された値から型を推測するので、非常に混乱する動作を引き起こす可能性がありますが、渡される値は型がない 'null'でもかまいません。 (私が以前に含んでいたリンクは良いものではありませんでした。無視して、今編集しました) – hvd

+0

私はモデルクラスを自分で書いています。したがって、関数Exec​​uteNonQueryは文字列をパラメータとして取ります。あなたの提案された方法にはどのようなパラメータが適していますか? –

+1

次に、ExecuteNonQueryを修正する必要があります。 SqlCommand.ExecuteNonQueryがパラメータを取る理由があります。 – ikegami

関連する問題