|
|
|
อยากทราบวิธีการใช้ transactionscope ใน C# หน่อยครับ |
|
|
|
|
|
|
|
ถามพี่ goo เยอะๆ
http://msmvps.com/blogs/williamryan/archive/2004/07/08/9759.aspx
|
|
|
|
|
Date :
2012-09-12 15:29:18 |
By :
chokbunthit |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
ขอบคุณสำหรับคำแนะนำครับ
แต่วัตถุประสงค์จริงๆแล้วคือ การเพิ่ม แก้ไขข้อมูล หลายๆเทเบิลในเวลาเดียวกัน โดยการตรวจสอบสอบก่อนว่าคำสั่งในการเพิ่ม ลบ แก้ไขข้อมูลมีการ error ไหม ถ้าไม่มีการ error ให้บันทึกข้อมูลได้ แต่ถ้ามีการ error ไม่ให้้มีการบันทึก
เช่น ผมต้องการเพิ่มข้อมูล 3 table แต่ละ table มีการเชื่อมโยงกัน
table1 และ table2 ไม่มีการ error สามารถบันทึกข้อมูลได้ตามลำดับ แต่ตอนเพิ่มข้อมูลใน table ที่ 3 เกิดการ error ของข้อมูลทำให้มีข้อมูลใน table ที่ 1และ2 แต่ข้อมูลใน table ที่ 3 ไม่มี ผมต้องมานั่งลบข้อมูลใน table 1และ 2 ทำให้เสียเวลา
ผมอยากให้มีการตรวจสอบก่อนว่ามีการ error ของข้อมูลในการเพิ่มข้อมูลหรือไม่ ถ้าไม่มีการ error ให้บันทึกข้อมูลได้ แต่ถ้ามีการ error ไม่ให้้มีการบันทึก ทั้ง 3 table
ตัวอย่าง code
Code (C#)
private void insertInto()
{
string sql = "insert into customer (customer_id,customer_name) values(@customer_id, @customer_name)";
SqlTransaction ts = conn.BeginTransaction();
cmd = new SqlCommand(sql,conn);
cmd.Parameters.Clear();
cmd.Parameters.AddWithValue("@customer_id",txtCus_id.Text.Trim());
cmd.Parameters.AddWithValue("@customer_name", txtCus_name.Text.Trim());
cmd.Transaction = ts;
int rowaffected = 0;
rowaffected = cmd.ExecuteNonQuery();
if (rowaffected > 0)
{
ts.Commit();
string sql_sale = "insert into sale (sale_id,sale_number,date,customer_id) values(@sale_id,@sale_number,@date,@customer_id)";
ts = conn.BeginTransaction();
cmd = new SqlCommand(sql_sale,conn);
cmd.Parameters.AddWithValue("@sale_id", txtSale_id.Text.Trim());
cmd.Parameters.AddWithValue("@sale_number", txtSale_number.Text.Trim());
cmd.Parameters.AddWithValue("@date", Convert.ToDateTime(dateTimePicker1.Value.ToShortDateString()));
cmd.Parameters.AddWithValue("@customer_id", txtCus_id.Text.Trim());
cmd.Transaction = ts;
int rowaffected1 = 0;
rowaffected1 = cmd.ExecuteNonQuery();
if (rowaffected1 > 0)
{
ts.Commit();
string sql_detail = "insert into detail(detail_id,product_name) values(@detail_id,@product_name)";
ts = conn.BeginTransaction();
cmd = new SqlCommand(sql_detail,conn);
cmd.Parameters.Clear();
cmd.Parameters.AddWithValue("@detail_id", txtSale_id.Text.Trim());
cmd.Parameters.AddWithValue("@product_name", txtProduct_name.Text.Trim());
cmd.Transaction = ts;
int rowaffected2 = 0;
rowaffected2 = cmd.ExecuteNonQuery();
if (rowaffected2 > 0)
{
ts.Commit();
}
else {
ts.Rollback();
}
}
else {
ts.Rollback();
}
}
else {
ts.Rollback();
}
queryDB();
}
|
|
|
|
|
Date :
2012-09-12 16:26:30 |
By :
JaNoRn |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
อืมจากที่ดู Code แล้วรู้สึกว่าจะผิดตรง
ts.Commit();
ที่มีการเรียกใช้หลายๆจุด เพราะอะไรรู้ไหม เทเบิล 1 ไม่มี Error แต่ เทเบิล 3 Error แต่ยังมีข้อมูลเข้าเทเบิล 1 ได้อยู่ก็เนื่องจาก Transaction ถูก Commit ไปแล้ว ถ้าอย่างไงให้ไปดูตัวอย่างของคุณ mr.win ศึกษาเพิ่มเติมดูครับ
|
|
|
|
|
Date :
2012-09-12 17:17:59 |
By :
chokbunthit |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
ได้แล้วครับ ขอบคุณสำหรับคำแนะนำทุกๆท่านครับ
โค๊ดตัวอย่างเผื่อท่านใดจะนำไปปรับเปลี่ยนใช้เอง
Code (C#)
private void insertInto()
{
ts = conn.BeginTransaction(IsolationLevel.ReadCommitted);
try
{
string sql = "insert into customer (customer_id,customer_name) values(@customer_id, @customer_name)";
cmd = new SqlCommand(sql, conn);
cmd.Parameters.Clear();
cmd.Parameters.AddWithValue("@customer_id", txtCus_id.Text);
if (txtProduct_name.Text != "")
{
cmd.Parameters.AddWithValue("@customer_name", txtCus_name.Text);
}
cmd.Transaction = ts;
cmd.ExecuteNonQuery();
//MessageBox.Show("cus");
string sql_sale = "insert into sale (sale_id,sale_number,date,customer_id) values(@sale_id,@sale_number,@date,@customer_id)";
cmd = new SqlCommand(sql_sale, conn);
cmd.Parameters.AddWithValue("@sale_id", id);
if (txtSale_number.Text != "")
{
cmd.Parameters.AddWithValue("@sale_number", txtSale_number.Text);
}
cmd.Parameters.AddWithValue("@date", Convert.ToDateTime(dateTimePicker1.Value.ToShortDateString()));
if (txtCus_id.Text != "")
{
cmd.Parameters.AddWithValue("@customer_id", txtCus_id.Text);
}
cmd.Transaction = ts;
cmd.ExecuteNonQuery();
//MessageBox.Show("sale");
string sql_detail = "insert into detail(detail_id,product_name) values(@detail_id,@product_name)";
cmd = new SqlCommand(sql_detail, conn);
cmd.Parameters.Clear();
cmd.Parameters.AddWithValue("@detail_id", id);
if (txtProduct_name.Text != "")
{
cmd.Parameters.AddWithValue("@product_name", txtProduct_name.Text);
}
cmd.Transaction = ts;
cmd.ExecuteNonQuery();
//MessageBox.Show("detail");
for (int i = 0; i < dataGridView1.RowCount - 1; i++)
{
string sql_1 = "insert into invoice(invoice_id,customer_id,customer_name,sale_id,sale_number,date)";
sql_1 += " values(@invoice_id,@customer_id,@customer_name,@sale_id,@sale_number,@date)";
cmd = new SqlCommand(sql_1, conn);
cmd.Parameters.Clear();
cmd.Parameters.AddWithValue("@invoice_id", dataGridView1.Rows[i].Cells[2].Value.ToString());
cmd.Parameters.AddWithValue("@customer_id", dataGridView1.Rows[i].Cells[0].Value.ToString());
cmd.Parameters.AddWithValue("@customer_name", dataGridView1.Rows[i].Cells[1].Value.ToString());
cmd.Parameters.AddWithValue("@sale_id", dataGridView1.Rows[i].Cells[2].Value.ToString());
cmd.Parameters.AddWithValue("@sale_number", dataGridView1.Rows[i].Cells[3].Value.ToString());
cmd.Parameters.AddWithValue("@date", Convert.ToDateTime(dataGridView1.Rows[i].Cells[4].Value.ToString()));
cmd.Transaction = ts;
cmd.ExecuteNonQuery();
}
ts.Commit();
queryDB();
}
catch {
ts.Rollback();
MessageBox.Show("ไม่สามารถบันทึกข้อมูลได้");
}
}
|
|
|
|
|
Date :
2012-09-13 17:25:43 |
By :
JaNoRn |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Load balance : Server 05
|