【发布时间】:2015-04-25 16:31:07
【问题描述】:
我有一个循环,我用不同的参数值调用存储过程。
下一个电话cmd.ExecuteNonQuery();
我使用事务来保存全部或回滚,并使用 checkBox2 - 始终保存。
我发现了一个问题,但我找不到解决方案。
在触发 catch 块时出现第一个问题后,事务对象失去了连接。
t.connection 为空!
一切都很好,但事务对象没有连接在开始时它有!
try
{
while (!sr.EndOfStream)
{
strLine.Remove(0, strLine.Length);
//c = sr.ReadLine();
while (c != "-")
{
c = sr.ReadLine();
strLine.Append(c );
if (sr.EndOfStream) break;
}
//strLine.Append("Nowa pozycja");
try
{
cmd.Parameters["@s"].Value = strLine.ToString();
cmd.Parameters["@Return_value"].Value = null;
cmd.ExecuteNonQuery();
}
catch
{
if (cmd.Parameters["@Return_value"].Value == null)
{
cmd.Parameters["@Return_value"].Value = -100;
}
if (((int)cmd.Parameters["@Return_value"].Value == 100) || (checkBox2.Checked))
{
if ((int)cmd.Parameters["@Return_value"].Value != 100)
{
MessageBox.Show("Są błedy! " + cmd.Parameters["@s"].Value);
};
}
}
if (!checkBox2.Checked)
{
if ((Int32)cmd.Parameters["@Return_value"].Value != 100)
{
break;
}
}
c = "";
}
textBox1.Text = strLine.ToString();
}
catch
{
// t.Rollback();
// t = null;
textBox1.Text = strLine.ToString();
textBox1.Visible = true;
MessageBox.Show("Wystąpiły problemy w czasie importu " + cmd.Parameters["@s"].Value);
//return;
}
finally
{
if (cmd.Parameters["@Return_value"].Value == null)
{
cmd.Parameters["@Return_value"].Value = -100;
}
if (((int)cmd.Parameters["@Return_value"].Value==100)||(checkBox2.Checked))
{
t.Commit();
if ((int)cmd.Parameters["@Return_value"].Value!=100)
{
MessageBox.Show("Transakcja zapisana ale w pliku były błedy! " + cmd.Parameters["@s"].Value);
};
}
else
{
if (t!=null) {t.Rollback();}
MessageBox.Show("Transakcja odrzucona!");
}
conn2.Close();
aFile.Close();
}
【问题讨论】:
-
您在该块中缺少大量代码。我想说你的第一步是稍微简化一下并发布整个块。另外,我会考虑不将大括号放在自己的行上;扫描包含大量空白的大块代码更加困难。 (但这是我的看法)
-
如何设置连接和事务?
-
我设置了它们: if (conn2.State != ConnectionState.Open) conn2.Open(); SqlTransaction t= conn2.BeginTransaction();
-
很难知道从哪里开始,您是否有一个目标是打破几乎所有编写体面代码的规则作为设计要求?第一个问题是你不尝试捕捉任何东西。第二个是如果你这样做了,你不会假设可能会抛出哪个异常。分解代码,以便您查看发生了什么,并且只捕获您可以处理的异常。
-
问题很简单。当 catch 发生时,对象 Transaction t 丢失了它的 Connection 值。
标签: c# transactions connection try-catch sqltransaction