以下代码中的范围有什么问题?
namespace t2
{
public partial class _Default : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
////// string connectionString = "Data Source=A-63A9D4D7E7834\\SQLEXPRESS;Initial Catalog=Test1;Integrated Security=True";
//connection string i taken from the file class1.cs static class.
try
{
string commandString = "Select * from Table_1";
SqlConnection conn = new SqlConnection(Class1.connection);
SqlCommand command = new SqlCommand(commandString, conn);
conn.Open();
// Start a local transaction.
SqlTransaction sqlTran = conn.BeginTransaction();
command.Transaction = sqlTran;
try
{
SqlDataReader reader = command.ExecuteReader();
GridView1.DataSource = reader;
GridView1.DataBind();
}//try ends here.
catch (SqlException ex)
{
//Console.WriteLine(ex.Message);
try
{
// Attempt to roll back the transaction.
sqlTran.Rollback();
}
catch (Exception exRollback)
{
// Throws an InvalidOperationException if the connection
// is closed or the transaction has already been rolled
// back on the server.
Response.Write(exRollback.Message.ToString());
}
// <snipped> build error message
}//sql catch ends here
catch (Exception all)
{
try
{
// Attempt to roll back the transaction.
sqlTran.Rollback();
}
catch (Exception exRollback)
{
// Throws an InvalidOperationException if the connection
// is closed or the transaction has already been rolled
// back on the server.
Response.Write(exRollback.Message.ToString());
}
Response.Write(all.Message.ToString());
}//catch all ends
}//main try
finally
{
// Commit the transaction.
sqlTran.Commit();
reader.Close();
reader.Dispose();
conn.Close();
conn.Dispose();
}//finally ends
}//page load method ends
显示的错误是:
Error 1 The name 'sqlTran' does not exist in the current context D:\DOCUMENTSS\Visual Studio 2008\Projects\t2\t2\Default.aspx.cs 162 17 t2
Error 2 The name 'reader' does not exist in the current context D:\DOCUMENTSS\Visual Studio 2008\Projects\t2\t2\Default.aspx.cs 166 17 t2
Error 3 The name 'reader' does not exist in the current context D:\DOCUMENTSS\Visual Studio 2008\Projects\t2\t2\Default.aspx.cs 167 17 t2
Error 4 The name 'conn' does not exist in the current context D:\DOCUMENTSS\Visual Studio 2008\Projects\t2\t2\Default.aspx.cs 169 17 t2
Error 5 The name 'conn' does not exist in the current context D:\DOCUMENTSS\Visual Studio 2008\Projects\t2\t2\Default.aspx.cs 170 17 t2
答案 0 :(得分:4)
sqlTran
已在try
块中声明并初始化,但您尝试在catch
和finally
块中访问它,此块中不再存在范围。 reader
和conn
也是如此。您需要在整个try-catch-finally
块之前声明变量,以便在两者中访问它。
答案 1 :(得分:4)
这些变量在代码的try部分内声明。在catch {}部分内,这些变量不存在。要解决此问题,您需要在try块之外声明变量(将它们设置为null),然后您可以在try块中实例化它们。请务必检查catch块中的空值。
答案 2 :(得分:1)
Here is an example解释了如何在方法中使用SqlTransaction。就像其他人所说的那样,您的BeginTransaction调用应该在try catch之外,这样您就可以通过该方法的所有级别访问它。
希望这会有所帮助。
答案 3 :(得分:0)
你的SQL事务是里面你的“主要尝试”但是你试图在你的“主要终极”中使用它,它需要在外面主要尝试使用在catch / finally块中。另外,永远不要。在finally块中进行提交 - 在尝试完成之前将它放在主要测试的末尾。
答案 4 :(得分:0)
你的sqlTran是在第一个try块中声明的,因此无法在finally块中访问它,
try{
define A
}
finally{
cant access A here..
}
你的变量应该在try block之外声明。
define A
try{
do something with A
}
finally{
can access A here...
}
答案 5 :(得分:0)
在第一次尝试之外声明您的连接,命令和事务。您可以在try中实例化它们,但要确保在执行可能引发错误的操作之前声明它们。如果conn.Open()抛出错误,您的事务将永远不会被声明。这就是为什么语言不允许你在catch / finally中使用这些变量。