อะไรคือความแตกต่างระหว่าง ExecuteScalar, ExecuteReader และ ExecuteNonQuery?


คำตอบ:


192
  • ExecuteScalarโดยทั่วไปจะใช้เมื่อคำค้นหาของคุณส่งกลับค่าเดียว หากส่งคืนมากกว่าผลลัพธ์จะเป็นคอลัมน์แรกของแถวแรก SELECT @@IDENTITY AS 'Identity'ตัวอย่างเช่นอาจจะเป็น
  • ExecuteReaderใช้สำหรับชุดผลลัพธ์ที่มีหลายแถว / คอลัมน์ (เช่นSELECT col1, col2 from sometable)
  • ExecuteNonQuery โดยทั่วไปจะใช้สำหรับคำสั่ง SQL ที่ไม่มีผลลัพธ์ (เช่น UPDATE, INSERT ฯลฯ )

40
ExecuteNonQueryสามารถส่งคืนจำนวนแถวที่ได้รับผลกระทบ
Sangram Nandkhile

ฉันคิดว่า ExecuteNonQuery ถูกใช้เมื่อคุณต้องการเรียกใช้กระบวนงานที่เก็บไว้ซึ่งจะส่งคืนชุดตาราง
Gogutz

ExecuteNonQuery ยังใช้งานได้หากคุณมีคำสั่ง return ในกระบวนงานที่เก็บไว้ stackoverflow.com/questions/6210027/…
FrenkyB

40

ExecuteNonQuery ():

  1. จะทำงานกับ Action Queries เท่านั้น (Create, Alter, Drop, Insert, Update, Delete)
  2. ส่งคืนจำนวนแถวที่ได้รับผลจากแบบสอบถาม
  3. ประเภทผลตอบแทนคือ int
  4. ค่าส่งกลับเป็นทางเลือกและสามารถกำหนดให้กับตัวแปรจำนวนเต็ม

ExecuteReader ():

  1. จะทำงานร่วมกับคิวรีแบบดำเนินการและไม่ดำเนินการ (เลือก)
  2. ส่งคืนคอลเล็กชันของแถวที่คิวรีเลือก
  3. ประเภทการส่งคืนคือ DataReader
  4. ค่าที่ส่งคืนเป็นภาคบังคับและควรกำหนดให้กับ DataReader ออบเจ็กต์อื่น

ExecuteScalar ():

  1. จะทำงานกับแบบสอบถามที่ไม่ใช่การดำเนินการที่มีฟังก์ชันรวม
  2. ส่งกลับค่าแถวแรกและคอลัมน์แรกของผลลัพธ์คิวรี
  3. ประเภทผลตอบแทนคือวัตถุ
  4. ค่าที่ส่งคืนเป็นสิ่งบังคับและควรกำหนดให้กับตัวแปรประเภทที่ต้องการ

URL อ้างอิง:

http://nareshkamuni.blogspot.in/2012/05/what-is-difference-between.html


38

แต่ละประเภทเป็นการดำเนินการประเภทต่างๆ

  • ExecuteScalarจะเป็นประเภทของแบบสอบถามซึ่งจะส่งคืนค่าเดียว

    ตัวอย่างจะส่งคืน ID ที่สร้างขึ้นหลังจากใส่

    INSERT INTO my_profile (Address) VALUES ('123 Fake St.'); SELECT CAST(scope_identity() AS int)

  • ExecuteReaderช่วยให้คุณสามารถอ่านข้อมูลย้อนกลับซึ่งจะช่วยให้คุณสามารถอ่านคอลัมน์ทั้งหมดของผลลัพธ์ได้ทีละแถว

    ตัวอย่างจะดึงข้อมูลโปรไฟล์สำหรับผู้ใช้ตั้งแต่หนึ่งรายขึ้นไป

    SELECT * FROM my_profile WHERE id = '123456'

  • ExecuteNonQueryคือ SQL ใด ๆ ที่ไม่คืนค่า แต่กำลังทำงานบางรูปแบบเช่นการแทรกการลบหรือแก้ไขบางสิ่ง

    ตัวอย่างจะอัปเดตโปรไฟล์ของผู้ใช้ในฐานข้อมูล

    UPDATE my_profile SET Address = '123 Fake St.' WHERE id = '123456'


1
ดูเหมือนว่าคุณสามารถใช้ ExecuteReader เพื่อทำงานที่ทำโดยทั้ง ExecuteScalar & ExecuteNonQuery ได้ดังนั้นทำไมต้องใช้อีกสองอย่าง ประโยชน์ด้านประสิทธิภาพใด ๆ
user20358

เหตุผลหนึ่งที่ควรหลีกเลี่ยงการใช้ ExecuteReader มากเกินไปก็คือจะทำให้โปรแกรมอ่านนั้นอยู่รอบ ๆ จนกว่าคุณจะดำเนินการเสร็จสิ้น ด้วยสิ่งเหล่านี้คุณต้องการทราบข้อมูลเฉพาะบางอย่างเกี่ยวกับวิธีการทำงานเพื่อให้ใช้งานได้อย่างมีประสิทธิภาพสูงสุด สิ่งที่ฉันได้ระบุไว้ต่อไปนี้เป็นแนวทางที่ดี
Brendan Enrick

9

จากเอกสาร (หมายเหตุ: MSDN เป็นแหล่งข้อมูลที่มีประโยชน์เมื่อคุณต้องการทราบว่ามีอะไรบ้าง!):

ExecuteScalar

ใช้เมธอด ExecuteScalar เพื่อดึงค่าเดียว (ตัวอย่างเช่นค่ารวม) จากฐานข้อมูล สิ่งนี้ต้องการรหัสน้อยกว่าการใช้เมธอด ExecuteReader จากนั้นดำเนินการตามที่คุณต้องการเพื่อสร้างค่าเดียวโดยใช้ข้อมูลที่ส่งคืนโดย SqlDataReader

ExecuteReader

ส่ง CommandText ไปยัง Connection และสร้าง SqlDataReader

... และจากSqlDataReader ...

จัดเตรียมวิธีการอ่านสตรีมแถวไปข้างหน้าอย่างเดียวจากฐานข้อมูล SQL Server คลาสนี้ไม่สามารถสืบทอดได้

ExecuteNonQuery

คุณสามารถใช้ ExecuteNonQuery เพื่อดำเนินการแค็ตตาล็อก (ตัวอย่างเช่นการสอบถามโครงสร้างของฐานข้อมูลหรือการสร้างวัตถุฐานข้อมูลเช่นตาราง) หรือเพื่อเปลี่ยนแปลงข้อมูลในฐานข้อมูลโดยไม่ต้องใช้ชุดข้อมูลโดยเรียกใช้คำสั่ง UPDATE, INSERT หรือ DELETE


8

หากต้องการเพิ่มสิ่งที่คนอื่นโพสต์:

ExecuteScalar จะส่งคืนคอลัมน์ทางซ้ายสุดในแนวความคิดจากแถวแรกของชุดผลลัพธ์จากแบบสอบถาม คุณสามารถ ExecuteScalar เจ้าหน้าที่ SELECT * FROM ได้ แต่คุณจะได้รับเฉพาะเซลล์แรกของแถวผลลัพธ์โดยทั่วไปจะใช้สำหรับการสืบค้นที่ส่งกลับค่าเดียว ฉันไม่แน่ใจ 100% เกี่ยวกับ SQLServer แต่ใน Oracle คุณwouldntใช้ในการเรียกใช้ฟังก์ชั่น (รหัสฐานข้อมูลที่ส่งกลับค่าเดียว) และคาดว่าจะให้ค่าตอบแทนของฟังก์ชั่นการทำงานแม้ว่าค่าตอบแทนเพียงครั้งเดียว อย่างไรก็ตามหากคุณกำลังเรียกใช้ฟังก์ชันเป็นส่วนหนึ่งของแบบสอบถามเช่น SELECT SUBSTR ('abc', 1, 1) FROM DUAL มันจะให้ค่าส่งคืนโดยอาศัยความจริงที่ว่าค่าที่ส่งคืนจะถูกเก็บไว้ที่ด้านบนซ้ายสุด เซลล์ของ rowset ที่เป็นผลลัพธ์

ExecuteNonQuery จะถูกใช้เพื่อเรียกใช้โพรซีเดอร์ฟังก์ชันและคิวรีที่จัดเก็บฐานข้อมูลที่แก้ไขข้อมูล (INSERT / UPDATE / DELETE) หรือแก้ไขโครงสร้างฐานข้อมูล (CREATE TABLE ... ) โดยทั่วไปค่าส่งคืนของการโทรเป็นตัวบ่งชี้จำนวนแถวที่ได้รับผลกระทบจากการดำเนินการ แต่ตรวจสอบเอกสาร DB เพื่อรับประกันสิ่งนี้


4

ExecuteReader() เรียกใช้แบบสอบถาม SQL ที่ส่งคืนอ็อบเจ็กต์ DBDataReader ของผู้ให้บริการข้อมูลที่จัดเตรียมการเข้าถึงแบบไปข้างหน้าเท่านั้นและอ่านอย่างเดียวสำหรับผลลัพธ์ของคิวรี

ExecuteScalar()คล้ายกับExecuteReader()วิธีการที่ออกแบบมาสำหรับการสืบค้นแบบซิงเกิลตันเช่นการรับจำนวนเรกคอร์ด

ExecuteNonQuery() ดำเนินการแบบสอบถามที่ไม่ทำงานกับการสร้างลบอัปเดตแทรก)


3

ExecuteNonQuery

วิธีการ ExecuteNonQuery นี้จะใช้สำหรับคำสั่งแทรกอัปเดตและลบสร้างและ SET เท่านั้น เมธอด ExecuteNonQuery จะส่งคืนจำนวนแถวที่มีผลกับการดำเนินการ INSERT, DELETE หรือ UPDATE

ExecuteScalar

การดึงค่าเดียวจากฐานข้อมูลทำได้รวดเร็วมาก Execute Scalar จะส่งคืนค่าคอลัมน์เดียวแถวเดียวคือค่าเดียวในการดำเนินการของ SQL Query หรือ Stored procedure โดยใช้ command object ExecuteReader

Execute Reader จะใช้เพื่อส่งคืนชุดของแถวในการเรียกใช้ SQL Query หรือ Stored procedure โดยใช้ command object อันนี้เป็นการดึงข้อมูลไปข้างหน้าเท่านั้นและใช้เพื่ออ่านค่าตารางตั้งแต่แรกถึงสุดท้าย


3

เมธอด ExecuteNonQuery จะส่งคืนจำนวนแถวที่มีผลกับการดำเนินการ INSERT, DELETE หรือ UPDATE วิธีการ ExecuteNonQuery นี้จะใช้สำหรับคำสั่งแทรกอัปเดตและลบสร้างและ SET เท่านั้น (อ่านเพิ่มเติม)

ExecuteScalar จะส่งคืนค่าคอลัมน์เดียวแถวเดียวคือค่าเดียวในการดำเนินการของ SQL Query หรือ Stored procedure โดยใช้ command object การดึงค่าเดียวจากฐานข้อมูลทำได้รวดเร็วมาก (อ่านเพิ่มเติม)

ExecuteReader จะถูกใช้เพื่อส่งคืนชุดของแถวในการดำเนินการของ SQL Query หรือ Stored procedure โดยใช้ command object อันนี้เป็นการดึงข้อมูลไปข้างหน้าเท่านั้นและใช้เพื่ออ่านค่าตารางตั้งแต่แรกถึงสุดท้าย (อ่านเพิ่มเติม)


1

ExecuteNonQuery: มักใช้เมื่อไม่มีสิ่งใดส่งคืนจากคำสั่ง Sql เช่นการแทรกอัปเดตลบการดำเนินการ

cmd.ExcecuteNonQuery();

ExecuteScalar:

จะใช้เมื่อแบบสอบถาม Sql ส่งกลับค่าเดียว

Int b = cmd.ExcecuteScalar();

ExecuteReader

จะใช้เมื่อแบบสอบถาม Sql หรือ Stored Procedure ส่งกลับหลายแถว / คอลัมน์

SqlDataReader dr = cmd.ExecuteReader();

สำหรับข้อมูลเพิ่มเติมคุณสามารถคลิกที่นี่http://www.dotnetqueries.com/Article/148/-difference-between-executescalar-executereader-executenonquery

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.