2013-02-13 123 views
0

我一直在試圖插入一個特定的數據到我的數據庫(在我的情況下,它是爲Microsoft Access), 這是下面的代碼我使用C#中寫道:INSERT INTO statment錯誤

string sql = "Insert into Orders(User,PID,PName,Price,Amount)" + 
      " values('" + od.User + "','" + od.Pid + "','" + 
      od.Pname + "','" + od.Price + "','" + od.Amount + "')"; 

現在我假設我寫的形式非常好,不是嗎? 我得到的錯誤是:

INSERT INTO語句中的語法錯誤。

string sql = "Insert into Orders([User],PID,PName,Price,Amount) values(@user, @pid, @pname, @price, @amount)"; 

..here you will need to add your parameters to your command 

這既避免了SQL注入攻擊,防止錯誤使用轉義字符:所以你使用參數化命令

+1

是否有可能你的任何值有單引號在他們? – 2013-02-13 18:07:32

+0

'od'的來源是什麼?數據庫表中的所有這些列字符串?在第一個問題上,如果它是一個用戶,你可能有Sql注入漏洞。正如@Mike所認爲的那樣,以任何方式查看參數化查詢,因爲這樣也可以處理輸入中的嵌入式單引號。第二,如果其中一些列是數字的,那麼您將會遇到數據類型問題。 – 2013-02-13 18:07:39

+3

爲什麼不在創建插入查詢時使用@Parameters,然後使用'command.Parameters.AddWithValues(@paramname,paramvalue);' – MethodMan 2013-02-13 18:07:41

回答

3

Userreserved keyword。用括號括起來指定要用它作爲標識符,而不是命令:

string sql = "Insert into Orders([User],PID,PName,Price,Amount)" + 
     " values('" + od.User + "','" + od.Pid + "','" + 
     od.Pname + "','" + od.Price + "','" + od.Amount + "')"; 

這應該解決您的直接問題。使用參數化查詢(如幾個人所建議的)很好地避免了將來的問題。

1

更改代碼。

1

下面是一個示例,您可以按照我已粘貼的副本從我剛剛寫的 您可能想要按照此爲將來的參考請注意如何使用Parameters.AddWithValue()方法而不是構建字符串查詢字符串與Quoted values

private void btnInsert_Click(object sender, EventArgs e) 
{ 
    using(SqlConnection con = new SqlConnection(connString)) 
    { 
     con.Open(); 
     string Sql = "INSERT INTO Uyeleri (dID, FullName, Address, Mobile, Email, Comments) " + 
        "VALUES (@id, @name, @address, @mobile, @email, @comments"); 
     using(SqlCommand cmd = new SqlCommand(Sql, con)) 
     { 
      cmd.Parameters.AddWithValue("@id", txtdID.Text); 
      cmd.Parameters.AddWithValue("@name", txtAdiSoyadi.Text); 
      cmd.Parameters.AddWithValue("@address", txtAddress.Text); 
      cmd.Parameters.AddWithValue("@mobile", txtMobile.Text); 
      cmd.Parameters.AddWithValue("@email", txtEmail.Text); 
      cmd.Parameters.AddWithValue("@comments", txtComments.Text); 
      cmd.ExecuteNonQuery(); 
     } 
    } 
+0

OP的重要注意事項:這些值將以與查詢中使用的順序完全相同的順序添加到「cmd.Parameters」。 – Brad 2013-02-14 15:33:06

+0

是的,我知道他想要一個例子布拉德,所以他可以看到如何做參數化查詢.. – MethodMan 2013-02-14 17:14:09

+0

是啊,這是一個很好的例子(得到我的投票)我也認爲他應該知道順序的事情,因爲它絆倒我第一我使用這種程序。 – Brad 2013-02-14 17:17:57