เหตุใดฉันจึงไม่สามารถใช้เครื่องอ่านข้อมูลสองตัวในขั้นตอนเดียวได้

คุณช่วยอธิบายฉันหน่อยได้ไหมว่าทำไมฉันถึงไม่สามารถใช้ datareader สองตัวในขั้นตอนต่อไปได้?

นี่คือโค้ดตัวอย่าง:

Private Sub  Do_Execute()

  Dim conx as SqlConnection
  Dim cmd1 as SqlCommand
  Dim cmd2 as SqlCommand

  Dim drd1 as SqlDataReader
  Dim drd2 as SqlDataReader

  conx = new SqlConnection("connection string")
  conx.Open()

     cmd1 = new SqlCommand("SELECT * FROM Category" , conx)
     drd1 = cmd1.ExecuteReader()

     While (drd1.Read())
     {
        Reading Data From drd1
     }

     cmd2 = new SqlCommand("SELECT * FROM Stock" , conx)
     drd2 = cmd2.ExecuteReader()

     While (drd2.Read())
     {
        Reading Data From drd2
     }

End Sub

เมื่อฉันรันโปรแกรมนั้น มันจะส่งไปที่ข้อความยกเว้น: " มี DataReader ที่เปิดอยู่เชื่อมโยงกับคำสั่งนี้ซึ่งจะต้องปิดก่อน! "

เมื่อฉันปิด drd1 ก่อนที่จะเริ่มต้น drd2 มันได้ผล.

เหตุใดฉันจึงใช้โค้ดแบบด้านบนไม่ได้ โปรดอธิบายฉันด้วย ขอบคุณล่วงหน้า!


person RedsDevils    schedule 23.11.2009    source แหล่งที่มา
comment
ปิด/กำจัด SqlDataReaders ของคุณเสมอ คุณควรทำเช่นเดียวกันกับ SqlConnection ของคุณเช่นกัน   -  person Brannon    schedule 23.11.2009
comment
ใช่แล้ว แบรนนอน! ขอบคุณสำหรับคำแนะนำของคุณ! ฉันปิดการเชื่อมต่อและออบเจ็กต์ตัวอ่านทั้งหมดเมื่อบล็อกในที่สุด   -  person RedsDevils    schedule 23.11.2009


คำตอบ (3)


ฉันไม่เคยลองสิ่งนี้มาก่อน แต่ควรจะเป็นไปได้

อ่าน การใช้ชุดผลลัพธ์ที่ใช้งานอยู่หลายชุด และ
การเปิดใช้งานชุดผลลัพธ์ที่ใช้งานอยู่หลายชุด บน MSDN

โปรดทราบว่านี่สำหรับ SQL2005 ขึ้นไป

ตัดตอนมาจากบทความหนึ่ง:

ในการเข้าถึงชุดผลลัพธ์หลายชุดบน SQL Server เวอร์ชันก่อนหน้าโดยใช้วัตถุ SqlDataReader ต้องใช้วัตถุ SqlConnection แยกต่างหากกับวัตถุ SqlCommand แต่ละรายการ

person o.k.w    schedule 23.11.2009
comment
ขอบคุณ ! ฉันสามารถใช้งานได้ทันทีโดยเปิดใช้งาน MARS ในการเชื่อมต่อของฉัน - person RedsDevils; 23.11.2009

เป็นเพราะคุณกำลังแชร์การเชื่อมต่อเดียวกันจริงๆ

คุณต้อง:
1) ใช้การเชื่อมต่อที่แตกต่างกันสำหรับแต่ละ SqlCommand ซึ่งเป็นวิธีดั้งเดิมที่คุณใช้ในการทำเช่นนี้

or

2) ใช้ MARS (ชุดผลลัพธ์ที่ใช้งานหลายรายการ) ตามที่อธิบายไว้ ที่นี่

person AdaTheDev    schedule 23.11.2009
comment
ฉันใช้วิธีที่สองของคุณ! ขอบคุณ ตอนนี้มันใช้งานได้แล้ว! :) ขอบคุณมาก! หากฉันใช้การเชื่อมต่อที่แตกต่างกัน ประสิทธิภาพระหว่างการใช้การเชื่อมต่อที่แตกต่างกันและการใช้ MARS เป็นอย่างไร คุณช่วยตอบฉันได้ไหม? - person RedsDevils; 23.11.2009
comment
เมื่อเห็นว่า MARS ได้รับการแนะนำเพื่อจุดประสงค์นี้ นั่นก็เป็นสิ่งที่ควรทำ ด้วยวิธีการเชื่อมต่อที่หลากหลาย การเชื่อมต่อแต่ละครั้งจะต้องใช้ทรัพยากรเซิร์ฟเวอร์ db ดังนั้นจึงมีค่าใช้จ่ายสำหรับการเชื่อมต่อแต่ละครั้ง นอกจากนี้ โปรดดูที่ stackoverflow.com/questions/510899/ - person AdaTheDev; 23.11.2009

บทความนี้จะอธิบายว่าปัญหาคืออะไร และ แนะนำโซลูชันหากคุณใช้ SQL Server โซลูชันนี้เรียกว่า MARS หรือชุดระเบียนที่ใช้งานอยู่หลายรายการ และพร้อมใช้งานใน SQL Server 2005 และเวอร์ชันที่ใหม่กว่า

person Pete OHanlon    schedule 23.11.2009
comment
ขอบคุณ ! คำตอบของคุณก็มีประโยชน์สำหรับคำถามของฉันเช่นกัน! - person RedsDevils; 23.11.2009