บทความที่มีการทีละขั้นตอนนี้อธิบายวิธีการใช้ 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 + บริการของทรานแซคชัน สร้างคลาสได้ โดยให้ทำตามขั้นตอนต่อไปนี้::
- เริ่ม Visual Studio .NET หรือ Visual Studio 2005
- ในการแฟ้ม:เมนู ให้ชี้ไปที่ใหม่แล้ว คลิกProject.
- คลิกแสดงโครงการ c#ภายใต้ชนิดโครงการแล้ว คลิกไลบรารีคลาสภายใต้แม่แบบ. ชื่อโครงการprjEnterprise.
หมายเหตุ:ใน Visual Studio 2005 คลิกvisual c#ภายใต้ชนิดโครงการแล้ว คลิกไลบรารีคลาสภายใต้แม่แบบ. ชื่อโครงการprjEnterprise. - โดยค่าเริ่มต้น Class1 ถูกสร้างขึ้น
- คลิกขวาใน Explorer โซลูชันอ้างอิง:แล้ว คลิกเพิ่มการอ้างอิง.
- กระบวนการเพิ่มการอ้างอิงกล่องโต้ตอบปรากฏขึ้น
ภายใต้ชื่อคอมโพเนนต์ในการ.NETแท็บ คลิกสองครั้งSystem.EnterpriseServices.
- ตรวจสอบให้แน่ใจว่าSystem.EnterpriseServicesปรากฏภายใต้คอมโพเนนต์ที่เลือก. คลิกตกลง.
- เพิ่มรหัสต่อไปนี้ก่อนที่จะให้คำสั่งอื่น ๆ ในแฟ้ม Class1.cs:
using System.EnterpriseServices;
using System.Data.SqlClient;
- เพิ่มคลาใหม่ที่ชื่อclsESไปยังแฟ้ม Class1.cs
- เมื่อต้องการใช้ COM + ของทรานแซคชันบริการ, (คลาของคุณclsES) รับต้องเอาฟังก์ชันการทำงานจาก ServicedComponent เป็นดังนี้:
public class clsES : ServicedComponent
- aธุรกรรมแอตทริบิวต์ถูกใช้เพื่อระบุระดับการสนับสนุนของทรานแซคชันสำหรับคลาเป็นดังนี้:
[Transaction(TransactionOption.Required)]public class clsES : ServicedComponent
- วิธีการในการสร้างการclsESคลา และกำหนดชื่อดังกล่าวdbAccessซึ่งได้รับพารามิเตอร์ทั้งสี่ของจำนวนเต็มที่สำหรับการป้อนค่า พารามิเตอร์ที่สองครั้งแรกให้เป็นหมายเลขผลิตภัณฑ์ และหน่วยในใบสั่งสำหรับผลิตภัณฑ์นั้น พารามิเตอร์ที่สองประการที่สองให้เป็นหมายเลขผลิตภัณฑ์ และหน่วยในสินค้าคงคลังสำหรับผลิตภัณฑ์นั้น วิธีนี้ดำเนินการชุดของฐานข้อมูลการดำเนินงานกับผลิตภัณฑ์เหล่านี้ระบุหมายเลขที่จะถูกจัดเป็นธุรกรรม:
void dbAccess(int pID1,int onOrder, int pID2, int inStock)
- ในการdbAccessวิธีการ สร้างวัตถุการเชื่อมต่อ SQL สำหรับ Northwind ในฐานข้อมูล และจากนั้น เปิดการเชื่อมต่อ ฐานข้อมูลการดำเนินงานที่เกิดขึ้น โดยใช้ฐานข้อมูลต่อไปนี้:
หมายเหตุ:อย่าลืมเปลี่ยนพารามิเตอร์สตริงการเชื่อมต่อต่อไปนี้เพื่อให้สะท้อนถึงค่าที่ถูกต้องสำหรับเซิร์ฟเวอร์ SQL Server ของคุณ
SqlConnection Conn = new SqlConnection("user id=<username>;password=<strong password>;Initial Catalog=northwind;Data Source=2E124\\SQL;");
Conn.Open();
- ตั้งค่าเป็นลองการบล็อกการจับภาพข้อยกเว้นใด ๆ ที่อาจเกิดขึ้นในระหว่างการประมวลผลฐานข้อมูล คุณต้องสามารถจัดการข้อยกเว้นเหล่านี้เพื่อยกเลิกธุรกรรม กระบวนการลองบล็อกรวมถึงการดำเนินการฐานข้อมูลที่สอง การดำเนินการแต่ละการปรับปรุงเขตข้อมูลแตกต่างกันในระเบียนตารางผลิตภัณฑ์ที่ระบุ
- ทำการปรับปรุงแรกไปยังตารางผลิตภัณฑ์ ปรับปรุงนี้UnitsonOrderฟิลด์ด้วยการonOrderค่าสำหรับผลิตภัณฑ์ด้วย ID ตามที่ระบุในพารามิเตอร์การป้อนค่าสองครั้งแรก ใช้คำสั่ง SQL ต่อไปนี้เพื่อเรียกใช้โปรแกรมปรับปรุง SQL นี้:
SqlCommand sqlCommand = new SqlCommand("UPDATE myProducts SET UnitsonOrder = " + onOrder + " WHERE productID = " + pID1, Conn);
sqlCommand.ExecuteNonQuery(); - ทำการปรับปรุงอื่นไปยังตารางผลิตภัณฑ์ ปรับปรุงนี้UnitsinStockฟิลด์ด้วยการinStockค่าสำหรับผลิตภัณฑ์ด้วย ID ตามที่ระบุไว้ในสาม และสี่อินพุตพารามิเตอร์ ใช้คำสั่ง SQL ต่อไปนี้เพื่อเรียกใช้โปรแกรมปรับปรุง SQL นี้:
sqlCommand.CommandText = "UPDATE myProducts SET UnitsinStock = " + inStock + " WHERE productID = " + pID2;
sqlCommand.ExecuteNonQuery();
- เนื่องจากการปรับปรุงเหล่านี้เป็นส่วนหนึ่งของธุรกรรม COM + จะถูกกำหนดให้เป็นหน่วย กระบวนการsetCompleteวิธีการนี้contextUtilคลาสจากนั้นSystem.EnterpriseServicesใช้ namespace เพื่อที่ส่งธุรกรรม(อัพในกรณีนี้ในสองเด) ถ้าไม่มีข้อผิดพลาดถูก thrown:
ContextUtil.SetComplete();
- ปิดการเชื่อมต่อกับฐานข้อมูล Northwind:
- คุณต้องสามารถจัดการข้อยกเว้นใด ๆ ที่เกิดขึ้นขณะเรียกใช้คำสั่ง SQL ดังนั้นคุณสามารถยกเลิกธุรกรรมทั้งหมด:
- กระบวนการsetAbortวิธีการนี้contextUtilคลาสจากนั้นSystem.EnterpriseServicesมีใช้ namespace เพื่อยกเลิกธุรกรรมทั้งหมด ถ้าการปรับปรุงแรกเป็นผลสำเร็จ และล้มเหลวของการปรับปรุงที่สอง การปรับปรุงไม่ถูกลงรายการบัญชีไปยังตารางผลิตภัณฑ์ ข้อยกเว้น caught thrown ไปยังผู้เรียก บ่งชี้ว่า ธุรกรรมล้มเหลว:
ContextUtil.SetAbort();
throw e;
}
- คอมโพเนนต์นี้ทำงานอย่างถูกต้อง ส่วนประกอบต้องมีชื่ออย่างแน่นหนา สร้างชื่อที่เข้มงวด และประกอบ ด้วยชื่อที่รัดกุมที่เข้าสู่ระบบแล้ว โดยให้ทำตามขั้นตอนต่อไปนี้::
- ที่พร้อมท์คำสั่งของ Visual Studio .NET พิมพ์snEnterprise.snk -k sn.exeเมื่อต้องการสร้างแฟ้มคีย์ สำหรับข้อมูลเพิ่มเติมเกี่ยวกับแอสเซมบลีที่เซ็นชื่อด้วยชื่อที่เข้มงวด ให้ดูที่เอกสารประกอบของ.NET Framework SDK
- การคัดลอก snEnterprise.snk ไปยังโฟลเดอร์โครงการของคุณ
- ใน AssemblyInfo.vc เพิ่มบรรทัดต่อไปนี้ของรหัสก่อน หรือหลัง จากที่อื่นงบแอตทริบิวต์ของแอสเซมบลี:
[assembly: AssemblyKeyFileAttribute("..\\..\\snEnterprise.snk")] - บันทึก และสร้างโครงการของคุณแล้ว
รายการของรหัสการทำให้เสร็จสมบูรณ์
หมายเหตุ:อย่าลืมเปลี่ยนพารามิเตอร์สตริงการเชื่อมต่อต่อไปนี้เพื่อให้สะท้อนถึงค่าที่ถูกต้องสำหรับเซิร์ฟเวอร์ 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เขตข้อมูลสำหรับผลิตภัณฑ์ล้มเหลวเนื่องจากหมายเลขผลิตภัณฑ์ที่ระบุไม่มีอยู่ในตารางผลิตภัณฑ์ ซึ่งส่งผลในความล้มเหลวของธุรกรรม และทรานแซคชันที่ถูกละเว้น
- ใน Visual Studio .NET หรือ Visual Studio 2005 ชี้ไปที่ใหม่ในการแฟ้ม:เมนู แล้วคลิกProject.
- คลิกแสดงโครงการ c#ภายใต้ชนิดโครงการแล้ว คลิกคอนโซลแอพลิเคชันภายใต้แม่แบบ.
หมายเหตุ:ใน Visual Studio 2005 คลิกvisual c#ภายใต้ชนิดโครงการแล้ว คลิกคอนโซลแอพลิเคชันภายใต้แม่แบบ. - ในการชื่อ:กล่องข้อความ ชนิดtestES. ตรวจสอบให้แน่ใจว่าการเพิ่มโซลูชันเลือกตัวเลือก
- คลิกตกลงเมื่อต้องการเพิ่มโครงการนี้เพื่อการแก้ไขปัญหา
- สำหรับtestESเมื่อต้องการทดสอบclsESคุณต้องเพิ่มการอ้างอิง คลิกขวาใน Explorer โซลูชันอ้างอิง:ภายใต้testES(ที่คุณเพิ่งเพิ่ม), แล้ว คลิกเพิ่มการอ้างอิง.
- กระบวนการเพิ่มการอ้างอิงกล่องโต้ตอบปรากฏขึ้น ในการโครงการแท็บ คลิกสองครั้งprjEnterprise.
- การอ้างอิงปรากฏอยู่ภายใต้คอมโพเนนต์ที่เลือก. คลิกตกลงเมื่อต้องการเพิ่มการอ้างอิงนี้กับโครงการ
- เพิ่มการอ้างอิงถึงโครงการในไลบรารี System.EnterpriseServices คลิกขวาใน Explorer โซลูชันอ้างอิง:แล้ว คลิกเพิ่มการอ้างอิง.
- กระบวนการเพิ่มการอ้างอิงกล่องโต้ตอบปรากฏขึ้น
ภายใต้ชื่อคอมโพเนนต์ในการ.NETแท็บ คลิกสองครั้งSystem.EnterpriseServices.
- ตรวจสอบให้แน่ใจว่าSystem.EnterpriseServicesปรากฏภายใต้คอมโพเนนต์ที่เลือก. คลิกตกลง.
- คลิกขวา(แอพลิเคชันของคอนโซลtestES), แล้ว คลิกตั้งค่าเป็นการเริ่มต้นโครงการ
- วางรหัสต้นทางต่อไปนี้ในการหลักฟังก์ชันของ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");
} - กด F5 เพื่อเรียกใช้รหัสการทดสอบ
ในโค้ดในขั้นตอนที่ 7 เรียกแรกไปยังdbAccessสำเร็จ ผลิตภัณฑ์ 1 และ 2 ผลิตภัณฑ์อยู่ในตารางผลิตภัณฑ์ กระบวนการonOrderฟิลด์สำหรับผลิตภัณฑ์ 1 มีการปรับปรุงการ 777 และinStockมีการปรับปรุงเขตข้อมูลสำหรับผลิตภัณฑ์ 2 เพื่อ 888 เนื่องจากธุรกรรมนี้เสร็จสมบูรณ์แล้ว คุณได้รับข้อความต่อไปนี้ในหน้าต่างการแสดงผลความสำเร็จที่หนึ่ง - ธุรกรรม
การเรียกที่สองdbAccessล้มเหลว ดังนั้น ต่อปรับปรุงคำชี้แจงสิทธิ์ในdbAccessเมื่อต้องการผลิตภัณฑ์ ตารางถูกลงรายการบัญชีไปยังฐานข้อมูล แม้ว่าผลิตภัณฑ์ 1 อาจมีการonOrderฟิลด์ที่ปรับปรุงเป็น5ผลิตภัณฑ์ 2 ไม่ได้inStockตั้งค่าของฟิลด์-20. เนื่องจากข้อจำกัดที่กำหนดไว้ในคำนิยามตารางผลิตภัณฑ์ การinStockไม่สามารถมีตัวเลขที่เป็นค่าลบ
ดังนั้น ซึ่งเรียกใช้เมื่อต้องการdbAccessล้มเหลว และธุรกรรมทั้งหมดล้มเหลว ตารางผลิตภัณฑ์ยังคงเป็นที่ก่อนการเรียกไปยังdbAccess. กระบวนการตรวจจับรายงานจัดการการแจ้งเตือนของความล้มเหลวของธุรกรรมจากdbAccessและคุณได้รับข้อความแสดงข้อผิดพลาดต่อไปนี้ในหน้าต่างการแสดงผล: - ตรวจสอบเนื้อหาของตารางผลิตภัณฑ์ Northwind โดยใช้ตัวจัดการองค์กรของเซิร์ฟเวอร์ SQL เมื่อคุณดูผลิตภัณฑ์ 1,onOrderฟิลด์จะเท่ากับ 777 เมื่อคุณดูผลิตภัณฑ์ 2,instockฟิลด์ว่าง 888 ดังนั้น เรียกที่สองไปยังdbAccess(ซึ่งจะทำให้ค่าที่แตกต่างกันสำหรับฟิลด์เหล่านี้) ล้มเหลว
แก้ไข
- ตรวจสอบให้แน่ใจว่า โครงการที่ใช้ COM + บริการมีชื่อที่รัดกุม
- ระดับชั้นที่ใช้เซอร์วิส COM + ต้องสืบทอดจากคอมโพเนนต์ที่ให้บริการ ส่วนประกอบที่ให้บริการที่อยู่ในนั้นSystem.EnterpriseServicesnamespace
- ในขณะทำการตรวจแก้จุดบกพร่อง ธุรกรรมอาจเวลาออกก่อนที่มีกำหนด หรือยกเลิก เมื่อต้องการหลีกเลี่ยงการหมดเวลา ใช้คุณสมบัติการหมดเวลาลงในแอตทริบิวต์ของธุรกรรม ในตัวอย่างต่อไปนี้ วิธีการเชื่อมโยงมี 1,200 วินาทีในการทำธุรกรรมใด ๆ ก่อนหมดเวลา:
[Transaction(TransactionOption.Required,timeout=1200)]
สำหรับข้อมูลเพิ่มเติม แวะไปไซต์เว็บ Network (MSDN) นักพัฒนา Microsoft ต่อไปนี้:
หมายเลขบทความ (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
| kbcomplusobj kbsqlprog kbsqlclient kbdatabase kbhowtomaster kbmt KB816141 KbMtth |
แปลโดยคอมพิวเตอร์ข้อมูลสำคัญ: บทความนี้แปลโดยซอฟต์แวร์การแปลด้วยคอมพิวเตอร์ของ Microsoft แทนที่จะเป็นนักแปลที่เป็นบุคคล Microsoft มีบทความที่แปลโดยนักแปลและบทความที่แปลด้วยคอมพิวเตอร์ เพื่อให้คุณสามารถเข้าถึงบทความทั้งหมดในฐานความรู้ของเรา ในภาษาของคุณเอง อย่างไรก็ตาม บทความที่แปลด้วยคอมพิวเตอร์นั้นอาจมีข้อบกพร่อง โดยอาจมีข้อผิดพลาดในคำศัพท์ รูปแบบการใช้ภาษาและไวยากรณ์ เช่นเดียวกับกรณีที่ชาวต่างชาติพูดผิดเมื่อพูดภาษาของคุณ Microsoft ไม่มีส่วนรับผิดชอบต่อความคลาดเคลื่อน ความผิดพลาดหรือความเสียหายที่เกิดจากการแปลเนื้อหาผิดพลาด หรือการใช้บทแปลของลูกค้า และ Microsoft มีการปรับปรุงซอฟต์แวร์การแปลด้วยคอมพิวเตอร์อยู่เป็นประจำ
ต่อไปนี้เป็นฉบับภาษาอังกฤษของบทความนี้:
816141
(http://support.microsoft.com/kb/816141/en-us/
)