这段代码的范围有什么问题?

时间:2010-06-21 12:29:38

标签: c# visual-studio-2008 scope

以下代码中的范围有什么问题?

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

6 个答案:

答案 0 :(得分:4)

sqlTran已在try块中声明并初始化,但您尝试在catchfinally块中访问它,此块中不再存在范围。 readerconn也是如此。您需要在整个try-catch-finally块之前声明变量,以便在两者中访问它。

答案 1 :(得分:4)

这些变量在代码的try部分内声明。在catch {}部分内,这些变量不存在。要解决此问题,您需要在try块之外声明变量(将它们设置为null),然后您可以在try块中实例化它们。请务必检查catch块中的空值。

答案 2 :(得分:1)

来自MSDN的

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中使用这些变量。