อะไรคือความแตกต่างระหว่างการใช้ SqlDataAdapter กับ SqlDataReader ในการรับข้อมูลจาก DB
ฉันกำลังมองหาข้อดีข้อเสียของพวกเขาโดยเฉพาะรวมถึงความเร็วและประสิทธิภาพของหน่วยความจำ
ขอบคุณ
อะไรคือความแตกต่างระหว่างการใช้ SqlDataAdapter กับ SqlDataReader ในการรับข้อมูลจาก DB
ฉันกำลังมองหาข้อดีข้อเสียของพวกเขาโดยเฉพาะรวมถึงความเร็วและประสิทธิภาพของหน่วยความจำ
ขอบคุณ
คำตอบ:
ในทางกลับกันมัน:
ในราคา:
จริงๆแล้วมันขึ้นอยู่กับว่าคุณกำลังทำอะไรอยู่ แต่ฉันมักจะชอบ DataReader จนกว่าฉันจะต้องการบางอย่างที่รองรับโดยชุดข้อมูลเท่านั้น SqlDataReader เหมาะสำหรับกรณีการเข้าถึงข้อมูลทั่วไปที่เชื่อมโยงกับกริดแบบอ่านอย่างเดียว
สำหรับข้อมูลเพิ่มเติมโปรดดูที่เอกสารไมโครซอฟท์อย่างเป็นทางการ
while (reader.Read())ลูปของคุณ
คำตอบนั้นสามารถค่อนข้างกว้าง
โดยพื้นฐานแล้วความแตกต่างที่สำคัญสำหรับฉันที่มักจะมีผลต่อการตัดสินใจของฉันว่าจะใช้กับ SQLDataReader คุณกำลัง "สตรีม" ข้อมูลจากฐานข้อมูล ด้วย SQLDataAdapter คุณกำลังแยกข้อมูลจากฐานข้อมูลลงในวัตถุที่สามารถสืบค้นเพิ่มเติมได้เองรวมทั้งดำเนินการ CRUD
เห็นได้ชัดว่ากระแสข้อมูล SQLDataReader เร็วกว่ามาก แต่คุณสามารถประมวลผลได้ครั้งละหนึ่งระเบียนเท่านั้น ด้วย SQLDataAdapter คุณจะมีคอลเลกชันที่สมบูรณ์ของแถวที่ตรงกันกับแบบสอบถามของคุณจากฐานข้อมูลเพื่อใช้งาน / ส่งผ่านโค้ดของคุณ
คำเตือน:หากคุณใช้ SQLDataReader อยู่เสมอโปรดตรวจสอบให้แน่ใจเสมอว่าคุณได้เขียนโค้ดที่ถูกต้องเพื่อปิดการเชื่อมต่อเนื่องจากคุณเปิดการเชื่อมต่อไว้กับ SQLDataReader ความล้มเหลวในการทำเช่นนี้หรือจัดการข้อผิดพลาดที่เหมาะสมในการปิดการเชื่อมต่อในกรณีที่มีข้อผิดพลาดในการประมวลผลผลจะพิการใบสมัครของคุณกับการรั่วไหลของการเชื่อมต่อ
ขออภัย VB ของฉัน แต่นี่เป็นจำนวนขั้นต่ำของรหัสที่คุณควรมีเมื่อใช้ SqlDataReader:
Using cn As New SqlConnection("..."), _
cmd As New SqlCommand("...", cn)
cn.Open()
Using rdr As SqlDataReader = cmd.ExecuteReader()
While rdr.Read()
''# ...
End While
End Using
End Using
เทียบเท่า C #:
using (var cn = new SqlConnection("..."))
using (var cmd = new SqlCommand("..."))
{
cn.Open();
using(var rdr = cmd.ExecuteReader())
{
while(rdr.Read())
{
//...
}
}
}
โดยทั่วไปแล้ว SqlDataAdapter จะใช้เพื่อเติม DataSet หรือ DataTable ดังนั้นคุณจะสามารถเข้าถึงข้อมูลได้หลังจากปิดการเชื่อมต่อของคุณแล้ว (การเข้าถึงที่ไม่ได้เชื่อมต่อ)
SqlDataReader เป็นเคอร์เซอร์ที่เชื่อมต่อไปข้างหน้าอย่างเดียวและรวดเร็วซึ่งมักจะเร็วกว่าการกรอก DataSet / DataTable
นอกจากนี้ด้วย SqlDataReader คุณจัดการกับข้อมูลของคุณทีละบันทึกและไม่เก็บข้อมูลใด ๆ ไว้ในหน่วยความจำ เห็นได้ชัดว่าด้วย DataTable หรือ DataSet คุณมีค่าใช้จ่ายในการจัดสรรหน่วยความจำ
หากคุณไม่จำเป็นต้องเก็บข้อมูลของคุณไว้ในหน่วยความจำดังนั้นสำหรับการแสดงผลข้อมูลเท่านั้นให้ไปที่ SqlDataReader หากคุณต้องการจัดการกับข้อมูลของคุณในลักษณะที่ขาดการเชื่อมต่อให้เลือก DataAdapter เพื่อกรอก DataSet หรือ DataTable
ใช้ SqlDataAdapter เมื่อต้องการเติม DataSet / DataTable ในหน่วยความจำจากฐานข้อมูล จากนั้นคุณจะมีความยืดหยุ่นในการปิด / กำจัดการเชื่อมต่อส่งผ่านข้อมูล / ตั้งค่าในหน่วยความจำ จากนั้นคุณสามารถจัดการข้อมูลและเก็บกลับเข้าไปในฐานข้อมูลโดยใช้อะแดปเตอร์ข้อมูลร่วมกับ InsertCommand / UpdateCommand
ใช้ SqlDataReader เมื่อต้องการการเข้าถึงข้อมูลที่รวดเร็วและมีหน่วยความจำต่ำโดยไม่จำเป็นต้องมีความยืดหยุ่นเช่นการส่งผ่านข้อมูลตามตรรกะทางธุรกิจของคุณ วิธีนี้เหมาะสมกว่าสำหรับการดึงข้อมูลปริมาณข้อมูลขนาดใหญ่ที่รวดเร็วและใช้หน่วยความจำต่ำเนื่องจากไม่ได้โหลดข้อมูลทั้งหมดลงในหน่วยความจำทั้งหมดในครั้งเดียว - ด้วยวิธี SqlDataAdapter DataSet / DataTable จะเต็มไปด้วยข้อมูลทั้งหมดดังนั้นหาก มีแถวและคอลัมน์จำนวนมากซึ่งจะต้องใช้หน่วยความจำจำนวนมากในการเก็บรักษา
ฟังก์ชัน Fill ใช้ DataReader ภายใน หากการพิจารณาของคุณคือ "อันไหนมีประสิทธิภาพมากกว่ากัน" จากนั้นใช้ DataReader ในการวนซ้ำแบบแน่นที่เติมข้อมูลคอลเลกชันทีละเรกคอร์ดมีแนวโน้มที่จะโหลดในระบบเช่นเดียวกับการใช้ DataAdapter.Fill
(System.Data.dll, System.Data.Common.DbDataAdapter, FillInternal.)