使用c#.net将两个记录添加到sqlserverdatabase中

使用c#.net将两个记录添加到sqlserverdatabase中,c#,sql-server,C#,Sql Server,我正在使用c#创建一个简单的库存系统。销售产品表数据添加成功。但销售表数据添加两次我不知道为什么。到目前为止我所尝试的,我附在下面。我将销售表附在下面,记录添加了两次 销售表 id subtoal pay bal 27 900.00 1000.00 100.00 28 900.00 1000.00 100.00 string bal = txtBal.Text; string sub = txtSub.Text;

我正在使用c#创建一个简单的库存系统。销售产品表数据添加成功。但销售表数据添加两次我不知道为什么。到目前为止我所尝试的,我附在下面。我将销售表附在下面,记录添加了两次

销售表

id  subtoal pay      bal
27  900.00  1000.00 100.00
28  900.00  1000.00 100.00




 string bal = txtBal.Text;
                string sub = txtSub.Text;
                string pay = textBox1.Text;
                sql = "insert into sales(subtoal,pay,bal) values(@subtoal,@pay,@bal); select @@identity;";
                con.Open();
                cmd = new SqlCommand(sql, con);
                cmd.Parameters.AddWithValue("@subtoal", sub);
                cmd.Parameters.AddWithValue("@pay", pay);
                cmd.Parameters.AddWithValue("@bal", bal);
                int lastinsertID = int.Parse(cmd.ExecuteScalar().ToString());               
                cmd.ExecuteNonQuery();

                string proddname;
                int price;
                int qty;
                int tot;


                for (int row = 0; row < dataGridView1.Rows.Count; row++)
                {
                    proddname = dataGridView1.Rows[row].Cells[0].Value.ToString();
                     price = int.Parse(dataGridView1.Rows[row].Cells[1].Value.ToString());
                     qty = int.Parse(dataGridView1.Rows[row].Cells[2].Value.ToString());

                     int total = int.Parse(dataGridView1.Rows[row].Cells[3].Value.ToString());


                     sql1 = "insert into sales_product(sales_id,prodname,price,qty,total) values(@sales_id,@prodname,@price,@qty,@total)";

                     cmd1 = new SqlCommand(sql1, con);
                     cmd1.Parameters.AddWithValue("@sales_id", lastinsertID);
                     cmd1.Parameters.AddWithValue("@prodname", proddname);
                     cmd1.Parameters.AddWithValue("@price", price);
                     cmd1.Parameters.AddWithValue("@qty", qty);
                     cmd1.Parameters.AddWithValue("@total", total);
                     cmd1.ExecuteNonQuery();

                }

                MessageBox.Show("Record Addddedddd");

                con.Close();
id小计工资余额
27  900.00  1000.00 100.00
28  900.00  1000.00 100.00
字符串bal=txtBal.Text;
string sub=txtSub.Text;
字符串pay=textBox1.Text;
sql=“插入销售(小计、付款、余额)值(@subtotal、@pay、@bal);选择@@identity;”;
con.Open();
cmd=新的SqlCommand(sql,con);
cmd.Parameters.AddWithValue(“@subtotal”,sub);
cmd.Parameters.AddWithValue(“@pay”,pay);
cmd.Parameters.AddWithValue(“@bal”,bal);
int lastinsertID=int.Parse(cmd.ExecuteScalar().ToString());
cmd.ExecuteNonQuery();
字符串proddname;
国际价格;
整数数量;
int tot;
对于(int row=0;row
根据Larnu的指令,您执行了两次查询。在这种情况下,您应该只使用ExecuteScalar()版本来检索最后插入的id,以便以后使用

我还想指出,设计意图是初始化参数集合一次,然后多次重复使用,每次都执行。您还应该使用
语句来生成命令,更像这样,并且您可能应该养成使用SCOPE_IDENTITY()而不是@IDENTITY的习惯:

        using(var con = new SqlConnection(...)){
            con.Open();

            string bal = txtBal.Text;
            string sub = txtSub.Text;
            string pay = textBox1.Text;
            sql = "insert into sales(subtoal,pay,bal) values(@subtoal,@pay,@bal); select scope_identity();";

            int lastinsertId = 0;
            using(var cmd = new SqlCommand(sql, con){
              cmd.Parameters.AddWithValue("@subtoal", sub);
              cmd.Parameters.AddWithValue("@pay", pay);
              cmd.Parameters.AddWithValue("@bal", bal);
              lastinsertID = (int)cmd.ExecuteScalar();               
            }

            string proddname = "";
            int price = 0;
            int qty = 0;
            int tot = 0;

            sql1 = "insert into sales_product(sales_id,prodname,price,qty,total) values(@sales_id,@prodname,@price,@qty,@total)";
            using(var cmd1 = new SqlCommand(sql1, con)){
              cmd1.Parameters.AddWithValue("@sales_id", lastinsertID);
              cmd1.Parameters.AddWithValue("@prodname", proddname);
              cmd1.Parameters.AddWithValue("@price", price);
              cmd1.Parameters.AddWithValue("@qty", qty);
              cmd1.Parameters.AddWithValue("@total", total);

              for (int row = 0; row < dataGridView1.Rows.Count; row++)
              {
                 proddname = dataGridView1.Rows[row].Cells[0].Value.ToString();
                 price = int.Parse(dataGridView1.Rows[row].Cells[1].Value.ToString());
                 qty = int.Parse(dataGridView1.Rows[row].Cells[2].Value.ToString());

                 int total = int.Parse(dataGridView1.Rows[row].Cells[3].Value.ToString());

                 cmd1 = new SqlCommand(sql1, con);
                 cmd1.Parameters["@sales_id"].Value = lastinsertID;
                 cmd1.Parameters["@prodname"].Value = proddname;
                 cmd1.Parameters["@price"].Value = price;
                 cmd1.Parameters["@qty"].Value = qty;
                 cmd1.Parameters["@total"].Value = total;
                 cmd1.ExecuteNonQuery();
              }
            } //end using sqlcommand

         }//end using sqlconnection - it will close as a result

         MessageBox.Show("Record Addddedddd");
是的,就是这样;只需4行代码,如果@param名称与强类型表中的列名匹配,就更容易了

我认为,只要行的属性与查询中的参数相同,您甚至可以通过传入datatable让Dapper执行循环:

using(...){
    sql = "insert into sales_product(sales_id,prodname,price,qty,total) values(@sales_id,@prodname,@price,@qty,@total)";
    dapperConnection.Execute(sql, salesProductTable);
}

看一看-

您正在执行两次语句:
int lastinsertID=int.Parse(cmd.ExecuteScalar().ToString())
后跟
cmd.ExecuteNonQuery()谢谢,先生,工作正常。
using(...){
  foreach(var ro in SalesProductTable){

    sql = "insert into sales_product(sales_id,prodname,price,qty,total) values(@sales_id,@prodname,@price,@qty,@total)";
    dapperConnection.Execute(sql, new { ro.sales_id, ro.prodname, ro.price, ro.qty, ro.total });
  }
using(...){
    sql = "insert into sales_product(sales_id,prodname,price,qty,total) values(@sales_id,@prodname,@price,@qty,@total)";
    dapperConnection.Execute(sql, salesProductTable);
}