2011-10-19 11 views
1

オプション1:この値では、パラメータになぜパラメータを使用して値を渡すのですか?

string insertstr = "INSERT INTO table_name(eid, eName, Dept) " + 
        "VALUES(@eid, @eName, @dept)"; 

SqlCommand cmd = new SqlCommand(insertstr, con); 

cmd.Parameters.Add("@eid", SqlDbType.Int).Value = Convert.ToInt32(textBox1.Text); 
cmd.Parameters.Add("@ename", SqlDbType.VarChar, 50).Value = textBox2.Text.ToString(); 
cmd.Parameters.Add("@dept", SqlDbType.VarChar, 100).Value = textBox3.Text.ToString(); 

オプションを使用して挿入されている2:

SqlCommand cmd = new SqlCommand("INSERT INTO table_name(eid,eName,Dept) values('"+ textBox1.Text +"','"+ textBox2.Text +"','"+ Textbox3.Text +"'", con); 
cmd.ExecuteNonQuery(); 

私は第一のオプションを見ていたプロジェクトのほとんどは...使用して値を渡すの使用は何ですかパラメーター??パラメータを使用して値を渡すことによる利点?

答えて

8

特殊文字を引用符で囲む気にする必要はありません。あなたはSQLインジェクション攻撃を引用することを忘れている場合は可能です。

あなたはオプション2を使用し、もう1つはTextbox3

'); DELETE * FROM table_name; -- 

に次を入力した場合、次のSQL文がexcecutedされています

INSERT INTO table_name(eid,eName,Dept) values ('value1','value2',''); 
DELETE * FROM table_name; -- ') 

2番目のステートメントはtable_nameからすべての行を削除します。 deleteステートメントの代わりに、可能なステートメントをそこに挿入することができます。

+0

+1ベストアンサー。 – Curt

0

あなたはNEVER使用オプション2

は、これは非常に悪い習慣で、SQLインジェクションに非常にオープンする必要があります。

常にオプション1を使用してください。これは、これまでのところ最適なオプションです。 SQLインジェクションの詳細については、こちらをお読み

http://en.wikipedia.org/wiki/SQL_injection

+0

あなたのご返信ありがとうございました –

1

いくつかの理由:

  • あなたは、SQLエラーまたはSQLインジェクションを防ぐために特殊文字('等)をエスケープする心配する必要はありません(H-Man2によって説明されるように)。
  • C#型をSQL型に変換することを心配する必要はありません。たとえば、
    • NumberDecimalSeparatorがカンマ,で、データベースにDoubleという値を挿入する場合は、通常、カンマをポイントで置き換える必要があります。パラメータについて心配する必要はありません。
    • DateTimeの形式は心配する必要はありません。あなたのSQLクエリは、偉大な長さを有するように起動したときに
    • ...
  • は、私はまた、パラメータを維持するためにコードをより読みやすくかつ容易に見つけます。
関連する問題