2013-02-13 124 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