วิธีการใช้ COM + ธุรกรรมในคอมโพเนนต์ของ Visual Basic .NET

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

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

สรุป

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

ความต้องการ

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

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

กระบวนการSystem.EnterpriseServicesnamespace ภายในกรอบการทำงานของ Microsoft .NET แสดงหน้าที่การใช้งานการใช้การประมวลผลของธุรกรรม การเข้าใช้งาน COM + บริการของทรานแซคชัน สร้างคลาสได้ โดยทำตามขั้นตอนเหล่านี้:
  1. เปิด Visual Studio .NET
  2. สร้างคลาไลบรารีโครงการใหม่ชื่อ prjEnterprise ใน Visual Basic .NET visual Basic .NET สร้างคลาสาธารณะที่ชื่อ Class1
  3. เพิ่มการอ้างอิงถึงโครงการในไลบรารี System.EnterpriseServices ในหน้าต่าง Explorer โซลูชัน คลิกขวาอ้างอิง:โฟลเดอร์ แล้วเลือกโฟลเดอร์เพิ่มการอ้างอิงจากเมนูทางลัด ในการ.NETแท็บ เลื่อนจนกว่าคุณค้นหาSystem.EnterpriseServices. คลิกสองครั้งSystem.EnterpriseServicesตรวจสอบให้แน่ใจว่าSystem.EnterpriseServicesปรากฏในหน้าต่างที่เลือกคอมโพเนนต์ และจากนั้น คลิกตกลง.
  4. ใช้แบบนำเข้าคำสั่งสำหรับการSystem.EntpriseServicesnamespace และSystem.Data.SqlClientnamespace ดังนั้นคุณจะไม่มีการกำหนดลักษณะการอ้างอิงใด ๆ ถึง namespaces เหล่านี้ในภายหลังในรหัสของคุณทั้งหมด คำสั่งเหล่านี้ต้องปรากฏก่อนการคำสั่งอื่น ๆ ในแฟ้มคลาส:
    	Imports System.EnterpriseServices
    Imports System.Data.SqlClient
  5. รับเพื่อที่จะใช้ COM + ของทรานแซคชันบริการ คลาของคุณ ชื่อ clsES ต้องเอาฟังก์ชันการทำงานจาก ServicedComponent:
    	Public Class clsES
    Inherits ServicedComponent
  6. aธุรกรรมแอตทริบิวต์ที่ถูกใช้เพื่อระบุระดับการสนับสนุนของทรานแซคชันสำหรับคลา:
    <Transaction(TransactionOption.Required)> Public Class clsES
       	Inherits ServicedComponent
  7. สร้างวิธีภายใน clsES ที่เรียกว่าdbAccessซึ่งได้รับพารามิเตอร์ทั้งสี่ของจำนวนเต็มที่สำหรับการป้อนค่า พารามิเตอร์ที่สองครั้งแรกให้เป็นหมายเลขผลิตภัณฑ์และหน่วยในใบสั่งสำหรับผลิตภัณฑ์นั้น พารามิเตอร์ที่สองประการที่สองให้เป็นหมายเลขผลิตภัณฑ์และหน่วยในสินค้าคงคลังสำหรับผลิตภัณฑ์นั้น วิธีนี้ดำเนินการชุดของฐานข้อมูลการดำเนินงานกับผลิตภัณฑ์เหล่านี้ระบุหมายเลขที่จะถูกจัดเป็นธุรกรรม:
    	Public Sub dbAccess (ByVal pid1 As Integer, _
    ByVal onOrder As Integer, _
          ByVal pid2 As Integer, ByVal inStock As Integer)
  8. ในการdbAccessวิธีการ สร้างวัตถุการเชื่อมต่อ SQL สำหรับ Northwind ในฐานข้อมูล และจากนั้น เปิดการเชื่อมต่อ การดำเนินการฐานข้อมูลขึ้น โดยใช้ฐานข้อมูลนี้:
    Dim Conn As New _
      SqlConnection("uid=sa;database=northwind;server=localhost")
    Conn.Open()
  9. การตั้งค่ากลุ่มลองการจับภาพการประมวลผลฐานข้อมูลใด ๆ ที่อาจเกิดขึ้น ข้อผิดพลาดเหล่านี้ต้องถูกพบได้เพื่อให้สามารถยกเลิกธุรกรรม บล็อกโปรดจะรวมดำเนินฐานข้อมูลที่สอง แต่ละหนึ่งเขตข้อมูลแตกต่างกันในระเบียนตารางผลิตภัณฑ์ที่ระบุในการปรับปรุง
    		Try
  10. ทำการปรับปรุงแรกไปยังตารางผลิตภัณฑ์ ปรับปรุงนี้UnitsonOrderฟิลด์ มีค่าของ onOrder สำหรับผลิตภัณฑ์ด้วย ID ตามที่ระบุในพารามิเตอร์การป้อนค่าสองครั้งแรก SQLcommand ถูกใช้เพื่อเรียกใช้โปรแกรมปรับปรุงนี้ SQL:
    	   Dim Cmd As SqlCommand
          Dim sqlString As String = _
               "update products set UnitsonOrder = " & onOrder _
               & " where productId = " & pid1         
          Cmd = New SqlCommand(sqlString, Conn)
          Cmd.ExecuteNonQuery()
  11. ทำการปรับปรุงอื่นไปยังตารางผลิตภัณฑ์ ปรับปรุงนี้UnitsinStockฟิลด์ มีค่าของ inStock สำหรับผลิตภัณฑ์ด้วย ID ตามที่ระบุไว้ในสาม และสี่อินพุตพารามิเตอร์ SQLCommand ถูกใช้เพื่อเรียกใช้โปรแกรมปรับปรุงนี้ SQL:
          sqlString = _
    "update products set UnitsinStock = " _
    & inStock & " where productId = " & pid2
               
          Cmd.CommandText = sqlString
          Cmd.ExecuteNonQuery()
  12. เนื่องจากการปรับปรุงเหล่านี้เป็นส่วนหนึ่งของธุรกรรม COM + จะถูกกำหนดให้เป็นหน่วย กระบวนการsetCompleteวิธีการนี้contextUtilคลาสจากนั้นSystem.EnterpriseServicesใช้ namespace เพื่อที่ส่งธุรกรรม--อัพในกรณีนี้ ในสอง เด--ถ้าไม่มีข้อผิดพลาดถูก thrown:
          ContextUtil.SetComplete()
  13. ปิดการเชื่อมต่อกับฐานข้อมูล Northwind:
          Conn.Close()
  14. ข้อผิดพลาดใด ๆ ที่เกิดขึ้นขณะเรียกใช้คำสั่ง SQL ต้องถูกพบ เพื่อให้สามารถถูกยกเลิกธุรกรรมทั้งหมด:
    	   Catch e As Exception
  15. กระบวนการsetAbortเมธอดของคลา contextUtil จากนั้นSystem.EnterpriseServicesมีใช้ namespace เพื่อยกเลิกธุรกรรมทั้งหมด ถ้าการปรับปรุงแรกเป็นผลสำเร็จ และล้มเหลวของการปรับปรุงที่สอง การปรับปรุงไม่ถูกลงรายการบัญชีไปยังตารางผลิตภัณฑ์ ข้อยกเว้น caught thrown ไปยังผู้เรียก บ่งชี้ว่า ธุรกรรมล้มเหลว:
          	ContextUtil.SetAbort()
    			Throw e
    		End Try
  16. ในใบสั่งสำหรับคอมโพเนนต์นี้ทำงานอย่างถูกต้อง ส่วนประกอบต้องมีชื่ออย่างแน่นหนา ทำตามขั้นตอนเหล่านี้ เพื่อสร้างชื่อที่ซับซ้อน และประกอบ ด้วยชื่อที่รัดกุมที่เข้าสู่ระบบ:

    1. เมื่อต้องการเปิดหน้าจอพร้อมรับคำสั่ง Visual Studio .NET คลิกเริ่มการทำงานคลิกโปรแกรมคลิกMicrosoft Visual Studio .NETแล้ว คลิกเครื่องมือการ.NET visual Studio.
    2. ที่พรอมต์คำสั่ง พิมพ์:snEnterprise.snk -k sn.exeการนำแอสเซมบลีของชื่อที่รัดกุม

      สำหรับข้อมูลเพิ่มเติมเกี่ยวกับแอสเซมบลีที่เซ็นชื่อด้วยชื่อที่เข้มงวด โปรดดูเอกสารประกอบของ.NET Framework SDK
    3. การคัดลอก snEnterprise.snk ไปยังโฟลเดอร์โครงการ
    4. ใน AssemblyInfo.vb เพิ่มบรรทัดต่อไปนี้ของรหัสก่อน หรือหลัง จากที่อื่นงบแอตทริบิวต์ของแอสเซมบลี:
      <Assembly: AssemblyKeyFileAttribute("..\..\snEnterprise.snk")>
    5. บันทึก และสร้างโครงการของคุณ

แสดงรายการของรหัสการทำให้เสร็จสมบูรณ์

Imports System.Data.SqlClient
Imports System.EnterpriseServices

<Transaction(TransactionOption.Required)> Public Class ClsES
    Inherits ServicedComponent

Public Sub dbAccess(ByVal pid1 As Integer, ByVal onOrder As Integer, _
      ByVal pid2 As Integer, ByVal inStock As Integer)

        Dim Conn As New _
          SqlConnection("uid=sa;database=northwind;server=localhost")
          Conn.Open()
        Try
          Dim Cmd As SqlCommand
          Dim sqlString As String = _
             "update products set UnitsonOrder = " & _
              onOrder & " where productId = " & pid1
          Cmd = New SqlCommand(sqlString, Conn)
          Cmd.ExecuteNonQuery()

          sqlString = _

         " update products set UnitsinStock = " & inStock & _
                " where productId = " & pid2
           Cmd.CommandText = sqlString
           Cmd.ExecuteNonQuery()

           ContextUtil.SetComplete()
           Conn.Close()
        
         Catch e As Exception
            ContextUtil.SetAbort()
		  Throw e
        End Try
    End Sub 
End Class

ตรวจสอบการทำให้ งาน

เมื่อต้องการทดสอบรหัสนี้ สร้างโปรแกรมประยุกต์คอนโซลที่ใช้ clsES ในกรณีที่หนึ่ง ทรานแซคชันสำเร็จ และonorderและinstockเขตข้อมูลสำหรับผลิตภัณฑ์ที่ระบุได้รับการปรับปรุง ในกรณีสอง การปรับปรุงสำหรับการonOrderฟิลด์สำหรับผลิตภัณฑ์ที่ระบุสำเร็จ แต่การปรับปรุงสำหรับการinStockเขตข้อมูลสำหรับผลิตภัณฑ์ไม่ เนื่องจากหมายเลขผลิตภัณฑ์ที่ระบุไม่มีอยู่ในตารางผลิตภัณฑ์ ซึ่งผลลัพธ์ในความล้มเหลวธุรกรรม ด้วยธุรกรรมที่ถูกละเว้น
  1. เพิ่มโปรแกรมประยุกต์คอนโซลที่ใหม่ที่ชื่อว่า testES เพื่อแก้ไขปัญหาของคุณ เพื่อให้วิธีการแก้ไขปัญหาประกอบด้วยโครงการ testES และโครงการ prjEnterprise เมื่อต้องการเพิ่มโครงการใหม่ คลิกใหม่ในการแฟ้ม:เมนู และเลือกแล้วProject.
  2. aโครงการใหม่กล่องโต้ตอบปรากฏขึ้น เลือกโฟลเดอร์ Visual Basic ในโครงการชนิดบานหน้าต่าง และเลือกแล้วแอพลิเคชันของคอนโซลจากแม่แบบ ในการชื่อ:กล่องภายใต้บานหน้าต่างต้นแบบ ชนิดtestESซึ่งเป็นชื่อของโครงการ ตรวจสอบให้แน่ใจว่าการเพิ่มโซลูชันมีเลือกปุ่ม ซึ่งปรากฏที่ด้านล่างของกล่องโต้ตอบ คลิกตกลงเมื่อต้องการเพิ่มโครงการนี้เพื่อการแก้ไขปัญหา
  3. ในใบสั่งสำหรับ testES เพื่อทดสอบ clsES คุณต้องเพิ่มการอ้างอิง ในหน้าต่างวิธีการแก้ไข คลิกขวาอ้างอิง:โฟลเดอร์ที่อยู่ภายใต้ testES โครงการ ซึ่งคุณเพิ่งเพิ่มเข้าไป เลือกเพิ่มการอ้างอิง. มีเพิ่มการอ้างอิงกล่องโต้ตอบปรากฏขึ้น
  4. เลือกการโครงการแท็บ และจากนั้น คลิกสองครั้งprjEnterprise. การอ้างอิงควรปรากฏในคอมโพเนนต์ที่เลือกที่อยู่ในส่วนด้านล่างของกล่องโต้ตอบ คลิกตกลงเมื่อต้องการเพิ่มการอ้างอิงนี้กับโครงการนี้
  5. คลิกขวาที่โปรแกรมประยุกต์คอนโซลtestESแล้ว เลือกตั้งค่าเป็นการเริ่มต้นโครงการ.
  6. ในการตรวจแก้จุดบกพร่องเมนู การเลือกWindows. บนเมนูย่อย เลือกทันที. ซึ่งช่วยให้มั่นใจว่า หน้าต่าง Immediate จะมองเห็นได้
  7. การคัดลอกการทดสอบรหัสต่อไปนี้ลงในโมดูล Module1 แทนที่คำสั่งย่อยหลักและสิ้นสุดย่อย โมดูลที่ควรปรากฏเป็นดังนี้:
        Sub Main()
            Dim myTest As New prjEnterprise.clsES()
    
            Try
                myTest.dbAccess(1, 777, 2, 888)
                Debug.WriteLine("TRANSACTION ONE -- SUCCESS")
               
                myTest.dbAccess(1, 5, 2, -20)
                Debug.WriteLine("TRANSACTION TWO -- SUCCESS")
            
            Catch
                Debug.WriteLine("TRANSACTION FAILURE")
            End Try
        End Sub
  8. กด F5 เพื่อเรียกใช้รหัสการทดสอบ
  9. ในรหัสในขั้นตอนที่ 7 เรียกแรกเพื่อ dbAccess สำเร็จ ผลิตภัณฑ์ 1 และผลิตภัณฑ์ 2 อยู่ในตารางผลิตภัณฑ์ กระบวนการonOrderฟิลด์สำหรับผลิตภัณฑ์ 1 มีการปรับปรุงการ 777 และinStockมีการปรับปรุงเขตข้อมูลสำหรับผลิตภัณฑ์ 2 เพื่อ 888 เนื่องจากธุรกรรมนี้เสร็จสมบูรณ์แล้ว หน้าต่าง Immediate จะแสดงข้อความแสดงข้อ "ความธุรกรรม ONE -สำเร็จ"

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

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

การแก้ไขปัญหา

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

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

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

คุณสมบัติ

หมายเลขบทความ (Article ID): 315707 - รีวิวครั้งสุดท้าย: 28 กันยายน 2554 - Revision: 4.0
ใช้กับ
  • Microsoft Visual Basic .NET 2003 Standard Edition
  • Microsoft Visual Basic .NET 2002 Standard Edition
Keywords: 
kbhowtomaster kbmt KB315707 KbMtth
แปลโดยคอมพิวเตอร์
ข้อมูลสำคัญ: บทความนี้แปลโดยซอฟต์แวร์การแปลด้วยคอมพิวเตอร์ของ Microsoft แทนที่จะเป็นนักแปลที่เป็นบุคคล Microsoft มีบทความที่แปลโดยนักแปลและบทความที่แปลด้วยคอมพิวเตอร์ เพื่อให้คุณสามารถเข้าถึงบทความทั้งหมดในฐานความรู้ของเรา ในภาษาของคุณเอง อย่างไรก็ตาม บทความที่แปลด้วยคอมพิวเตอร์นั้นอาจมีข้อบกพร่อง โดยอาจมีข้อผิดพลาดในคำศัพท์ รูปแบบการใช้ภาษาและไวยากรณ์ เช่นเดียวกับกรณีที่ชาวต่างชาติพูดผิดเมื่อพูดภาษาของคุณ Microsoft ไม่มีส่วนรับผิดชอบต่อความคลาดเคลื่อน ความผิดพลาดหรือความเสียหายที่เกิดจากการแปลเนื้อหาผิดพลาด หรือการใช้บทแปลของลูกค้า และ Microsoft มีการปรับปรุงซอฟต์แวร์การแปลด้วยคอมพิวเตอร์อยู่เป็นประจำ
ต่อไปนี้เป็นฉบับภาษาอังกฤษของบทความนี้:315707

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

 

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