В настоящее время вы работаете в автономном режиме; ожидается повторное подключение к Интернету

Браузер не поддерживается

Чтобы использовать веб-сайт, обновите браузер.

Обновите браузер до последней версии Internet Explorer

Использование транзакций COM + в компоненте Visual C#

ВНИМАНИЕ! Перевод данной статьи был выполнен не человеком, а с помощью программы машинного перевода, разработанной корпорацией Майкрософт. Корпорация Майкрософт предлагает вам статьи, переведенные как людьми, так и средствами машинного перевода, чтобы у вас была возможность ознакомиться со статьями базы знаний KB на родном языке. Однако машинный перевод не всегда идеален. Он может содержать смысловые, синтаксические и грамматические ошибки, подобно тому как иностранец делает ошибки, пытаясь говорить на вашем языке. Корпорация Майкрософт не несет ответственности за неточности, ошибки и возможный ущерб, причиненный в результате неправильного перевода или его использования. Корпорация Майкрософт также часто обновляет средства машинного перевода.

Эта статья на английском языке:816141
Аннотация
В данной статье описывается использование COM + Транзакции (службы компонентов) в классе Visual C#. Набор баз данных операции считается одной единицы. Либо все операции успешно или если один завершится неудачно, происходит сбой всей транзакции. В последнем случае любой базы данных операции, которые были опробованы не помещаются в основной базе данных.

Перейти к началу страницы

Требования

Следующие пункты описывают рекомендуемого оборудования, программного обеспечения, Сетевая инфраструктура, навыков и знаний и необходимые пакеты обновления иметь:
  • Microsoft Windows 2000 Server SP1
  • Интернет информации Microsoft Services (IIS) версии 4.0 или более поздней версии
  • Microsoft Internet Explorer версии 5.0, 5.5 или 6.0
В данной статье предполагается, что вы знакомы со следующими:
  • Обработка транзакций концепции и
  • COM + (службы компонентов)
Перейти к началу страницы

Службы транзакций COM +

Можно реализовать с помощью обработки транзакций Пространства имен System.EnterpriseServices пространство имен в Microsoft.NET Framework. Чтобы получить доступ к COM + транзакционные службы создания класса. Чтобы сделать это, выполните следующие действия.
  1. Запустите Visual Studio.NET или Visual Studio 2005.
  2. На Файл Выберите пунктНовый, а затем нажмите кнопку Проект.
  3. Нажмите кнопку Проекты Visual C# Из спискаТипы проектов, а затем нажмите кнопку Библиотека классовИз списка Шаблоны. Имя проектаprjEnterprise.

    Примечание В Visual Studio 2005 нажмите кнопку Visual C# Из спискаТипы проектов, а затем нажмите кнопку Библиотека классовИз списка Шаблоны. Имя проектаprjEnterprise.
  4. По умолчанию будет создан класс Class1.
  5. В обозревателе решений щелкните правой кнопкой мышиСсылки, а затем нажмите кнопку Добавить ссылку.
  6. В Добавить ссылку Появится диалоговое окно. В группе Имя компонента В меню .NET Вкладка, Двойной щелчок Пространства имен System.EnterpriseServices.
  7. Убедитесь, что Пространства имен System.EnterpriseServicesбудет отображена в разделе Выбранные компоненты. Нажмите кнопку ОК.
  8. Добавьте следующий код перед всеми остальными операторами файл Class1.cs:
    using System.EnterpriseServices;using System.Data.SqlClient;
  9. Чтобы добавить новый класс с именем clsES файл Class1.cs.
  10. Для использования служб COM + транзакций, ваш класс)clsES), должен наследоваться функциональные возможности из ServicedComponent следующим образом:
    public class clsES : ServicedComponent
  11. A Транзакции атрибут используется для указания уровня поддержки обмена транзактными сообщениями для класса, как показано ниже:
    [Transaction(TransactionOption.Required)]public class clsES : ServicedComponent
  12. Создание метода в clsES класс с именем dbAccess получающий четыре входных параметра целое число. Первые два параметры предоставляют код продукта и Заказано этого продукта. Вторые два параметры предоставляют КОД продукта и запас для этого продукта. Этот метод выполняет набор базы данных операций над ним указаны коды продуктов, которые должны быть рассматриваются как транзакции:
    void dbAccess(int pID1,int onOrder, int pID2, int inStock)
  13. В dbAccess метод, создайте объект подключения SQL для базы данных Northwind базы данных, а затем откройте подключение. Операции базы данных выполняются с помощью следующие базы данных:

    Примечание Запомнить Чтобы изменить следующие параметры строки подключения в соответствии с правильным значения для сервера SQL Server.
    SqlConnection Conn = new SqlConnection("user id=<username>;password=<strong password>;Initial Catalog=northwind;Data Source=2E124\\SQL;");				Conn.Open();
  14. Установка Попробуйте блок для записи всех исключений, которые могут выполняться в базе данных Обработка. Необходимо перехватывать эти исключения прервать транзакцию. В Попробуйте блок содержит две операции базы данных. Каждая операция обновления другое поле в таблицу записи указанных продуктов.
     try { 
  15. Выполните Первое обновление для таблицы products. Обновление Заказано поле onOrder значение для продукта с Идентификатором, как указано в первых двух входных данных параметры. Следующая команда SQL для выполнения этого обновления SQL:
    SqlCommand sqlCommand = new SqlCommand("UPDATE myProducts SET UnitsonOrder = " + onOrder + " WHERE productID = " + pID1, Conn);				sqlCommand.ExecuteNonQuery();
  16. Выполнение другой update для таблицы products. Обновление НаСкладе поле inStock значение для продукта с Идентификатором, указанным в третий и четвертый входные параметры. Следующая команда SQL для выполнения этого обновления SQL:
    sqlCommand.CommandText = "UPDATE myProducts SET UnitsinStock = " + inStock + " WHERE productID = " + pID2;				sqlCommand.ExecuteNonQuery();
  17. Поскольку эти обновления являются частью транзакции COM +, они вносятся как единое целое. В setComplete метод contextUtil класс из Пространства имен System.EnterpriseServices пространство имен используется для фиксации транзакции (в данном случае два обновления), если ошибки не были созданы:
    ContextUtil.SetComplete();
  18. Закрыть подключение к базе данных «Борей»:
    Conn.Close();}
  19. Необходимо перехватывать все исключения, возникающие во время выполнения Команды SQL, таким образом, чтобы прервать всей транзакции.
    catch(Exception e){ 
  20. В setAbort метод contextUtil класс из Пространства имен System.EnterpriseServices пространство имен используется для отмены всей транзакции. Если первый обновление успешно и второе обновление завершается неудачно, ни обновление отправляется на в таблице продуктов. Перехваченное исключение выдается в вызывающий объект, указывающий что сбой транзакции.
    ContextUtil.SetAbort();				throw e;}
  21. Для этого компонента для правильной компонента должна иметь строгое имя. Создавать строгое имя, а затем подписать сборку со строгим именем. Чтобы сделать это, выполните следующие действия.
    1. В Visual Studio.NET командной строке введите snEnterprise.snk -k Sn.exe Чтобы создать файл ключа. Для просмотреть дополнительные сведения о подписи сборок со строгими именами.NET Документация SDK Framework.
    2. Скопируйте папку проекта snEnterprise.snk.
    3. Добавьте следующий код в AssemblyInfo.vc, до или после других сборки атрибут инструкций:
      [assembly: AssemblyKeyFileAttribute("..\\..\\snEnterprise.snk")]		
    4. Сохраните и выполните построение проекта.
Перейти к началу страницы

Полный пример кода

Примечание Запомнить Чтобы изменить следующие параметры строки подключения в соответствии с правильным значения для сервера SQL Server.
using System;using System.Data;using System.Data.SqlTypes;using System.Data.Common;using System.EnterpriseServices;using System.Data.SqlClient;namespace prjEnterprise{		[Transaction(TransactionOption.Required)]public class clsES:ServicedComponent	{		public SqlConnection Conn;		public void dbAccess(int pID1, int onOrder, int pID2, int inStock)		{			try			{							SqlConnection Conn = new SqlConnection("user id=<username>;password=<strong password>;Initial Catalog=northwind;Data Source=2E124\\SQL;");				Conn.Open();				SqlCommand sqlCommand = new SqlCommand("UPDATE myProducts SET UnitsonOrder = " + onOrder + " WHERE productID = " + pID1, Conn);				sqlCommand.ExecuteNonQuery();								sqlCommand.CommandText = "UPDATE myProducts SET UnitsinStock = " + inStock + " WHERE productID = " + pID2;				sqlCommand.ExecuteNonQuery();				ContextUtil.SetComplete();				Conn.Close();			}			catch(Exception e)			{				ContextUtil.SetAbort();							throw e;			}			finally			{			}		}	}	}

Перейти к началу страницы

Убедитесь, что он работает

Для проверки кода, создайте консольное приложение, которое использует проект clsES. В одном случае транзакция завершается успешно и onorder и instock При обновлении полей для указанного продукта. Во втором случае обновление для onOrder поле для указанного продукта успешно, но для обновления inStock поле для продукта не выполняется, так как номер указанного продукта не существует в таблице Products. Это приводит к сбою транзакции, и транзакции обрабатывается.
  1. В Visual Studio.NET или Visual Studio 2005, точка Новый В менюФайл меню, а затем нажмите кнопку Проект.
  2. Нажмите кнопку Проекты Visual C# Из спискаТипы проектов, а затем нажмите кнопку Консоль Приложение Из списка Шаблоны.

    Примечание В Visual Studio 2005 нажмите кнопку Visual C# Из спискаТипы проектов, а затем нажмите кнопку Консоль Приложение Из списка Шаблоны.
  3. В Имя текстовое поле, типtestES. Убедитесь, что Добавить Решение Выбранный параметр.
  4. Нажмите кнопку ОК Добавление этого проекта решение.
  5. Для testES для тестирования clsES, необходимо добавить ссылку. В обозревателе решений щелкните правой кнопкой мышиСсылки Из списка testES (что можно просто добавлено), а затем нажмите кнопку Добавить ссылку.
  6. В Добавить ссылку Появится диалоговое окно. На очередь Проекты Дважды щелкнитеprjEnterprise.
  7. Ссылка появится в списке Выбранные Компоненты. Нажмите кнопку ОК Чтобы добавить эту ссылку проект.
  8. Добавьте ссылку на проект Библиотека System.EnterpriseServices. В обозревателе решений щелкните правой кнопкой мышиСсылки, а затем нажмите кнопку Добавить ссылку.
  9. В Добавить ссылку Появится диалоговое окно. В группе Имя компонента В меню .NET Вкладка, Двойной щелчок Пространства имен System.EnterpriseServices.
  10. Убедитесь, что Пространства имен System.EnterpriseServicesбудет отображена в разделе Выбранные компоненты. Нажмите кнопку ОК.
  11. Щелкните правой кнопкой мыши консольное приложение (testES), а затем нажмите кнопку По загрузке Проект
  12. Вставьте следующий исходный код в Основной функции Class1 класс:
    	prjEnterprise.clsES myTest = new prjEnterprise.clsES();				try 				{					myTest.dbAccess(1, 777, 2, 888);					Console.WriteLine("TRANSACTION ONE -- SUCCESS");					myTest.dbAccess(1, 5, 2, -20);					Console.WriteLine("TRANSACTION TWO -- SUCCESS");				}				catch (Exception e)				{					Console.WriteLine("TRANSACTION FAILURE");				}
  13. Нажмите клавишу F5 для запуска тестового кода.

    В коде на Шаг 7, первый вызов dbAccess завершается успешно. Продукт 1 и 2 продукта, в таблице Products. В onOrder поле для продукта 1 обновляется, 777 и inStock поле для продукта 2 обновляется 888. Так как эта транзакция выполнено успешно, появляется следующее сообщение в окне вывода
    ОДИН - УСПЕШНОЕ ВЫПОЛНЕНИЕ ТРАНЗАКЦИИ


    Второй вызов метода dbAccess не выполняется. Таким образом ни обновить инструкцию в dbAccess продукты таблицы отправляется в базу данных. Несмотря на то что продукта 1 может иметь его onOrder обновление поля 5Не допускается продукт 2 его inStock значение поля от-20. Из-за ограничений, определенных в таблице продуктов Определение, inStock не разрешается иметь отрицательных чисел.

    Таким образом, Этот вызов dbAccess завершается с ошибкой и вся транзакция завершается неудачей. Таблицы «Товары» сохраняется до вызова dbAccess. В CATCH оператор обрабатывает уведомления об отказе транзакции из dbAccess, и появляется следующее сообщение об ошибке в выходных данных окно:
    СБОЙ ТРАНЗАКЦИИ
  14. Проверьте содержимое таблицы "Northwind" продукты по с помощью SQL Server Enterprise Manager. При просмотре продукта 1, onOrder поле равно 777. При просмотре продукта 2 instock поле является 888. Таким образом второй вызов dbAccess (что могло привести различные значения для этих полей) не выполняется.
Перейти к началу страницы

Разрешение вопросов:

  • Убедитесь, что любой проект, использующий службы COM + строгое имя.
  • Любой класс, который используется службами COM + необходимо наследовать из Компонент служб. Обслуживаемый компонент находится в Пространства имен System.EnterpriseServices пространство имен.
  • Во время отладки, транзакция может время ожидания, прежде чем он будет зафиксирована или прервана. Во избежание истечения времени ожидания, используется свойство timeout атрибут транзакции. В следующем примере имеет связанный метод 1 200 секунд для выполнения любой операции, время ожидания:
    [Transaction(TransactionOption.Required,timeout=1200)]
к началу статьи TOP
Ссылки
Для получения дополнительных сведений посетите следующие корпорации Майкрософт Developer Network (MSDN) веб-узлов:
Интеграции COM +: каким образом.NET Корпоративные службы могут помочь построения распределенных приложений
http://MSDN.Microsoft.com/msdnmag/issues/01/10/ComPlus/Default.aspx
Обслуживание Компоненты
http://msdn2.Microsoft.com/en-us/library/Aa289839 (VS.71) .aspx
к началу статьи TOP

Внимание! Эта статья переведена автоматически

Свойства

Номер статьи: 816141 — последний просмотр: 06/14/2011 12:33:00 — редакция: 4.0

  • Microsoft Visual C# 2005 Express Edition
  • Microsoft Visual C# .NET 2003 Standard Edition
  • Microsoft Visual C# .NET 2002 Standard Edition
  • kbcomplusobj kbsqlprog kbsqlclient kbdatabase kbhowtomaster kbmt KB816141 KbMtru
Отзывы и предложения