这是我的C#WinForm代码我有2个存储过程,第一个在Table1
中执行插入,第二个在Table2
中执行更新都在for循环中。请指导我如何在此代码中使用Commit和Rollback,因为我有GridView和GridView有很多行,如果任何行有不正确的数据,那么没有行插入和更新表
try
{
con.Open();
da = DateTime.Now;
if (txt_challanno.Text == "")
{
//MessageBox.Show("Insert Order No.", "Message Box Sample", MessageBoxButtons.OK, MessageBoxIcon.Error);
toolTip1.ToolTipIcon = ToolTipIcon.Warning;
toolTip1.ToolTipTitle = "Warning!";
toolTip1.Show("Missing 'Lot No.'", txt_challanno);
}
else if (txt_challanno.Text != "" && DataGridView1.CurrentRow.Cells["program_no"].Value == null)
{
toolTip1.Hide(txt_challanno);
MessageBox.Show("Insert Program No.");
}
else if (dataGridView1.CurrentRow.Cells["program_no"].Value != null && dataGridView1.CurrentRow.Cells["bundle_weight"].Value == null)
{
toolTip1.Hide(txt_challanno);
MessageBox.Show("Insert Bundle Weight");
}
else if (dataGridView1.CurrentRow.Cells["bundle_weight"].Value == null && dataGridView1.CurrentRow.Cells["pcs"].Value == null)
{
toolTip1.Hide(txt_challanno);
MessageBox.Show("Insert Pcs");
}
else
{
for (int i = 0; i < dataGridView1.Rows.Count; i++)
{
Double r_weight1 = Convert.ToDouble(dataGridView1.Rows[i].Cells["r_weight"].Value);
Double use_weight1 = Convert.ToDouble(dataGridView1.Rows[i].Cells["use_weight"].Value);
Double r_rolls = Convert.ToDouble(dataGridView1.Rows[i].Cells["r_rolls"].Value);
Double use_rolls = Convert.ToDouble(dataGridView1.Rows[i].Cells["use_rolls"].Value);
if (use_weight <= r_weight1 && use_rolls <= r_rolls)
{
string a = dataGridView1.Rows[i].Cells["pcs_wt"].Value.ToString();
var data = Regex.Match(a, @"\d+").Value;
var6 = Convert.ToDouble(data);
SqlCommand cmd = new SqlCommand("dailycuttinginsert", con);
cmd.Parameters.Add("@id1", SqlDbType.Int).Value = 1;
cmd.Parameters.Add("@challan_no", SqlDbType.NVarChar).Value = txt_challanno.Text;
cmd.Parameters.Add("@size_name", SqlDbType.NVarChar).Value = dataGridView1.Rows[i].Cells["size"].Value.ToString();
cmd.Parameters.Add("@quality_name", SqlDbType.NVarChar).Value = dataGridView1.Rows[i].Cells["quality"].Value.ToString();
cmd.Parameters.Add("@use_weight", SqlDbType.Float).Value = Convert.ToDecimal(dataGridView1.Rows[i].Cells["use_weight"].Value);
cmd.Parameters.Add("@use_rolls", SqlDbType.Int).Value = Convert.ToInt32(dataGridView1.Rows[i].Cells["use_rolls"].Value);
cmd.Parameters.Add("@bundle_weight", SqlDbType.Float).Value = Convert.ToDecimal(dataGridView1.Rows[i].Cells["bundle_weight"].Value);
cmd.Parameters.Add("@ls", SqlDbType.Float).Value = Convert.ToDecimal(dataGridView1.Rows[i].Cells["ls"].Value);
cmd.Parameters.Add("@shape", SqlDbType.Float).Value = Convert.ToDecimal(dataGridView1.Rows[i].Cells["shape"].Value);
cmd.Parameters.Add("@b", SqlDbType.Float).Value = Convert.ToDecimal(dataGridView1.Rows[i].Cells["b"].Value);
cmd.Parameters.Add("@total_pcs", SqlDbType.Float).Value = Convert.ToDecimal(dataGridView1.Rows[i].Cells["total_pcs"].Value);
cmd.Parameters.Add("@avg", SqlDbType.Float).Value = Convert.ToDecimal(dataGridView1.Rows[i].Cells["avg"].Value);
cmd.Parameters.Add("@pcs_wt", SqlDbType.Float).Value = var6;/*Convert.ToDecimal(dataGridView1.Rows[i].Cells["pcs_wt"].Value)*/
cmd.Parameters.Add("@cutting_size", SqlDbType.NVarChar).Value = dataGridView1.Rows[i].Cells["cutting"].Value.ToString();
cmd.Parameters.Add("@date2", SqlDbType.Date).Value = dataGridView1.Rows[i].Cells["dt"].Value.ToString();
cmd.Parameters.Add("@date1", SqlDbType.Date).Value = da.ToString("MM/dd/yyyy");
cmd.Parameters.Add("@r_id", SqlDbType.NVarChar).Value = dataGridView1.Rows[i].Cells["id1"].Value.ToString();
cmd.Parameters.Add("@balance_pcs", SqlDbType.Float).Value = 0;
db.insertprocedure(cmd);
cmd.Parameters.Clear();
SqlCommand cmd1 = new SqlCommand("dailycuttinginsert", con);
cmd1.Parameters.Add("@id1", SqlDbType.Int).Value = 3;
cmd1.Parameters.Add("@challan_no", SqlDbType.NVarChar).Value = txt_challanno.Text;
cmd1.Parameters.Add("@r_id", SqlDbType.NVarChar).Value = dataGridView1.Rows[i].Cells["id1"].Value.ToString();
cmd1.Parameters.Add("@balance_weight", SqlDbType.Float).Value = Convert.ToDecimal(dataGridView1.Rows[i].Cells["bal_weight"].Value);
cmd1.Parameters.Add("@balance_rolls", SqlDbType.Float).Value = Convert.ToDecimal(dataGridView1.Rows[i].Cells["bal_rolls"].Value);
db.insertprocedure(cmd1);
cmd1.Parameters.Clear();
}
else { }
}
MessageBox.Show("Data Inserted");
frmload();
}
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
finally { con.Close(); }
答案 0 :(得分:9)
您想要的第一件事是在打开连接后立即启动事务。另外,请将连接开口移出try
块并将其创建包装在using
中 - 这是IDisposable
实施的一个好习惯:
using (var conn = new SqlConnection(connectionString))
{
// your code before conn.Open()
conn.Open();
SqlTransaction tran = conn.BeginTransaction();
try
{
// your code goes here
然后保持原样,然后在操作结束时提交事务:
tran.Commit();
MessageBox.Show("Data Inserted");
frmload();
在catch
块中,您需要回滚事务,因为某些事情已经失败。确保将其包装在另一个try / catch中,因为它也可能抛出异常:
catch (Exception e)
{
try
{
tran.Rollback();
}
catch (Exception exRollback)
{
Console.WriteLine(exRollback.Message);
}
throw;
}
另请注意,没有finally
,因为using
负责在异常情况下关闭连接。