sqldataadapter несколько таблиц и транзакций - PullRequest
0 голосов
/ 10 ноября 2011

ADO.NET - Обновление нескольких таблиц данных

Я нашел вопрос выше, который является именно тем, что я ищу и пытаюсь реализовать решение ...

Я пытаюсь найти лучшее решение для обновления нескольких таблиц в sqlserver 2008 и обеспечения транзакций на нескольких таблицах.Если вставка в одну таблицу не удалась, выполните откат предыдущих обновлений для других таблиц.

  1. sqldataadapter обновляет только одну таблицу за раз
  2. Я знаю, что мы можем выполнять транзакции только для одного адаптера данных за разно необходимо обновить несколько таблиц

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

        using (SqlConnection con = new SqlConnection(SqlServerConnectionString))
        {
            con.Open();
            //table is an array of datatable and contains data to be inserted
            for (int i = 0; i < table.Length; i++)
            {
                ds.Tables.Add(table[i]);
            }

            SqlTransaction trans = con.BeginTransaction();

            SqlDataAdapter dataAdapter = new SqlDataAdapter();
            //Need to set insert,select, update, delete???? on multiple tables?

            //dataAdapter.Fill(ds);
            dataAdapter.InsertCommand.Transaction = trans; //null object error here
            dataAdapter.UpdateCommand.Transaction = trans;
            dataAdapter.DeleteCommand.Transaction = trans;

            try
            {

                dataAdapter.Update(ds);
                trans.Commit();
            }
            catch(Exception ex)
            {
                trans.Rollback();

            }

Ответы [ 2 ]

1 голос
/ 10 ноября 2011

Спасибо за всеобщее мнение. Я думаю, что предыдущий ответ @Charlie с этим вопросом меня отбросил: ADO.NET - Обновление нескольких таблиц данных

Я подумал, что, возможно, вы можете использовать набор данных для обновлений, но я думаю, вам все равно нужно создать дополнительный адаптер данных, а затем вызвать обновление. Таким образом, ответ на предыдущий вопрос - единственный простой способ сделать то, что хотел сделать @ gamzu07, - использовать массив, а не объявлять его каждый раз. Приведенный ниже код работает, но кажется мне запоздалым, есть ли у кого-нибудь идеи лучше, чем, возможно, создание команд вставки и выполнение этого ....?

            SqlDataAdapter[] dataAdapter = new SqlDataAdapter[table.Length];

            for (int i = 0; i < table.Length; i++)
            {

                dataAdapter[i] = new SqlDataAdapter("select * from " + table[i].TableName, con);
                SqlCommandBuilder cb = new SqlCommandBuilder(dataAdapter[i]);
                dataAdapter[i].InsertCommand = cb.GetInsertCommand();
                dataAdapter[i].Fill(table[i]);

            }

            SqlTransaction trans = con.BeginTransaction();

            try
            {
                for(int i=0;i < table.Length;i++){
                    dataAdapter[i].InsertCommand.Transaction = trans;
                    dataAdapter[i].Update(table[i]);
                }
                trans.Commit();
            }
            catch(Exception ex)
            {
                trans.Rollback();
            }
0 голосов
/ 10 ноября 2011

Вам необходимо определить команды для каждого из них - я предлагаю использовать SqlCommandBuilder для работы.

Обратите внимание, однако, что SqlDataAdapter работает только на one DataTable. Непонятно из документации, если это первая таблица:

Метод Update извлекает строки из таблицы, указанной в первом сопоставлении, перед выполнением обновления.

http://msdn.microsoft.com/en-us/library/system.data.common.dataadapter.update.aspx

... Или, может быть, это единственная таблица в наборе данных с именем Table:

Обновление | Вызывает соответствующие операторы INSERT, UPDATE или DELETE для каждой вставленной, обновленной или удаленной строки в указанном наборе данных из таблицы данных с именем «Таблица».

http://msdn.microsoft.com/en-us/library/system.data.common.dataadapter.update.aspx

В любом случае, ваш цикл по таблицам должен вызывать Update, если вы используете SqlDataAdapter.

EDIT

В любом случае, насколько я могу судить, SqlDataAdapter здесь не очень хороший выбор. Если все, что вы пытаетесь сделать, - это делить транзакцию между DataTables, просто используйте серию SqlCommands, которые совместно используют SqlTransaction.

(если это не совсем понятно, я добавлю пример кода, когда приступлю к работе)

...