ExecuteNonQuery未运行

时间:2017-11-16 08:14:03

标签: c# asp.net sql-server

foreach (GridViewRow g1 in GridView1.Rows)
{
      SqlCommand cmd = new SqlCommand("INSERT INTO Order VALUES(@buyersName, @deliveryAddress, @productID, @productName, @category, CONVERT(VARBINARY(MAX), @image), @price, @paymentMode, @holderName)", con);

      cmd.Parameters.AddWithValue("@buyersName", Label2.Text);
      cmd.Parameters.AddWithValue("@deliveryAddress", TextBox1.Text);
      cmd.Parameters.AddWithValue("@productID", g1.Cells[0].Text);
      cmd.Parameters.AddWithValue("@productName", g1.Cells[1].Text);
      cmd.Parameters.AddWithValue("@category", g1.Cells[2].Text);
      cmd.Parameters.AddWithValue("@image", g1.Cells[3].Text);
      cmd.Parameters.AddWithValue("@price", g1.Cells[4].Text);
      cmd.Parameters.AddWithValue("@paymentMode", checkRadioButton());
      cmd.Parameters.AddWithValue("@holderName", TextBox2.Text);

      int r = cmd.ExecuteNonQuery();
 }

当我运行此代码时,它显示错误,即" Order"附近存在语法错误。 checkRadioButton()正在返回所选RadioButton的标签。

2 个答案:

答案 0 :(得分:3)

你不能在VALUE ()

中使用convert()这样的表达式

更改使用

INSERT INTO [Order] (column name, ...) 
select @buyersName, convert() ,...

顺便说一下,你应该在INSERT子句中明确指定列名,或者在向表中添加列时,你的查询将会中断

为什么还使用保留名称作为表名?

答案 1 :(得分:0)

与其他答案中的陈述相反,应该可以在CONVERT - 部分内VALUES。 但是有许多缺陷或事情可以改进:

  1. ORDERreserved word in sql server,放在方括号中:[Order]
  2. 不要使用AddWithValue否则sql server会推断数据类型,这可能会有问题。请改用Add。有关详细信息,请参阅here
  3. 您可以在设置参数值之前将g1.Cells[3].Text的值转换为字节数组(byte[])。要转换为byte[],请参阅here
  4. 指定查询中的列,以便在将来更改表时不会将其分解
  5. 更改您的代码如下(列名和数据类型可能有所不同):

    SqlCommand cmd = new SqlCommand(@"INSERT INTO [Order] (buyersName, deliveryAddress, productID, productName, category, image, price, paymentMode, holderName) 
                                      VALUES(@buyersName, @deliveryAddress, @productID, @productName, @category, @image, @price, @paymentMode, @holderName)", con);
    
    cmd.Parameters.Add("@buyersName", SqlDbType.VarChar).Value = Label2.Text;
    cmd.Parameters.Add("@deliveryAddress", SqlDbType.VarChar).Value = TextBox1.Text;
    cmd.Parameters.Add("@productID", SqlDbType.VarChar).Value = g1.Cells[0].Text;
    cmd.Parameters.Add("@productName", SqlDbType.VarChar).Value = g1.Cells[1].Text;
    cmd.Parameters.Add("@category", SqlDbType.VarChar).value = g1.Cells[2].Text;
    cmd.Parameters.Add("@image", SqlDbType.VarBinary).Value =  g1.Cells[3].Text; //convert g1.Cells[3].Text to a byte array
    cmd.Parameters.Add("@price", SqlDbType.Money) = g1.Cells[4].Text;
    cmd.Parameters.Add("@paymentMode", SqlDbType.VarChar).Value = checkRadioButton();
    cmd.Parameters.Add("@holderName", SqlDbType.VarChar).Value = TextBox2.Text;
    int r=cmd.ExecuteNonQuery();