2013-07-29 72 views
0

嘗試從文本框中插入數據庫,但它只接受整數而不是字符 - 問題可能是什麼?無法將文本框中的字符值插入數據庫

string sCMD = string.Format("INSERT INTO [Table] ([Item], [Des1],[Des2], [Prodline], [ANR], [STime]) VALUES({0},{1},'0',{2},{3},{4})" 
      ,txtText1.Text, txtText2.Text, txText3.Text, txtText4.Text, txtText5.Text); 

在此上下文中不允許使用名稱「」。有效表達式是常量,常量表達式和(在某些情況下)變量。列名不被允許。

+0

數據庫表中的列是什麼? –

+1

想象一下,如果用戶在文本框中輸入「some」值「e」,會發生什麼情況。 –

+0

你的數據庫允許在特定列上使用char/varchar嗎?你在用什麼數據庫? – butterbox

回答

0

這裏的東西來考慮:

using (SqlConnection c = new SqlConnection(connString)) 
{ 
    c.Open(); 

    using (SqlCommand cmd = new SqlCommand("INSERT INTO [Table] ([Item], [Des1],[Des2], [Prodline], [ANR], [STime]) VALUES(@Item,@Des1,'0',@ProdLine,@ANR,@STime)", c)) 
    { 
     cmd.Parameters.AddWithValue("@Item", txtText1.Text); 
     cmd.Parameters.AddWithValue("@Des1", txtText2.Text); 
     cmd.Parameters.AddWithValue("@ProdLine", txText3.Text); 
     cmd.Parameters.AddWithValue("@ANR", txtText4.Text); 
     cmd.Parameters.AddWithValue("@STime", txtText5.Text); 

     cmd.ExecuteNonQuery(); 
    } 
} 

如果你要送你正在構建到服務器時,它可能看起來像這樣的SQL語句:

INSERT INTO [Table] ([Item], [Des1],[Des2], [Prodline], [ANR], [STime]) 
VALUES(Item Name,Here is my description.,'0',Prod line,ANR value,some time) 

顯然那將失敗。它甚至沒有用單引號括起這些值。現在,他們都可能不是性格,我明白了,但你明白我的觀點。

但是,爲了增加對傷害的侮辱,可以按照你寫的方式打開SQL Injection。使用參數化方法不是。

0

這是一個非常危險的代碼行。

對於初學者,您正在爲值創建一個沒有分隔符的字符串,這意味着可以通過的唯一值是整數。還有其他的東西需要分隔,你不會在這個String.Format語句中做。

更糟糕的是,您嘗試從直接用戶輸入創建sql語句。任何奇怪的值都可能導致代碼失敗,或者更糟糕的是,導致執行不需要的代碼。想象一下,用戶輸入的內容會發生什麼,例如'sdf','sdfs',sdf'作爲FIRST值。結果字符串對於來自第一個textboxt的前三列有3個正確的值。

現在圖像如果用戶輸入了類似'blablabla';DROP TABLE sometable;--的東西,會發生什麼情況。這將導致執行Delete命令。這是一種標準的SQL注入攻擊情形。

還有很多問題,例如當您嘗試將數字與浮點數,日期或任何類型的轉換爲字符串取決於您的區域設置。

而不是嘗試通過字符串連接構造SQL查詢,您應該使用參數化查詢,如Give me parameterized SQL or give me death中所述。結果代碼更容易編寫,執行速度更快,沒有轉換錯誤並且不受SQL注入攻擊,

相關問題