使用c#.net将两个记录添加到sqlserverdatabase中
我正在使用c#创建一个简单的库存系统。销售产品表数据添加成功。但销售表数据添加两次我不知道为什么。到目前为止我所尝试的,我附在下面。我将销售表附在下面,记录添加了两次 销售表使用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;
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);
}