Обновление транзакции в SQL Server 2008 R2 из ASP.Net не работает - PullRequest
0 голосов
/ 31 декабря 2010

Несмотря на то, что я был преследователем здесь целую вечность, это первое сообщение, которое я делаю. Надеюсь, на этом все не закончится, и более оптимистично будущие посты могут быть на самом деле мной, пытающимся протянуть руку кому-то еще, я действительно обязан этому сообществу очень много.

Теперь то, что я пытаюсь сделать, просто, и, скорее всего, причина того, что это не работает, - моя собственная глупость. Однако я в тупике.

Я работаю над сайтом ASP.Net, который взаимодействует с базой данных SQL Server 2008 R2. Пока все идет хорошо, но обновление строки (или более) просто не будет работать. Я даже пытался скопировать и вставить код с этого сайта и других сайтов, но это всегда одно и то же.

Вкратце: Не отображается исключение или ошибки при выполнении команды обновления (она даже дает правильное количество затронутых строк), но в базе данных фактически не вносятся изменения.

Вот упрощенная версия моего кода (в оригинале было больше команд и множество параметров, но даже если это так, он не работает):

protected void btSubmit_Click(object sender, EventArgs e)
{
    using (SqlConnection connection =
        new SqlConnection(System.Configuration.ConfigurationManager.ConnectionStrings["ApplicationServices"].ConnectionString))
    {
        string commandString = "UPDATE [impoundLotAlpha].[dbo].[Vehicle]" +
                                       "SET [VehicleMake] = @VehicleMake" +
                                          " WHERE [ComplaintID] = @ComplaintID";
        using (SqlCommand command = new SqlCommand(commandString, connection))
        {
            SqlTransaction transaction = null;
            try
            {
                command.Connection.Open();
                transaction =  connection.BeginTransaction(IsolationLevel.Serializable);
                command.Transaction = transaction;

                SqlParameter complaintID = new SqlParameter("@complaintID", SqlDbType.Int);
                complaintID.Value = HttpContext.Current.Request.QueryString["complaintID"];
                command.Parameters.Add(complaintID);

                SqlParameter VehicleMake = new SqlParameter("@VehicleMake", SqlDbType.VarChar, 20);
                VehicleMake.Value = tbVehicleMake.Text;
                command.Parameters.Add(VehicleMake);

                command.ExecuteNonQuery();

                transaction.Commit();
            }
            catch
            {
                transaction.Rollback();
                throw;
            }
            finally
            {
                connection.Close();
            }
        }
    }
}

Я пробовал это с "SqlTransaction" и без него, и ничего не меняется. Кроме того, поскольку я делаю несколько обновлений одновременно, я хочу, чтобы они действовали как одна транзакция. Я обнаружил, что это можно сделать либо так, либо используя классы, включенные в пространство имен System.Transactions (CommittableTransaction, TransactionScope ...).

Я перепробовал все, что смог найти, но не получил никаких других результатов.

Строка подключения в web.config выглядит следующим образом:

<connectionStrings>
   <add name="ApplicationServices" 
        connectionString="Data Source=localhost;Initial Catalog=ImpoundLotAlpha;Integrated Security=True" 
        providerName="System.Data.SqlClient"/>
</connectionStrings>

Итак, тлдр; версия:

  1. Какую ошибку я совершил с этой попыткой обновления записи? (Разобрался, проверьте ниже, если у вас есть похожая проблема.)
  2. Каков наилучший способ собрать несколько команд обновления в одну транзакцию?

Заранее благодарим за любую помощь и / или предложения!

Edit:

Кажется, что мне не хватало сна вчера, потому что на этот раз мне понадобилось всего 5 минут, чтобы понять мою ошибку.

Видимо, обновление работало правильно, но я не заметил, что значения текстового поля перезаписывались в Page_Load. Я почему-то прокомментировал эту часть:

if (IsPostBack)
   return;

Вторая часть вопроса остается в силе. Но я должен опубликовать это как ответ на свой собственный вопрос или оставить это так?

1 Ответ

0 голосов
/ 31 декабря 2010

Вы пытались выполнить запрос к базе данных напрямую (т.е. к самой SQL Management Studio)?Я не уверен, как бы вы реализовали команды «START TRANSACTION ... COMMIT TRANSACTION» из ASP ... для чего стоит делать все наши операции с базой данных из хранимых процедур.

...