วิธีการใช้ COM + ธุรกรรมในคอมโพเนนต์ Visual c#

การแปลบทความ การแปลบทความ
หมายเลขบทความ (Article ID): 816141 - ผลิตภัณฑ์ที่เกี่ยวข้องในบทความนี้
ขยายทั้งหมด | ยุบทั้งหมด

เนื้อหาบนหน้านี้

สรุป

บทความที่มีการทีละขั้นตอนนี้อธิบายวิธีการใช้ COM + (เซอร์วิสคอมโพเนนต์) ธุรกรรมในคลาสที่ Visual c# ชุดของการดำเนินการฐานข้อมูลจะถือเป็นหนึ่งหน่วย การดำเนินการทั้งหมดที่ได้สำเร็จ หรือ ถ้าล้มเหลวในการดำเนินการที่หนึ่ง ธุรกรรมทั้งหมดล้มเหลว ในกรณี latter ดำเนินการฐานข้อมูลใด ๆ ที่กำลังพยายามที่จะไม่ลงรายการบัญชีไปยังฐานข้อมูลที่อยู่ภายใต้

ความต้องการ

รายการต่อไปนี้อธิบายฮาร์ดแวร์ที่แนะนำ ซอฟต์แวร์ โครงสร้างพื้นฐานของเครือข่าย ทักษะ และทราบ และ service pack ที่คุณต้องมี:
  • Microsoft Windows 2000 Server SP1
  • Microsoft ข้อมูลบริการทางอินเทอร์เน็ต (IIS) รุ่น 4.0 หรือรุ่นใหม่กว่า
  • Microsoft Internet Explorer รุ่น 5.0, 5.5 หรือ 6.0
บทความนี้อนุมานว่า คุณไม่คุ้นเคยกับข้อความต่อไปนี้:
  • แนวคิดของทรานแซคชันและการประมวลผล
  • COM + (คอมโพเนนต์บริการ)

บริการทรานแซคชัน COM +

คุณสามารถใช้งานธุรกรรมที่มีการประมวลผลSystem.EnterpriseServicesnamespace ใน.NET Framework ของ Microsoft เมื่อต้องการเข้าใช้งาน COM + บริการของทรานแซคชัน สร้างคลาสได้ โดยให้ทำตามขั้นตอนต่อไปนี้::
  1. เริ่ม Visual Studio .NET หรือ Visual Studio 2005
  2. ในการแฟ้ม:เมนู ให้ชี้ไปที่ใหม่แล้ว คลิกProject.
  3. คลิกแสดงโครงการ c#ภายใต้ชนิดโครงการแล้ว คลิกไลบรารีคลาสภายใต้แม่แบบ. ชื่อโครงการprjEnterprise.

    หมายเหตุ:ใน Visual Studio 2005 คลิกvisual c#ภายใต้ชนิดโครงการแล้ว คลิกไลบรารีคลาสภายใต้แม่แบบ. ชื่อโครงการprjEnterprise.
  4. โดยค่าเริ่มต้น Class1 ถูกสร้างขึ้น
  5. คลิกขวาใน Explorer โซลูชันอ้างอิง:แล้ว คลิกเพิ่มการอ้างอิง.
  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. ทำการปรับปรุงแรกไปยังตารางผลิตภัณฑ์ ปรับปรุงนี้UnitsonOrderฟิลด์ด้วยการonOrderค่าสำหรับผลิตภัณฑ์ด้วย ID ตามที่ระบุในพารามิเตอร์การป้อนค่าสองครั้งแรก ใช้คำสั่ง SQL ต่อไปนี้เพื่อเรียกใช้โปรแกรมปรับปรุง SQL นี้:
    SqlCommand sqlCommand = new SqlCommand("UPDATE myProducts SET UnitsonOrder = " + onOrder + " WHERE productID = " + pID1, Conn);
    				sqlCommand.ExecuteNonQuery();
  16. ทำการปรับปรุงอื่นไปยังตารางผลิตภัณฑ์ ปรับปรุงนี้UnitsinStockฟิลด์ด้วยการinStockค่าสำหรับผลิตภัณฑ์ด้วย ID ตามที่ระบุไว้ในสาม และสี่อินพุตพารามิเตอร์ ใช้คำสั่ง SQL ต่อไปนี้เพื่อเรียกใช้โปรแกรมปรับปรุง SQL นี้:
    sqlCommand.CommandText = "UPDATE myProducts SET UnitsinStock = " + inStock + " WHERE productID = " + pID2;
    				sqlCommand.ExecuteNonQuery();
    
  17. เนื่องจากการปรับปรุงเหล่านี้เป็นส่วนหนึ่งของธุรกรรม COM + จะถูกกำหนดให้เป็นหน่วย กระบวนการsetCompleteวิธีการนี้contextUtilคลาสจากนั้นSystem.EnterpriseServicesใช้ namespace เพื่อที่ส่งธุรกรรม(อัพในกรณีนี้ในสองเด) ถ้าไม่มีข้อผิดพลาดถูก thrown:
    ContextUtil.SetComplete();
  18. ปิดการเชื่อมต่อกับฐานข้อมูล Northwind:
    Conn.Close();
    }
  19. คุณต้องสามารถจัดการข้อยกเว้นใด ๆ ที่เกิดขึ้นขณะเรียกใช้คำสั่ง SQL ดังนั้นคุณสามารถยกเลิกธุรกรรมทั้งหมด:
    catch(Exception e){ 
  20. กระบวนการsetAbortวิธีการนี้contextUtilคลาสจากนั้นSystem.EnterpriseServicesมีใช้ namespace เพื่อยกเลิกธุรกรรมทั้งหมด ถ้าการปรับปรุงแรกเป็นผลสำเร็จ และล้มเหลวของการปรับปรุงที่สอง การปรับปรุงไม่ถูกลงรายการบัญชีไปยังตารางผลิตภัณฑ์ ข้อยกเว้น caught thrown ไปยังผู้เรียก บ่งชี้ว่า ธุรกรรมล้มเหลว:
    ContextUtil.SetAbort();
    				throw e;
    }
  21. คอมโพเนนต์นี้ทำงานอย่างถูกต้อง ส่วนประกอบต้องมีชื่ออย่างแน่นหนา สร้างชื่อที่เข้มงวด และประกอบ ด้วยชื่อที่รัดกุมที่เข้าสู่ระบบแล้ว โดยให้ทำตามขั้นตอนต่อไปนี้::
    1. ที่พร้อมท์คำสั่งของ Visual Studio .NET พิมพ์snEnterprise.snk -k sn.exeเมื่อต้องการสร้างแฟ้มคีย์ สำหรับข้อมูลเพิ่มเติมเกี่ยวกับแอสเซมบลีที่เซ็นชื่อด้วยชื่อที่เข้มงวด ให้ดูที่เอกสารประกอบของ.NET Framework SDK
    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เขตข้อมูลสำหรับผลิตภัณฑ์ล้มเหลวเนื่องจากหมายเลขผลิตภัณฑ์ที่ระบุไม่มีอยู่ในตารางผลิตภัณฑ์ ซึ่งส่งผลในความล้มเหลวของธุรกรรม และทรานแซคชันที่ถูกละเว้น
  1. ใน Visual Studio .NET หรือ Visual Studio 2005 ชี้ไปที่ใหม่ในการแฟ้ม:เมนู แล้วคลิกProject.
  2. คลิกแสดงโครงการ c#ภายใต้ชนิดโครงการแล้ว คลิกคอนโซลแอพลิเคชันภายใต้แม่แบบ.

    หมายเหตุ:ใน Visual Studio 2005 คลิกvisual c#ภายใต้ชนิดโครงการแล้ว คลิกคอนโซลแอพลิเคชันภายใต้แม่แบบ.
  3. ในการชื่อ:กล่องข้อความ ชนิดtestES. ตรวจสอบให้แน่ใจว่าการเพิ่มโซลูชันเลือกตัวเลือก
  4. คลิกตกลงเมื่อต้องการเพิ่มโครงการนี้เพื่อการแก้ไขปัญหา
  5. สำหรับtestESเมื่อต้องการทดสอบclsESคุณต้องเพิ่มการอ้างอิง คลิกขวาใน Explorer โซลูชันอ้างอิง:ภายใต้testES(ที่คุณเพิ่งเพิ่ม), แล้ว คลิกเพิ่มการอ้างอิง.
  6. กระบวนการเพิ่มการอ้างอิงกล่องโต้ตอบปรากฏขึ้น ในการโครงการแท็บ คลิกสองครั้งprjEnterprise.
  7. การอ้างอิงปรากฏอยู่ภายใต้คอมโพเนนต์ที่เลือก. คลิกตกลงเมื่อต้องการเพิ่มการอ้างอิงนี้กับโครงการ
  8. เพิ่มการอ้างอิงถึงโครงการในไลบรารี System.EnterpriseServices คลิกขวาใน Explorer โซลูชันอ้างอิง:แล้ว คลิกเพิ่มการอ้างอิง.
  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 ผลิตภัณฑ์อยู่ในตารางผลิตภัณฑ์ กระบวนการonOrderฟิลด์สำหรับผลิตภัณฑ์ 1 มีการปรับปรุงการ 777 และinStockมีการปรับปรุงเขตข้อมูลสำหรับผลิตภัณฑ์ 2 เพื่อ 888 เนื่องจากธุรกรรมนี้เสร็จสมบูรณ์แล้ว คุณได้รับข้อความต่อไปนี้ในหน้าต่างการแสดงผล
    ความสำเร็จที่หนึ่ง - ธุรกรรม


    การเรียกที่สองdbAccessล้มเหลว ดังนั้น ต่อปรับปรุงคำชี้แจงสิทธิ์ในdbAccessเมื่อต้องการผลิตภัณฑ์ ตารางถูกลงรายการบัญชีไปยังฐานข้อมูล แม้ว่าผลิตภัณฑ์ 1 อาจมีการonOrderฟิลด์ที่ปรับปรุงเป็น5ผลิตภัณฑ์ 2 ไม่ได้inStockตั้งค่าของฟิลด์-20. เนื่องจากข้อจำกัดที่กำหนดไว้ในคำนิยามตารางผลิตภัณฑ์ การinStockไม่สามารถมีตัวเลขที่เป็นค่าลบ

    ดังนั้น ซึ่งเรียกใช้เมื่อต้องการdbAccessล้มเหลว และธุรกรรมทั้งหมดล้มเหลว ตารางผลิตภัณฑ์ยังคงเป็นที่ก่อนการเรียกไปยังdbAccess. กระบวนการตรวจจับรายงานจัดการการแจ้งเตือนของความล้มเหลวของธุรกรรมจากdbAccessและคุณได้รับข้อความแสดงข้อผิดพลาดต่อไปนี้ในหน้าต่างการแสดงผล:
    ความล้มเหลวของธุรกรรม
  14. ตรวจสอบเนื้อหาของตารางผลิตภัณฑ์ Northwind โดยใช้ตัวจัดการองค์กรของเซิร์ฟเวอร์ SQL เมื่อคุณดูผลิตภัณฑ์ 1,onOrderฟิลด์จะเท่ากับ 777 เมื่อคุณดูผลิตภัณฑ์ 2,instockฟิลด์ว่าง 888 ดังนั้น เรียกที่สองไปยังdbAccess(ซึ่งจะทำให้ค่าที่แตกต่างกันสำหรับฟิลด์เหล่านี้) ล้มเหลว

แก้ไข

  • ตรวจสอบให้แน่ใจว่า โครงการที่ใช้ COM + บริการมีชื่อที่รัดกุม
  • ระดับชั้นที่ใช้เซอร์วิส COM + ต้องสืบทอดจากคอมโพเนนต์ที่ให้บริการ ส่วนประกอบที่ให้บริการที่อยู่ในนั้นSystem.EnterpriseServicesnamespace
  • ในขณะทำการตรวจแก้จุดบกพร่อง ธุรกรรมอาจเวลาออกก่อนที่มีกำหนด หรือยกเลิก เมื่อต้องการหลีกเลี่ยงการหมดเวลา ใช้คุณสมบัติการหมดเวลาลงในแอตทริบิวต์ของธุรกรรม ในตัวอย่างต่อไปนี้ วิธีการเชื่อมโยงมี 1,200 วินาทีในการทำธุรกรรมใด ๆ ก่อนหมดเวลา:
    [Transaction(TransactionOption.Required,timeout=1200)]

ข้อมูลอ้างอิง

สำหรับข้อมูลเพิ่มเติม แวะไปไซต์เว็บ Network (MSDN) นักพัฒนา Microsoft ต่อไปนี้:
COM + รวม: วิธี.NET บริการองค์กรสามารถช่วยคุณ Build แจกจ่ายแอปพลิเคชัน
http://msdn.microsoft.com/msdnmag/issues/01/10/complus/default.aspx
ส่วนประกอบที่ให้บริการ
.aspx http://msdn2.microsoft.com/en-us/library/Aa289839 (VS.71)

คุณสมบัติ

หมายเลขบทความ (Article ID): 816141 - รีวิวครั้งสุดท้าย: 18 ตุลาคม 2553 - Revision: 2.0
ใช้กับ
  • Microsoft Visual C# 2005 Express Edition
  • Microsoft Visual C# .NET 2003 Standard Edition
  • Microsoft Visual C# .NET 2002 Standard Edition
Keywords: 
kbcomplusobj kbsqlprog kbsqlclient kbdatabase kbhowtomaster kbmt KB816141 KbMtth
แปลโดยคอมพิวเตอร์
ข้อมูลสำคัญ: บทความนี้แปลโดยซอฟต์แวร์การแปลด้วยคอมพิวเตอร์ของ Microsoft แทนที่จะเป็นนักแปลที่เป็นบุคคล Microsoft มีบทความที่แปลโดยนักแปลและบทความที่แปลด้วยคอมพิวเตอร์ เพื่อให้คุณสามารถเข้าถึงบทความทั้งหมดในฐานความรู้ของเรา ในภาษาของคุณเอง อย่างไรก็ตาม บทความที่แปลด้วยคอมพิวเตอร์นั้นอาจมีข้อบกพร่อง โดยอาจมีข้อผิดพลาดในคำศัพท์ รูปแบบการใช้ภาษาและไวยากรณ์ เช่นเดียวกับกรณีที่ชาวต่างชาติพูดผิดเมื่อพูดภาษาของคุณ Microsoft ไม่มีส่วนรับผิดชอบต่อความคลาดเคลื่อน ความผิดพลาดหรือความเสียหายที่เกิดจากการแปลเนื้อหาผิดพลาด หรือการใช้บทแปลของลูกค้า และ Microsoft มีการปรับปรุงซอฟต์แวร์การแปลด้วยคอมพิวเตอร์อยู่เป็นประจำ
ต่อไปนี้เป็นฉบับภาษาอังกฤษของบทความนี้:816141

ให้ข้อเสนอแนะ

 

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