簡體   English   中英

一次交易中有多個mysql語句C#

[英]multiple mysql statements in one transaction c#

在這段代碼中,我將2個表tbl_invtbl_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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM