Что не так с областью действия в этом коде? - PullRequest
1 голос
/ 21 июня 2010

Что не так с областью действия в следующем коде?

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 ]

4 голосов
/ 21 июня 2010

Эти переменные объявлены в частях кода вашего кода.Внутри частей catch {} эти переменные не существуют.Чтобы решить проблему, вам нужно объявить переменные вне блока try (установив их в null), а затем вы можете создать их экземпляр в блоке try.Обязательно проверьте наличие нулевых значений в блоках перехвата.

4 голосов
/ 21 июня 2010

sqlTran объявлен и инициализирован в блоке try, но вы пытаетесь получить к нему доступ в блоках catch и finally, где он больше не существует в области. То же самое касается reader и conn. Вам необходимо объявить переменные перед целым блоком try-catch-finally, чтобы получить доступ к ним в обоих.

1 голос
/ 21 июня 2010

Вот пример из MSDN, который объясняет, как обычно использовать SqlTransaction с в методе.Как и другие говорили, ваш вызов BeginTransaction должен быть вне вашей попытки перехвата, чтобы вы имели доступ к нему через все уровни области действия метода.

Надеюсь, это поможет некоторым.

0 голосов
/ 21 июня 2010

Объявите ваше соединение, команду и транзакцию за пределами первой попытки. Вы можете создать их экземпляр при попытке, но убедитесь, что они объявлены, прежде чем делать что-то, что может вызвать ошибку. Если conn.Open () выдает ошибку, ваша транзакция никогда не будет объявлена. Вот почему язык не позволяет использовать эти переменные в catch / finally.

0 голосов
/ 21 июня 2010

Ваш sqlTran объявлен внутри первого блока try, поэтому к нему нельзя получить доступ в блоке finally,

try{
  define A
}
finally{
  cant access A here..
}

Ваша переменная должна быть объявлена ​​вне блока try.

define A
try{
   do something with A
}
finally{
   can access A here...
}
0 голосов
/ 21 июня 2010

Ваша транзакция SQL внутри ваша "основная попытка", но вы пытаетесь использовать ее в своей "главной версии", она должна быть вне основной попытки, чтобы использоваться в ловить / наконец блокировать. Кроме того, никогда. Коммит внутри блока finally - поместите его в конец основной попытки непосредственно перед завершением попытки.

...