[英]multiple mysql statements in one transaction c#
在這段代碼中,我將2個表tbl_inv
和tbl_line
插入。 首先,我將記錄插入tbl_inv
(發票),然后將其插入tbl_line
(發票行)。 將記錄插入到tbl_inv
,將自動生成invno
(自動增量列),然后invno
插入tbl_line
表中(對於所有匹配的記錄)。 以下代碼僅插入表tbl_inv
,而不插入tbl_line
。 有什么幫助嗎?
const string InsertStatement1 = @"
INSERT INTO tbl_inv (cname, date, duedate,subtotal,vat,total)
VALUES(@cname, @date, @duedate,@subtotal,@vat,@total )
";
const string InsertStatement2 = @"
INSERT INTO tbl_line (invno,pname,qty,unitprice,amount)
VALUES(@invno,@pname,@qty,@unitprice,@amount )
";
cn.Open();
using (MySqlTransaction sqlTrans =cn.BeginTransaction())
using (MySqlCommand sqlCommand = new MySqlCommand(InsertStatement1, cn, sqlTrans))
{
sqlCommand.Parameters.Add("@cname", comboBox1.Text);
sqlCommand.Parameters.Add("@date", dateTimePicker1.Value.ToString("yyyy-MM-dd"));
sqlCommand.Parameters.Add("@duedate", dateTimePicker2.Value.ToString("yyyy-MM-dd"));
sqlCommand.Parameters.Add("@subtotal", textBox6.Text);
sqlCommand.Parameters.Add("@vat", textBox7.Text);
sqlCommand.Parameters.Add("@total", textBox9.Text);
sqlCommand.ExecuteNonQuery();
var last = "select LAST_INSERT_ID()";
foreach (DataGridViewRow row in mg2.Rows)
{
sqlCommand.Parameters.Add("@invno",last );
sqlCommand.Parameters.AddWithValue("@pname", row.Cells[1].Value);
sqlCommand.Parameters.AddWithValue("@qty", row.Cells[2].Value);
sqlCommand.Parameters.AddWithValue("@unitprice", row.Cells[3].Value);
sqlCommand.Parameters.AddWithValue("@amount", row.Cells[4].Value);
sqlCommand.CommandText = InsertStatement2;
}
sqlTrans.Commit();
}
我在這里看到多個問題:
首先,您需要使用ExecuteScalar()
執行LAST_INSERT_ID
語句,然后將返回值用作下一次插入的參數值。
其次,您根本不會執行下一個插入語句。
因此,它應該看起來像這樣:
const string InsertStatement1 = @"INSERT INTO tbl_inv (cname, date, duedate, subtotal, vat, total)
VALUES (@cname, @date, @duedate, @subtotal, @vat, @total);";
const string InsertStatement2 = @"INSERT INTO tbl_line (invno, pname, qty, unitprice, amount)
VALUES (@invno, @pname, @qty, @unitprice, @amount);";
cn.Open();
using (MySqlTransaction sqlTrans = cn.BeginTransaction())
using (MySqlCommand sqlCommand = new MySqlCommand(InsertStatement1, cn, sqlTrans))
{
sqlCommand.Parameters.Add("@cname", comboBox1.Text);
sqlCommand.Parameters.Add("@date", dateTimePicker1.Value.ToString("yyyy-MM-dd"));
sqlCommand.Parameters.Add("@duedate", dateTimePicker2.Value.ToString("yyyy-MM-dd"));
sqlCommand.Parameters.Add("@subtotal", textBox6.Text);
sqlCommand.Parameters.Add("@vat", textBox7.Text);
sqlCommand.Parameters.Add("@total", textBox9.Text);
sqlCommand.ExecuteNonQuery();
sqlCommand.Parameters.Clear();
sqlCommand.CommandText = "SELECT LAST_INSERT_ID();";
var o = sqlCommand.ExecuteScalar();
if (o is Int64)
{
var id = (Int64)o;
foreach (DataGridViewRow row in mg2.Rows)
{
sqlCommand.Parameters.Clear();
sqlCommand.Parameters.AddWithValue("@invno", id);
sqlCommand.Parameters.AddWithValue("@pname", row.Cells[1].Value);
sqlCommand.Parameters.AddWithValue("@qty", row.Cells[2].Value);
sqlCommand.Parameters.AddWithValue("@unitprice", row.Cells[3].Value);
sqlCommand.Parameters.AddWithValue("@amount", row.Cells[4].Value);
sqlCommand.CommandText = InsertStatement2;
sqlCommand.ExecuteNonQuery();
}
}
sqlTrans.Commit();
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.