2011-10-19 35 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(); 

大多數項目我見過的第一個選項...有什麼用使用合格值參數?通過使用參數傳遞值的任何優點?您的建議PLZ ..

回答

8

你不必關心引用特殊字符。如果您忘記引用SQL注入攻擊是可能的。

如果您使用選項2和一個輸入以下爲Textbox3

'); DELETE * FROM table_name; -- 

下面的SQL語句excecuted:

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

第二條語句從table_name刪除每一行。可以在那裏插入任何可能的陳述而不是刪除陳述。

+0

+1最佳答案。 – Curt

0

你應該NEVER使用選項2.

這是非常不好的做法,以及SQL注入非常開放。

始終與選項1堅持這是迄今爲止最好的選擇。

這裏閱讀更多信息SQL注入: http://en.wikipedia.org/wiki/SQL_injection

+0

非常感謝你的回覆 –

1

幾個原因:

  • 你不必擔心逃避特殊字符(如'),以避免SQL錯誤或SQL注入(由H-男士二解釋)。
  • 您不必擔心將C#類型轉換爲SQL類型。例如:
    • 如果您的NumberDecimalSeparator等於逗號,並且您想要在數據庫中插入Double值,則通常必須用點代替逗號。不需要擔心參數。
    • 既不需要擔心DateTime格式。
    • ...
  • 我覺得也代碼更易讀,更容易與參數,以保持當你的SQL查詢開始有一個偉大的長度。
相關問題