0

我创建了一个表并自动增加了主键列。我在本地托管的 .NET 平台中用 C# 创建了一个 Web 表单。当我尝试从 Web 表单输入数据时遇到问题,当我填写其他字段时,不会自动填写主键列,它不接受我输入的任何值。

  1. 当我自己输入一个值时,它说“当 IDENTITY_INSERT 设置为 OFF 时,无法在表 'Product' 中插入标识列的显式值。”

  2. 当我不输入值时,它会说;

    ',' 附近的语法不正确。源错误:

    第 41 行:objCommand.Connection=objConnection;

    第 42 行:objCommand.CommandText =“插入产品(客户名称、客户地址、发票编号、发票日期、产品名称、产品描述、单位成本、数量、总金额ToBePaid)值('”+ tbcustomername.Text+“','”+ tbcustomeraddress.Text +“' ," + tbinvoicenumber.Text + ",'"+tbinvoicedate.Text + "','" + tbproductname.Text + "','" + tbproductdescription.Text + "'," + tbunitcost.Text + "," + tbquantity .Text + "," + tbamounttobepaid.Text + ")";

    第 43 行:objCommand.ExecuteNonQuery();

    第 44 行:

    第 45 行:

因为我已经自动增加了它,所以我希望在填充其他列时自动获得一个值,但这不会发生。我该怎么办?

4

1 回答 1

1

你可以改变你的命令。

objCommand.CommandText = "INSERT INTO Product " +
   "(CustomerName,CustomerAddress,InvoiceNumber,InvoiceDate,ProductName,"+  
   "ProductDescription,UnitCost,Quantity,TotalAmountToBePaid) VALUES " + 
   "(@cname, @caddress, @inumber, @idate, @pname, @pdesc, @unitcost, @qty, @total); " +
   "SELECT SCOPE_IDENITY();";

objCommand.Parameters.Add(new SqlParameter("@cname", tbcustomername.Text));
objCommand.Parameters.Add(new SqlParameter("@caddress", tbcustomeraddress.Text));
objCommand.Parameters.Add(new SqlParameter("@inumber", int.Parse(tbinvoicenumber.Text)));
objCommand.Parameters.Add(new SqlParameter("@idate", DateTime.Parse(tbinvoicedate.Text)));
objCommand.Parameters.Add(new SqlParameter("@pname", tbproductname.Text));
objCommand.Parameters.Add(new SqlParameter("@pdesc", tbproductdescription.Text));
objCommand.Parameters.Add(new SqlParameter("@unitcost", decimal.Parse(tbunitcost.Text)));
objCommand.Parameters.Add(new SqlParameter("@qty", int.Parse(tbquantity.Text)));
objCommand.Parameters.Add(new SqlParameter("@total", decimal.Parse(tbamounttobepaid.Text)));

int id = (int)objCommand.ExecuteScalar(); 

这将返回在此事务中插入的最后一个身份,这是您要访问的身份。请记住,您可以在一个命令中发送多个语句。

正如@Wiktor_Zychla 在下面的评论中所说,在查询中使用参数来逃避sql注入是更好的编码实践。

于 2012-07-10T14:58:47.403 回答