ПРАКТИЧЕСКОЕ руководство: Выполнение распределенных транзакций с.NET поставщик с помощью ServicedComponent в Visual C#.NET

Переводы статьи Переводы статьи
Код статьи: 316247 - Vizualiza?i produsele pentru care se aplic? acest articol.
Развернуть все | Свернуть все

В этой статье

Аннотация

В этой статье показано, как выполнять распределенную транзакцию с помощью.NET с ServicedComponent класс. Несмотря на то, что в этой статье использует SqlClient.NET по умолчанию на сервере Microsoft SQL Server, можно также использовать ODBC или OLE DB.NET управляемого поставщика.

Требования

В следующем списке представлены рекомендуемого оборудования, программного обеспечения, сетевой инфраструктуры и пакетов обновления, которые необходимы:
  • Microsoft Windows 2000 Professional, Windows 2000 Server Microsoft Windows 2000 Advanced Server
  • Microsoft Visual Studio.NET
  • Microsoft SQL Server 2000 или Microsoft SQL Server 7.0

Общие сведения

Экземпляры.NET Framework могут участвовать в автоматической транзакции при подготовке к классу для этого. Каждый ресурс, который обращается к экземпляру класса или объекта выполняет зачисление в транзакцию. Например, если объект использует ADO.NET для учета деньги на учетную запись в базе данных, диспетчер ресурсов для базы данных определяет, выполняется ли объект в транзакции. Если объект должен быть запущен в транзакции, диспетчер ресурсов автоматически присоединяет базы данных в транзакции.

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

    Тип транзакции должен быть членом TransactionOption значение перечисления.
  2. Является производным от класса ServicedComponent класс. ServicedComponent Представляет базовый класс для всех классов, использующих службы COM +.
  3. Подпись сборки строгим именем, чтобы убедиться, что сборка содержит уникальные пары ключей.
  4. Зарегистрируйте сборку, содержащую класс с помощью каталога COM +.

    ПРИМЕЧАНИЕ: Если общеязыковая среда выполнения управляет клиента, который вызывает экземпляр этого класса, выполняется регистрация. Этот шаг необходим, только если неуправляемый вызывающий объект создается и вызывается экземпляров класса. Использование.Программа установки служб NET (Regsvcs.exe), чтобы вручную зарегистрировать сборку.
Для получения дополнительных сведений о том, как подписать сборку строгим именем см. следующий раздел в Microsoft.Руководство разработчика платформы:
Подпись сборки строгим именем
http://MSDN.Microsoft.com/en-us/library/xc31ft41.aspx
Дополнительные сведения см. следующий раздел в Microsoft.Руководство разработчика платформы:
Автоматические транзакции и.NET Framework классов
http://MSDN.Microsoft.com/en-us/library/ms123400.aspx

Создание проекта

  1. Выполните следующие действия, чтобы создать новый проект консольного приложения Visual C#.NET:
    1. Запустите Visual Studio.NET.
    2. На Файл Выберите пункт Новый, а затем нажмите кнопку Проект.
    3. В Новый проект диалоговое окно, нажмите кнопку Проекты Visual C# Из списка Типы проектов, нажмите кнопку Консольное приложение Из списка Шаблоны, а затем нажмите кнопку ОК.
    4. В обозревателе решений переименуйте файл Class1.cs в DistributedTransaction.cs.
  2. Удалите весь код из файла DistributedTransaction.cs.
  3. На Проект меню, нажмите кнопку Добавить ссылку, а затем добавьте следующие ссылки:
    • Пространства имен System.EnterpriseServices
    • System.Data.dll

  4. В файле AssemblyInfo.cs закомментируйте следующие строки кода:
    [assembly: AssemblyKeyFile("")]
    [assembly: AssemblyKeyName("")]
    					
  5. Добавьте следующий код в файл DistributedTransaction.cs:
    using System;
    using System.Data.SqlClient;
    using System.EnterpriseServices;
    using System.Runtime.CompilerServices;
    using System.Reflection;
    
    [assembly: ApplicationName("DistributedTransaction")]
    [assembly: AssemblyKeyFileAttribute("..\..\DistributedTransaction.snk")]
    
    
    namespace DistributedTransaction
    {
       /// <summary>
       /// Summary description for Class1.
       /// </summary>
       class Class1
       {
          /// <summary>
          /// The main entry point for the application.
          /// </summary>
          [STAThread]
          static void Main(string[] args)
          {
             try
             {
                DistributedTran myDistributedTran = new DistributedTran();
                myDistributedTran.TestDistributedTransaction();
             }
             catch (System.Data.SqlClient.SqlException e)
             {
                System.Console.WriteLine("Transaction Aborted: Error returned: " + e.Message);
             }         
          }
       }
       /// <summary>
       /// Summary description for TestApp.
       /// </summary>
       [Transaction(TransactionOption.Required)]
       public class DistributedTran: ServicedComponent 
       {
          public DistributedTran()
          {
          }
          [AutoComplete]
          public string TestDistributedTransaction()
          {
             // The following Insert statement goes to the first server.
             // This Insert statement does not produce any errors. 
             String insertCmdSql = "Insert Into TestTransaction (Col1, Col2) Values (1,'Sql Test')";
    
             // The following Delete statement goes to the second server.
             // Because the table does not exist, this code throws an exception.
             String exceptionCausingCmdSQL = "Delete from NonExistentTable";
                         
             // The following connection strings create instances of two SqlConnection objects
             // to connect to two different SQL Server servers in your environment.
             // Modify the connection strings as necessary for your environment.
             SqlConnection SqlConn1 = new SqlConnection("Server=Server_Name;uid=User_Id;database=DatabaseName;pwd=Password");
             SqlConnection SqlConn2 = new SqlConnection("Server=Server_Name;uid=User_Id;database=DatabaseName;pwd=Password");
    
             try
             {
                SqlCommand insertCmd = new SqlCommand(insertCmdSql,SqlConn1);
                SqlCommand exceptionCausingCmd = new SqlCommand(exceptionCausingCmdSQL,SqlConn2);
       
                // This command runs properly.
                insertCmd.Connection.Open();
                insertCmd.ExecuteNonQuery();
    
    
                // This command results in an exception, which automatically rolls back
                // the first command (the insertCmd command).
                exceptionCausingCmd.Connection.Open();
                int cmdResult = exceptionCausingCmd.ExecuteNonQuery();
                
                SqlConn1.Close();
                SqlConn2.Close();
    
                Console.WriteLine("Hello");
                
             }
             catch (System.Data.SqlClient.SqlException ex)
             {
                // After you catch the exception in this function, throw it. 
                // The service component receives this exception and 
                // aborts the transaction. The service component then
                // throws the same exception, and the calling function
                // receives the error message.
                Console.WriteLine (ex.Message);
                throw (ex);
             }
             finally 
             {
                // Close the connection.
                if (SqlConn1.State.ToString() == "Open")
                   SqlConn1.Close();
    
                if (SqlConn2.State.ToString() == "Open")
                   SqlConn2.Close();
             }
    
             return "Success";
           
          }
    
       }
    }
    					
  6. На Файл меню, нажмите кнопку Сохранить все.
  7. Нажмите кнопку Начало, выберите пункт Программы, выберите пункт Microsoft Visual Studio.NET, выберите пункт Visual Studio.NET инструменты, а затем нажмите кнопку Visual Studio.NET командной строки.
  8. Откройте папку, содержащую проект, а затем запустите следующую команду, чтобы подписать сборку строгим именем:
    sn -k DistributedTransaction.snk
  9. Постройте приложение.
  10. Создайте следующую таблицу в первый сервер SQL Server:
    if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[TestTransaction]') and OBJECTPROPERTY(id, N'IsUserTable') = 1)
    drop table [dbo].[TestTransaction]
    GO
    
    CREATE TABLE [dbo].[TestTransaction] (
    	[Col1] [int] NULL ,
    	[Col2] [varchar] (100) NULL 
    ) ON [PRIMARY]
    GO 
    					
  11. Запустите приложение. Обратите внимание на то, что появляется следующее сообщение об ошибке (который является ожидаемым поведением):
    Операции прервано: Возвращена ошибка: Недопустимое имя объекта «nonexistenttable».
  12. Откройте анализатор запросов SQL Server, добавьте следующий код и нажмите клавишу F5, чтобы выполнить запрос:
    USE NORTHWIND;
    SELECT * FROM TestTransaction WHERE Col1=1 AND Col2='Sql Test'
    						
    Обратите внимание, что запрос возвращает строки, так как транзакция прервана.
  13. Найдите следующий код в проекте Visual C#:
    String exceptionCausingCmdSQL = "Delete from NonExistentTable";
    						
    и замените инструкцию SQL допустимый запрос, который вызывает эту транзакцию. Например:
    String exceptionCausingCmdSQL = "Select @@Identity from customers";
    					
  14. Нажмите клавишу F5 чтобы скомпилировать и запустить приложение еще раз.
  15. Снова запустите команду на шаге 12 в Query Analyzer. Обратите внимание, что запрос возвращает строку, так как операция была завершена успешно.
ЗАМЕТКИ:
  • В этом примере не выполняет обработку ошибок.
  • Координатор распределенных транзакций Microsoft (MS DTC) и SQL Server должна быть запущена на всех клиентах и серверах.

Ссылки

Для получения дополнительных сведений щелкните следующий номер статьи базы знаний Майкрософт:
306296 ПРАКТИЧЕСКОЕ руководство: Создание которого было выполнено обслуживание.NET компонент, который использует транзакции в Visual C#.NET

Свойства

Код статьи: 316247 - Последний отзыв: 7 июня 2011 г. - Revision: 4.0
Информация в данной статье относится к следующим продуктам.
  • Microsoft ADO.NET 1.1
  • Microsoft Visual C# .NET 2002 Standard Edition
  • Microsoft Visual C# .NET 2003 Standard Edition
Ключевые слова: 
kbcompiler kbhowtomaster kbsqlclient kbsystemdata kbmt KB316247 KbMtru
Переведено с помощью машинного перевода
ВНИМАНИЕ! Перевод данной статьи был выполнен не человеком, а с помощью программы машинного перевода, разработанной корпорацией Майкрософт. Корпорация Майкрософт предлагает вам статьи, переведенные как людьми, так и средствами машинного перевода, чтобы у вас была возможность ознакомиться со статьями базы знаний KB на родном языке. Однако машинный перевод не всегда идеален. Он может содержать смысловые, синтаксические и грамматические ошибки, подобно тому как иностранец делает ошибки, пытаясь говорить на вашем языке. Корпорация Майкрософт не несет ответственности за неточности, ошибки и возможный ущерб, причиненный в результате неправильного перевода или его использования. Корпорация Майкрософт также часто обновляет средства машинного перевода.
Эта статья на английском языке:316247

Отправить отзыв

 

Contact us for more help

Contact us for more help
Connect with Answer Desk for expert help.
Get more support from smallbusiness.support.microsoft.com