Visual C++ .NET bileşeni veya Visual C++ 2005 bileşeni COM + işlemleri kullanma

Makale çevirileri Makale çevirileri
Makale numarası: 815814 - Bu makalenin geçerli olduğu ürünleri görün.
Hepsini aç | Hepsini kapa

Bu Sayfada

Özet

Bu adım adım makalede, COM + (Component Services) kullanmayı açıklamaktadır hareketleri bir <a0>Microsoft Visual C++ .NET</a0> sınıfında veya bir Microsoft Visual C++ 2005 sınıf. Bir dizi veritabanı işlemi, bir birim olarak kabul edilir. Işlemlerinin tümü başarılı ya da, bir işlem başarısız olursa, tüm işlem başarısız olur. Ikinci durumda, çalışmış herhangi bir veritabanı işlemi için temel veritabanını nakledilir.

Gereksinimler

Bu makalede, aşağıdaki konularda bilgi sahibi olduğunuz varsayılmaktadır:
  • Işlem kavramları ve işleme
  • COM + (Bileşen Hizmetleri)

COM + işlem Hizmetleri

Microsoft .NET Framework System.EnterpriseServices'ı ad ile işlem hareket uygulayabilirsiniz. COM + erişimi, işlem Hizmetleri, bir sınıf oluşturmak. Bunu yapmak için şu adımları izleyin:
  1. Visual Studio .NET veya Visual Studio 2005'i başlatın.
  2. Dosya menüsünde Yeni ' nin üzerine gelin ve sonra Project ' i tıklatın.
  3. Altında Project Types, Visual C++ Projects ' ı tıklatın ve şablonları altında Class Library (.NET)'ı tıklatın. Proje prjEnterprise adı.

    Not Visual Studio 2005 ' te Project Types altında Visual C++ ' ı tıklatın ve Sınıf kitaplığışablonları altında tıklatın.
  4. Solution Explorer'da (Çözüm Gezgini), Başvurular ' ı sağ tıklatın ve sonra Add Reference</a1>'ı tıklatın.
  5. <a0>Başvuru Ekle</a0> iletişim kutusunda <a2>NET</a2> sekmesini tıklatın.
  6. Bileşen adı altında System.EnterpriseServices'ı</a1> çift tıklatın.
  7. Seçili bileşenler altında System.EnterpriseServices'ı göründüğünden emin olun ve sonra Tamam ' ı tıklatın.
  8. PrjEnterprise.h dosyasında herhangi bir diğer ifadeleri önce aşağıdaki kodu ekleyin:
    using namespace System;
    using namespace System::Data;
    using namespace System::Data::SqlTypes;
    using namespace System::Data::Common;
    using namespace System::EnterpriseServices;
    using namespace System::Data::SqlClient;
    
  9. ClsES prjEnterprise.h dosyasına adlı yeni bir sınıf ekleyin.
  10. COM + işlem hizmetleri kullanmak için <a0></a0>, sınıfınıza (clsES) işlevselliği ServicedComponent sınıfından gibi devralmasını emin olun:
    public __gc class clsES:public ServicedComponent
    
  11. Bir Transaction özniteliği sınıfı için işlem desteği düzeyini belirlemenizi aşağıdaki gibi kullanın:
    [Transaction(TransactionOption::Required,Timeout=5)]public __gc class clsES:public ServicedComponent
    
  12. Yöntem dört giriş tamsayı Parametreler alan clsES sınıfında oluşturun. Sınıf dbAccess adı. Ilk iki parametre, bu ürün için sipariş bir ürün KIMLIĞI ve birimleri sağlar. Ikinci iki parametre, bu ürün için bir ürün KIMLIĞI ve stok biriminde sağlar. Bu yöntem, bir veritabanı işlemler bir işlem olarak ele alınması için bu belirtilen ürün kimliklerini gerçekleştirir:
    public:	void dbAccess(int pID1, int onOrder, int pID2, int inStock)
  13. DbAccess yönteminde, Northwind için bir <a0>SQL</a0> bağlantı nesnesi oluştur veritabanı ve bağlantıyı açar. Aşağıdaki veritabanı'nı kullanarak veritabanı işlemleri oluşur:
    SqlConnection * Conn = new SqlConnection("user id=<username>;password=<password>;Initial Catalog=northwind;Data Source=<Your SQL Server name>;");
    Conn->Open();
    SQL Server sunucunuz için doğru değerler yansıtmak için bağlantı dizesi parametrelerini değiştirmek için Not anımsa.
  14. Veritabanı işleme sırasında oluşabileceği özel durumlar yakalanacak deneyin bloğu ayarlayın. Hareket iptal etmek için bu özel durumları yakalamak gerekir. Deneyin bloğu iki veritabanı işlemleri içerir. Her operasyon için belirtilen Ürünler tablosundaki kayıt başka bir alana güncelleştirir.
    try { 
    
  15. Ürünler tablosuna ilk güncelleştirmeyi uygulayın. Ürün Kimliği, belirtilen ilk iki giriş parametreleri için <a1>onOrder</a1> değeriyle SiparişBirimleri alanı güncelleştirin. Bu SQL güncelleştirmeyi çalıştırmak için aşağıdaki SQL komutunu kullanın:
    SqlCommand * sqlCommand = new SqlCommand("UPDATE Products SET UnitsonOrder = @onOrderString WHERE productID = @pID1String ", Conn);
    sqlCommand->Parameters->Add(new SqlParameter("@onOrderString",SqlDbType::VarChar ,
    	40,ParameterDirection::Input,true,0,0,"Description",DataRowVersion::Current,onOrder.ToString()));
    sqlCommand->Parameters->Add(new SqlParameter("@pID1String", SqlDbType::VarChar,
    	40,ParameterDirection::Input,true,0,0,"Description",DataRowVersion::Current,pID1.ToString()));
    sqlCommand->ExecuteNonQuery();
    
  16. Başka bir güncelleştirmenin Ürünler tablosuna gerçekleştirin. StokBirimleri alanıyla güncelleştirme inStock ürün kimliği, üçüncü ve dördüncü giriş parametrelerinde belirtilen değeri. Bu SQL güncelleştirmeyi çalıştırmak için aşağıdaki SQL komutunu kullanın:
    sqlCommand->Parameters->Add(new SqlParameter("@inStockString",SqlDbType::VarChar ,
    	40,ParameterDirection::Input,true,0,0,"Description",DataRowVersion::Current,inStock.ToString()));
    sqlCommand->Parameters->Add(new SqlParameter("@pID2String", SqlDbType::VarChar,
    	40,ParameterDirection::Input,true,0,0,"Description",DataRowVersion::Current,pID2.ToString()));
    sqlCommand->ExecuteNonQuery();
    
  17. Bu güncelleştirmeler, bir COM + işlem parçası olduğundan, birim olarak kaydedilmiş kullanılırlar. Hareketi tamamlamak için kullanılan System.EnterpriseServices'ı ad contextUtil</a1> sınıfının setComplete yöntemi (iki bu durumda güncelleştirir) varsa, hata özel durum oluşturuldu:
    ContextUtil::SetComplete(); 
    
  18. Northwind veritabanı bağlantısı'nı kapatmak için şu kodu kullanın: <a1>
    Conn->Close(); }
    
  19. Hareketin tamamı iptal etmek için SQL komutlarını çalıştırırken oluşan özel durumlar catch gerekir:
    catch(Exception * e){ 
    
  20. SetAbort yöntemi System.EnterpriseServices'ı ad contextUtil</a1> sınıfının tüm işlemin iptal etmek için kullanılır. Ilk güncelleştirme başarısız olur ve ikinci güncelleştirme başarısız olursa, her iki güncelleştirmenin Ürünler tablosunda deftere nakledilir. Özel durum yakaladı, işlemin başarısız olduğunu gösteren çağırana atılır:
    ContextUtil::SetAbort();
    throw e; }
    
  21. Düzgün çalışabilmesi bu bileşeni için bileşen kesin adı olmalıdır. Kesin adı oluşturun ve sonra da derleme kesin adı ile oturum açın. Bunu yapmak için şu adımları izleyin:
    1. Visual Studio. NET'in komut isteminde, bir anahtar oluşturarak sn.exe -k snEnterprise.snk yazın. Imzalama derlemeler kesin adları hakkında daha fazla bilgi için .NET Framework SDK belgelerine bakın.
    2. SnEnterprise.snk proje klasörünüze kopyalayın.
    3. Önce veya sonra diğer derleme özniteliği ifadeleri, AssemblyInfo.vc içinde aşağıdaki kod satırını ekleyin:
      [assembly:AssemblyKeyFileAttribute("..\\snEnterprise.snk")]; 
    4. Kaydedin ve sonra da projenizin oluşturun.

Tam kod listesi

Not Remember to change your connection string parameters to reflect the correct values for your SQL Server server.
#pragma once

using namespace System;
using namespace System::Data;
using namespace System::Data::SqlTypes;
using namespace System::Data::Common;
using namespace System::EnterpriseServices;
using namespace System::Data::SqlClient;

namespace prjEnterprise
{
	
	[Transaction(TransactionOption::Required,Timeout=5)]
	public __gc class clsES:public ServicedComponent
	{
	public:	SqlConnection * Conn;

	public:	void dbAccess(int pID1, int onOrder, int pID2, int inStock)
		{
			try
			{			
				SqlConnection * Conn = new SqlConnection("user id=<username>;password=<password>;Initial Catalog=northwind;Data Source=<Your SQL Server name>;");
				Conn->Open();
				
				SqlCommand * sqlCommand = new SqlCommand("UPDATE Products SET UnitsonOrder = @onOrderString WHERE productID = @pID1String ", Conn);
				sqlCommand->Parameters->Add(new SqlParameter("@onOrderString",SqlDbType::VarChar ,
					40,ParameterDirection::Input,true,0,0,"Description",DataRowVersion::Current,onOrder.ToString()));
				sqlCommand->Parameters->Add(new SqlParameter("@pID1String", SqlDbType::VarChar,
					40,ParameterDirection::Input,true,0,0,"Description",DataRowVersion::Current,pID1.ToString()));
				sqlCommand->ExecuteNonQuery();
				
				sqlCommand->CommandText = "UPDATE Products SET UnitsinStock = @inStockString WHERE productID = @pID2String" ;
				sqlCommand->Parameters->Add(new SqlParameter("@inStockString",SqlDbType::VarChar ,
					40,ParameterDirection::Input,true,0,0,"Description",DataRowVersion::Current,inStock.ToString()));
				sqlCommand->Parameters->Add(new SqlParameter("@pID2String", SqlDbType::VarChar,
					40,ParameterDirection::Input,true,0,0,"Description",DataRowVersion::Current,pID2.ToString()));
				sqlCommand->ExecuteNonQuery();

				ContextUtil::SetComplete();
				Conn->Close();
			}
			catch(Exception * e)
			{
				ContextUtil::SetAbort();
			
				throw e;
			}			
		}
	};


}
Common language runtime eklemeniz gerekir Not desteği derleyici seçeneği (/ clr:oldSyntax) başarıyla önceki kod örneğini derlemek için Visual C++ 2005'te. Visual C++ 2005'te ortak dil çalışma zamanı destek derleyici seçeneği eklemek için aşağıdaki adımları izleyin:
  1. Project tıklatın ve sonra <ProjectName> Özellikleri.

    Not<ProjectName> projenin adı için yer tutucudur.
  2. Yapılandırma özellikleri ' ni genişletin ve sonra Genel ' i tıklatın.
  3. Seçmek için tıklatın ortak dil çalışma zamanı modülü ve Destek, eski sözdizimi (/ clr:oldSyntax)Common Language Runtime desteği proje ayarında sağ bölmede, Uygula ' yı tıklatın ve sonra Tamam ' ı tıklatın.
Ortak dil çalıştırma hakkında daha fazla bilgi için derleyici seçeneği destekleyen, aşağıdaki Microsoft Web sitesini ziyaret edin:
/ clr (ortak dil çalışma zamanı derleme)
http://msdn2.microsoft.com/en-us/library/k8d11d4s.aspx

Çalıştığından emin olun.

Bu kod sınamak için <a0></a0>, clsES sınıfı kullanan Console Application bir proje oluşturun. Bir durumda, bir hareket başarılı ve SiparişBirimleri ve StokBirimleri alanların belirtilen ürün için güncelleştirildi. Ikinci durumda, SiparişBirimleri alan için belirtilen ürün için güncelleştirmenin başarılı olur, ancak Products tablosunda belirtilen ürün numarası olmadığından, StokBirimleri alan için bir ürün için güncelleştirme başarısız. Bu işlem başarısız olur ve hareket göz ardı edilir.
  1. Başlangıç Visual Studio .NET veya Visual Studio 2005.
  2. Dosya menüsünde Yeni ' nin üzerine gelin ve sonra Project ' i tıklatın.
  3. Altında Project Types, Visual C++ Projects ' ı tıklatın ve şablonları altında Console Application (.NET)'ı tıklatın.

    Not Visual Studio 2005 ' te Project Types altında Visual C++ ' ı tıklatın ve şablonları altında CLR Console Application ' ı tıklatın.
  4. Ad metin kutusuna testES yazın. Solution Ekle) seçeneğinin seçili olduğundan emin olun.
  5. Bu proje için çözüm eklemek için Tamam ' ı tıklatın.
  6. PrjEnterprise sınamak için testES, bir başvuru eklemeniz gerekir. Solution Explorer'da (Çözüm Gezgini), başvuru (yani, eklediğiniz) testES altında sağ tıklatın ve Add Reference</a1>'ı tıklatın.
  7. <a0>Başvuru Ekle</a0> iletişim kutusu görüntülenir. Projeler sekmesinde prjEnterprise çift tıklatın.
  8. Başvuru, altında görünür Seçili bileşenleri. Bu başvuruyu projeye eklemek için Tamam ' ı tıklatın.
  9. Projeye bir başvuru için System.EnterpriseServices'ı ad alanı ekleyin. Solution Explorer'da (Çözüm Gezgini), Başvurular ' ı sağ tıklatın ve sonra Add Reference</a1>'ı tıklatın.
  10. <a0>Başvuru Ekle</a0> iletişim kutusu görüntülenir. Bileşen adı altında .NET</a0> sekmesinde, System.EnterpriseServices'ı çift tıklatın.
  11. Seçili bileşenler altında System.EnterpriseServices'ı olduğundan emin olun. Tıklatın Tamam.
  12. TestES ' ı sağ tıklatın ve sonra da <a2>Başlangıç proje olarak ayarla</a2>'ı tıklatın.
  13. Aşağıdaki kaynak kodu testES sınıfının _tmain() işlev Yapıştır:
    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");
    	//Console::WriteLine("Error Message: {0}",e->Message);	 
    	//uncomment this line if you must get detailed error information
    }
    
  14. Sınama kod çalıştırmak için F5 tuşuna basın.

    7. Adımda kodda dbAccess ilk Çağrı başarılı olur. Ürün 1 ve ürün 2 Products tablosunda var. Ürün 1 için'onOrder alan 777 için güncelleştirilir ve inStock ürün 2 888 için güncelleştirilmesi için alan. Bu işlem başarılı oldu, çünkü çıktı penceresinde aşağıdaki iletiyi alırsınız:
    HAREKET BİR - BAŞARILI
    Ikinci dbAccess çağrısı başarısız. Bu nedenle, her iki güncelleştirmenin deyiminde dbAccess Ürünler tablosuna veritabanına deftere nakledilir. Ancak Ürün 1, 5 ' e güncelleştirilmiş SiparişBirimleri alanına sahip olabilir, ürün 2, -20 için ayarlanan StokBirimleri alanına sahip olamaz. Ürün Tablo tanımı içinde tanımlanan bir kısıtlama nedeniyle, negatif sayılar için StokBirimleri izin verilmiyor. Bu nedenle dbAccess çağrısı başarısız olur ve hareketin tamamı başarısız olur. Ürünler tablosunda, dbAccess çağrısı önce olduğu gibi kalır. Catch ekstresi dbAccess hareket hatasından bildirim işleme ve çıktı penceresinde aşağıdaki hata iletisini alırsınız:
    İŞLEM HATASI
  15. SQL Server Enterprise Manager'ı kullanarak Northwind Products tablosunun içeriğini inceleyin. Ürün 1'i görüntülediğinizde, Borç ve Alacak bakiyesi SiparişBirimleri alan 777 için eşit olur. Ürün 2 görüntülediğinizde, StokBirimleri alan 888 kullanılır. Bu nedenle, ikinci (kısaca, bu alanlar için başka değerler de olmuş olabilir) dbAccess çağrısı başarısız.

SORUN GİDERME

  • COM + hizmetlerini kullanan herhangi bir proje kesin adı olduğundan emin olun.
  • COM + hizmetlerini kullanan herhangi bir sınıfı bir servis verilen bileşeninden devralınmalıdır. Servis verilen bileşen System.EnterpriseServices'ı ad alanında bulunur.
  • Tamamlanmış veya iptal edildi önce ayıklarken, bir hareket zaman. Zaman aşımını önlemek için <a0></a0>, işlem özniteliği bir zaman aşımı özelliğini kullanın. Aşağıdaki örnekte, 1.200 zaman aşımına uğramadan önce herhangi bir hareket saniye ilişkili yöntemi vardır:
    [Transaction(TransactionOption::Required,Timeout=1200)]
    
  • Bazı beklenmeyen özel durum kodu çalıştırırken alabilirsiniz. Bu özel durumlar hakkında daha fazla bilgi almak için <a0></a0>, son iki adım 13 satırları uncomment:
    Console::WriteLine("Error Message: {0}",e->Message);
    uncomment this line if you must get detailed error information

Referanslar

Ek bilgi için aşağıdaki Microsoft Developer Network (MSDN) Web sitelerini ziyaret edin:
COM + ıntegration: Nasıl .NET Enterprise Services Build yardımcı olabilir uygulamalar Dağıtılmış
Servis verilen bileşenleri

Özellikler

Makale numarası: 815814 - Last Review: 14 Kasım 2007 Çarşamba - Gözden geçirme: 3.2
Bu makaledeki bilginin uygulandığı durum:
  • Microsoft Visual C++ 2005 Express Edition
  • Microsoft Visual C++ .NET 2003 Standard Edition
Anahtar Kelimeler: 
kbmt kbsqlclient kbcomplusqc kbcode kbhowtomaster kbhowto KB815814 KbMttr
Machine-translated Article
ÖNEMLİ: Bu makale, bir kişi tarafından çevrilmek yerine, Microsoft makine-çevirisi yazılımı ile çevrilmiştir. Microsoft size hem kişiler tarafından çevrilmiş, hem de makine-çevrisi ile çevrilmiş makaleler sunar. Böylelikle, bilgi bankamızdaki tüm makalelere, kendi dilinizde ulaşmış olursunuz. Bununla birlikte, makine tarafından çevrilmiş makaleler mükemmel değildir. Bir yabancının sizin dilinizde konuşurken yapabileceği hatalar gibi, makale; kelime dağarcığı, söz dizim kuralları veya dil bilgisi açısından yanlışlar içerebilir. Microsoft, içeriğin yanlış çevrimi veya onun müşteri tarafından kullanımından doğan; kusur, hata veya zarardan sorumlu değildir. Microsoft ayrıca makine çevirisi yazılımını sıkça güncellemektedir.
Makalenin İngilizcesi aşağıdaki gibidir:815814

Geri Bildirim Ver

 

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