在c#中将文本框值添加到SQL数据库

时间:2013-04-25 13:24:47

标签: c# sql sql-server winforms

我正在尝试将文本框中的值添加到datagridview中,我之前已经问过这个问题,但我现在得到了一个不同的错误

  

INSERT语句中的列多于VALUES子句中指定的值。 VALUES子句中的值数必须与INSERT语句中指定的列数相匹配。

这是导致错误的代码

private void SaveBtn_Click(object sender, EventArgs e)
{
    SqlConnection sc = new SqlConnection();
    SqlCommand com = new SqlCommand();
    sc.ConnectionString = ("Data Source=localhost;Initial Catalog=LoginScreen;Integrated Security=True");
    sc.Open();
    com.Connection = sc; 
    com.CommandText = ("INSERT INTO Stock (Prod_ID, Prod_Name, Prod_Cat, Supplier, Cost, Price_1, Price_2, Price_3) VALUES ('"+ProdID.Text+"''"+ProdName.Text+"'+'"+ProdCat.Text+"'+'"+ProdSup.Text+"'+'"+ProdCost.Text+"'+'"+ProdPrice1.Text+"'+'"+ProdPrice2.Text+"'+'"+ProdPrice3.Text+"');");
    com.ExecuteNonQuery();
    sc.Close();
}

my database

5 个答案:

答案 0 :(得分:5)

错误的直接原因在查询的“值”部分中省略了逗号(“,”)。 你应该这样说的

VALUES ('"+ProdID.Text+"', '"+ProdName.Text+", '+'"+ProdCat.Text+", '+'"+ProdSup.Text+...

而不是

VALUES ('"+ProdID.Text+"''"+ProdName.Text+"'+'"+ProdCat.Text+"'+'"+ProdSup.Text+...

您的代码也容易受到所谓的SQL注入攻击(想象一下有人提出来了)   '“从库存中删除 - ”进入ProdID.Text:执行将导致Stock表格 间隙)

推荐的方式如下所示:

using(SqlConnection sc = new SqlConnection()) {
  sc.ConnectionString = "Data Source=localhost;Initial Catalog=LoginScreen;Integrated Security=True";
  sc.Open();

  using (SqlCommand com = sc.CreateCommand()) {
    com.CommandText =
      "insert into Stock(\n" + 
      "  Prod_Id,\n" + 
      "  Prod_Name,\n" +
      "  Prod_Cat,\n" +
      "  Supplier,\n" +
      "  Cost,\n" +
      "  Price_1,\n" +
      "  Price_2,\n" +
      "  Price_3)\n" +
      "values(\n" +
      "  @prm_Prod_Id,\n" +
      "  @prm_Prod_Name,\n" +
      "  @prm_Prod_Cat,\n" +
      "  @prm_Supplier,\n" +
      "  @prm_Cost,\n" +
      "  @prm_Price_1,\n" +
      "  @prm_Price_2,\n" +
      "  @prm_Price_3)";

    //TODO: Change my arbitrary "80" to actual Stock fields' sizes! 
    com.Parameters.Add("@prm_Prod_Id", SqlDbType.VarChar, 80).Value = ProdID.Text;
    com.Parameters.Add("@prm_Prod_Name", SqlDbType.VarChar, 80).Value = ProdName.Text;
    com.Parameters.Add("@prm_Prod_Cat", SqlDbType.VarChar, 80).Value = ProdCat.Text;
    com.Parameters.Add("@prm_Supplier", SqlDbType.VarChar, 80).Value = ProdSub.Text;
    com.Parameters.Add("@prm_Cost", SqlDbType.VarChar, 80).Value = ProdCost.Text;
    com.Parameters.Add("@prm_Price_1", SqlDbType.VarChar, 80).Value = ProdPrice1.Text;
    com.Parameters.Add("@prm_Price_2", SqlDbType.VarChar, 80).Value = ProdPrice2.Text;
    com.Parameters.Add("@prm_Price_3", SqlDbType.VarChar, 80).Value = ProdPrice3.Text;

    com.ExecuteNonQuery();
  }
}

答案 1 :(得分:3)

您的sql值部分中缺少逗号。当你做这样的事情(字符串的大连接)时,你应该知道两件事。首先,测试的一个好方法是写出console,messagebox,ext。您经常会立即看到错误。接下来要知道的是,如果你要插入数据库,那么就不要这样做。使用参数化查询。 - > How do parameterized queries help against SQL injection?

com.CommandText = ("INSERT INTO Stock (Prod_ID, Prod_Name, Prod_Cat, Supplier, Cost, Price_1, Price_2, Price_3) VALUES ('"+ProdID.Text+"''"+ProdName.Text+"'+'"+ProdCat.Text+"'+'"+ProdSup.Text+"'+'"+ProdCost.Text+"'+'"+ProdPrice1.Text+"'+'"+ProdPrice2.Text+"'+'"+ProdPrice3.Text+"');");

应该是这样的

   com.CommandText = (@"INSERT INTO Stock (Prod_ID, Prod_Name, Prod_Cat, Supplier, Cost, Price_1, Price_2, Price_3) VALUES ('"+ProdID.Text+"','"+ProdName.Text+"','"+ProdCat.Text+"','"+ProdSup.Text+"','"+ProdCost.Text+"','"+ProdPrice1.Text+"','"+ProdPrice2.Text+"','"+ProdPrice3.Text+"');"));

答案 2 :(得分:1)

如果没有选中框,则表单中的复选框值不会产生任何结果,或者以逗号分隔的值列表。您可能做的最糟糕的事情是将此列表存储在单个记录中。这将导致无法使用的数据。

相反,您不仅要更改代码,还要更改数据库设计,以便为每个选中的框创建一条记录。请记住考虑没有选中框的情况。

答案 3 :(得分:0)

尝试:

com.CommandText = ("INSERT INTO Stock (Prod_ID, Prod_Name, Prod_Cat, Supplier, Cost, Price_1, Price_2, Price_3) VALUES ('"+ProdID.Text+"','"+ProdName.Text+"','"+ProdCat.Text+"','"+ProdSup.Text+"','"+ProdCost.Text+"','"+ProdPrice1.Text+"','"+ProdPrice2.Text+"','"+ProdPrice3.Text+"');");

答案 4 :(得分:-1)

你应该替换

 ('"+ProdID.Text+"''"+ProdName.Text+"'+'"+ProdCat.Text+"'+'"+ProdSup.Text+"'+'"+ProdCost.Text+"'+'"+ProdPrice1.Text+"'+'"+ProdPrice2.Text+"'+'"+ProdPrice3.Text+"');");`

('"+ProdID.Text+"','"+ProdName.Text+"','"+ProdCat.Text+"','"+ProdSup.Text+"','"+ProdCost.Text+"','"+ProdPrice1.Text+"','"+ProdPrice2.Text+"','"+ProdPrice3.Text+"');");`

VALUES部分需要每列的逗号)