Выполнить несколько хранимых процедур в одной транзакции из WCF - PullRequest
1 голос
/ 04 февраля 2012

Это мой первый пост здесь ..

Я пишу программу на MVC3, которая имеет службу WCF, которая действует как уровень доступа к данным.В моем DAL я должен делать какие-то «пакетные» вставки и обновления ... особенно для заказов, например ... скажем, один заказ состоит из нескольких позиций и может иметь несколько способов оплаты и т. Д., Поэтому, когда я вставляю новый заказ, яВам нужно будет вставить все элементы, относящиеся к этому порядку и т. д.

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

Таблицы Order и Item связаны между собой третьей таблицей с именем Order_Items, которая будет иметь (fk) order_id, (fk) item_id, qty, price ..

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

cmd.CommandText = 'exec sp_insert_order @order_number @order_date ...'
cmd.ExecuteNonQuery();

, а затем зациклить элементы, скажем

foreach (string s in insert_items)
{
    cmd.CommandText = s;
    cmd.ExecuteNonQuery();
}

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

Ответы [ 3 ]

4 голосов
/ 04 февраля 2012

Если вы используете хранимую процедуру, вам следует изменить способ ее вызова - я бы порекомендовал использовать такой подход:

// define your stored procedure name, and the type 
cmd.CommandText = 'dbo.sp_insert_order';
cmd.CommandType = CommandType.StoredProcedure;

// define and fill your parameters
cmd.Parameters.Add("@order_number", SqlDbType.Int).Value = order_nr;
cmd.Parameters.Add("@order_date", SqlDbType.DateTime).Value = ......;

cmd.ExecuteNonQuery();

По сути, вам придется делать это для каждой хранимой процедуры, которую выхотите позвонить, и вы можете без проблем обернуть все это в одну транзакцию:

using(SqlConnection connection = new SqlConnection("your-connection-string-here"))
{
   SqlTransaction transaction = connection.BeginTransaction();

   try
   {
        // call all stored procuedures here - remember to assign the 
        // transaction to the SqlCommand!!
         ....

        transaction.Commit();
    }
    catch(Exception exc) 
    {
       transaction.Rollback();
    }        
}
0 голосов
/ 04 февраля 2012

Вас также может заинтересовать функция распространения транзакций, встроенная в WCF. Он может быть настроен таким образом, что каждый вызов веб-службы в WCF автоматически создает и фиксирует или откатывает транзакции для вас, в основном заключая в себе весь вызов метода службы в транзакции.

Здесь хорошая запись MSDN .

Это немного сложная тема и может быть излишним для того, что вам нужно, но что-то иметь в виду.

0 голосов
/ 04 февраля 2012

Вы можете использовать атрибуты TransactionScope в своих методах для включения всей работы в процесс транзакции или текст

...