วิธีการ: เรียกกระบวนงานที่เก็บพารามิเตอร์ โดยใช้ ADOสุทธิและ Visual C#สุทธิ

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

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

สรุป

มีหลายวิธีในการใช้ ADOเปลี่ยนแปลง การเรียกกระบวนงานที่เก็บ และการรับค่าที่ส่งกลับ และพารามิเตอร์ รวมทั้งการส่งคืน:
  • ใช้วัตถุที่มีชุดข้อมูลเพื่อรวบรวมส่งกลับแถว และ การทำงานกับแถวเหล่านี้นอกเหนือจากการคืนค่าและพารามิเตอร์ส่งคืน
  • ใช้เป็นวัตถุDataReaderเพื่อรวบรวมแถวส่งคืน การย้าย ผ่านแถวเหล่านี้ และ เพื่อส่งคืนค่าของ gather และพารามิเตอร์ที่ส่งคืน
  • ใช้เมธอดExecuteScalarเพื่อส่งกลับค่าจากคอลัมน์แรกของแถวแรกของผลลัพธ์ที่มีค่าที่ส่งกลับและพารามิเตอร์ส่งคืน ซึ่งเป็นประโยชน์มากที่สุดกับฟังก์ชันการรวม
  • ใช้เมธอดExecuteNonQueryเพื่อส่งกลับพารามิเตอร์คืนและค่าที่ส่งกลับ แถวส่งกลับจะถูกละทิ้ง ซึ่งเป็นประโยชน์มากที่สุดสำหรับการดำเนินการแบบสอบถามแอคชัน
บทความนี้แสดงวิธีการสามครั้งล่าสุด และใช้ทั้งSqlCommandและOleDbCommandวัตถุ ตรวจสอบให้แน่ใจว่า คุณต้องคัดลอกรหัสเฉพาะสำหรับผู้ให้บริการที่ได้รับการจัดการที่คุณกำลังใช้อยู่ ถ้าคุณไม่แน่ใจว่าผู้ให้บริการที่ได้รับการจัดการที่คุณควรใช้ เยี่ยมชมไซต์เว็บเครือข่ายนักพัฒนาของ Microsoft ต่อไปนี้:
.ผู้ให้บริการข้อมูลสุทธิ
ในแต่ละอย่างในบทความนี้ พารามิเตอร์จะถูกเพิ่มไปยังชุดพารามิเตอร์ของวัตถุคำสั่ง เมื่อคุณใช้วัตถุSqlCommandคุณไม่ได้ใส่พารามิเตอร์ในใบสั่งเฉพาะใด ๆ แต่พารามิเตอร์ต้องมีชื่อถูกต้อง เมื่อคุณใช้วัตถุOleDbCommandคุณต้องเพิ่มพารามิเตอร์ในลำดับถูกต้อง และคุณไม่สามารถใช้พารามิเตอร์ตามชื่อ

ใช้ DataReader จะส่งกลับแถวและพารามิเตอร์

คุณสามารถใช้วัตถุDataReaderกระแสข้อมูลแบบ อ่านอย่างเดียว ไปข้างหน้า อย่างเดียวของข้อมูลที่ส่งกลับ ข้อมูลที่ประกอบด้วยDataReaderอาจมาจากกระบวนงานเก็บไว้ ตัวอย่างนี้ใช้วัตถุDataReaderเพื่อเรียกใช้กระบวนงานที่เก็บที่มีการป้อนข้อมูลและพารามิเตอร์ของการแสดงผล และย้ายถึงระเบียนที่คืนค่าเมื่อต้องดูพารามิเตอร์ส่งคืน
  1. สร้างกระบวนงานที่เก็บไว้ดังต่อไปนี้บนเซิร์ฟเวอร์ที่กำลังเรียกใช้ Microsoft SQL Server:
    Create Procedure TestProcedure
    (
      @au_idIN varchar (11),
      @numTitlesOUT Integer OUTPUT
    )
    AS 
    
    select A.au_fname, A.au_lname, T.title 
    from authors as A join titleauthor as TA on
    A.au_id=TA.au_id
    join titles as T
    on T.title_id=TA.title_id
    where A.au_id=@au_idIN
    set @numTitlesOUT = @@Rowcount
    return (5) 
    					
  2. สร้างคำใหม่ Visual C#แอพลิเคชัน Windows สุทธิโครงการ
  3. ใช้คำสั่งที่ใช้ในระบบและจำนวนมากSystem.Dataเพื่อให้คุณไม่ได้รับการประกาศในจำนวนมากเหล่านั้นในภายหลังในรหัสของคุณ เพิ่มรหัสนี้ไปยังด้านบนของแบบฟอร์มโค้ดโมดูล ตรวจสอบให้แน่ใจว่าได้คัดลอกรหัสเฉพาะสำหรับผู้ให้บริการที่คุณเลือกไคลเอ็นต์ SQL
    using System.Data.SqlClient;
    					
    ตัวให้บริการข้อมูล DB OLE
    using System.Data.OleDb;
    					
  4. การแทนรหัสในเหตุการณ์Form_Loadส่วนตัว ด้วยรหัสต่อไปนี้:ไคลเอ็นต์ SQL
    SqlConnection PubsConn = new SqlConnection 
    ("Data Source=server;integrated " + 
    "Security=sspi;initial catalog=pubs;");
    SqlCommand testCMD = new SqlCommand 
    ("TestProcedure", PubsConn);
    
    testCMD.CommandType = CommandType.StoredProcedure;
    
    SqlParameter RetVal = testCMD.Parameters.Add 
       ("RetVal", SqlDbType.Int);
    RetVal.Direction = ParameterDirection.ReturnValue;
    SqlParameter IdIn = testCMD.Parameters.Add 
      ("@au_idIN", SqlDbType.VarChar, 11);
    IdIn.Direction = ParameterDirection.Input;
    SqlParameter NumTitles = testCMD.Parameters.Add 
       ("@numtitlesout", SqlDbType.VarChar, 11);
    NumTitles.Direction = ParameterDirection.Output ;
            
    IdIn.Value = "213-46-8915";
    PubsConn.Open();
    
    SqlDataReader myReader = testCMD.ExecuteReader();
    Console.WriteLine ("Book Titles for this Author:");
    while (myReader.Read()) 
       {
         Console.WriteLine ("{0}", myReader.GetString (2));
       };
    myReader.Close() ;
    Console.WriteLine("Number of Rows: " + NumTitles.Value );
    Console.WriteLine("Return Value: " + RetVal.Value);
    					
    ตัวให้บริการข้อมูล DB OLE
    OleDbConnection PubsConn = new OleDbConnection 
       ("Provider=SQLOLEDB;Data Source=server;" + 
       "integrated Security=sspi;initial catalog=pubs;");
    OleDbCommand testCMD = new OleDbCommand 
       ("TestProcedure", PubsConn);
    
    testCMD.CommandType = CommandType.StoredProcedure;
    
    OleDbParameter RetVal = testCMD.Parameters.Add 
       ("RetVal", OleDbType.Integer);RetVal.Direction = ParameterDirection.ReturnValue;
    OleDbParameter IdIn = testCMD.Parameters.Add 
       ("@au_idIN", OleDbType.VarChar, 11);
    IdIn.Direction = ParameterDirection.Input;
    OleDbParameter NumTitles = testCMD.Parameters.Add 
       ("@numtitlesout", OleDbType.VarChar, 11);
    NumTitles.Direction = ParameterDirection.Output;
            
    IdIn.Value = "213-46-8915";
    
    PubsConn.Open();
    
    OleDbDataReader myReader = testCMD.ExecuteReader();
    Console.WriteLine ("Book Titles for this Author:");
    while (myReader.Read()) 
       {
         Console.WriteLine ("{0}", myReader.GetString (2));
       };
    myReader.Close() ;
    Console.WriteLine("Number of Rows: " + NumTitles.Value );
    Console.WriteLine("Return Value: " + RetVal.Value);
    					
  5. แก้ไขสายอักขระการเชื่อมต่อสำหรับการเชื่อมต่อวัตถุให้ชี้ไปยังคอมพิวเตอร์ที่กำลังเรียกใช้ SQL Server
  6. การเรียกใช้รหัส ขอให้สังเกตDataReaderดึงระเบียนแล้ว ส่งกลับค่าพารามิเตอร์ คุณสามารถใช้วิธีการอ่านของวัตถุDataReaderเพื่อย้ายไปมาระหว่างระเบียนที่ส่งกลับ

    หน้าต่างผลลัพธ์แสดงชื่อของสมุดบัญชีที่สอง ค่าที่ส่งกลับของ 5 และพารามิเตอร์ขาออก ซึ่งประกอบด้วยหมายเลขของระเบียน (2) โปรดสังเกตว่า คุณต้องปิดการDataReaderในรหัสการดูค่าพารามิเตอร์ นอกจากนี้ หมายเหตุว่า คุณไม่จำเป็นต้องย้ายผ่านระเบียนทั้งหมดเมื่อต้องดูพารามิเตอร์ส่งคืนถ้าปิดDataReader

ใช้เมธอด ExecuteScalar ของวัตถุคำสั่ง

คุณสามารถใช้เมธอดExecuteScalarของวัตถุคำสั่งเพื่อรับค่าพารามิเตอร์ นอกจากนี้ExecuteScalarส่งกลับคอลัมน์แรกของแถวแรกของกระบวนงานที่เก็บไว้ ซึ่งเป็นประโยชน์มากที่สุดสำหรับฟังก์ชันการรวมเช่นในตัวอย่างต่อไปนี้
  1. สร้างกระบวนงานที่เก็บไว้ดังต่อไปนี้บนเซิร์ฟเวอร์ที่กำลังเรียกใช้ SQL Server:
    Create Procedure TestProcedure2
    (
      @au_idIN varchar (11)
    )
    As
    /* set nocount on */ 
    select count (T.title) 
    from authors as A join titleauthor as TA on
    A.au_id=TA.au_id
    join titles as T
    on T.title_id=TA.title_id
    where A.au_id=@au_idIN
    Return(5)
    					
  2. สร้างคำใหม่ Visual C#แอพลิเคชัน Windows สุทธิโครงการ
  3. ใช้คำสั่งที่ใช้ในระบบและจำนวนมากSystem.Dataเพื่อให้คุณไม่ได้รับการประกาศในจำนวนมากเหล่านั้นในภายหลังในรหัสของคุณ เพิ่มรหัสนี้ไปยังด้านบนของแบบฟอร์มโค้ดโมดูล ตรวจสอบให้แน่ใจว่า คุณต้องคัดลอกรหัสเฉพาะสำหรับผู้ให้บริการที่คุณเลือกไคลเอ็นต์ SQL
    using System.Data.SqlClient;
    					
    ตัวให้บริการข้อมูล DB OLE
    using System.Data.OleDb;
    					
  4. เพิ่มรหัสต่อไปนี้ไปยังเหตุการณ์Form_Load :ไคลเอ็นต์ SQL
    string strCount;
    SqlConnection PubsConn = new SqlConnection 
       ("Data Source=server;integrated " + 
       "Security=sspi;initial catalog=pubs;");
    SqlCommand testCMD = new SqlCommand 
       ("TestProcedure2", PubsConn);
    
    testCMD.CommandType = CommandType.StoredProcedure;
    
    SqlParameter RetVal = testCMD.Parameters.Add 
       ("RetVal", SqlDbType.Int);
    RetVal.Direction = ParameterDirection.ReturnValue;
    SqlParameter IdIn = testCMD.Parameters.Add 
       ("@au_idIN", SqlDbType.VarChar, 11);
    IdIn.Direction = ParameterDirection.Input;
            
    IdIn.Value = "213-46-8915";
    
    PubsConn.Open();
    
    strCount =testCMD.ExecuteScalar ().ToString() ;
    
    Console.WriteLine("Number of Rows: " + strCount );
    Console.WriteLine("Return Value: " + RetVal.Value);
    					
    ตัวให้บริการข้อมูล DB OLE
    string strCount;
    OleDbConnection PubsConn = new OleDbConnection 
       ("Provider=SQLOLEDB;Data Source=server;" + 
       "integrated Security=sspi;initial catalog=pubs;");
    OleDbCommand testCMD = new OleDbCommand 
       ("TestProcedure2", PubsConn);
    
    testCMD.CommandType = CommandType.StoredProcedure;
    
    OleDbParameter RetVal = testCMD.Parameters.Add 
       ("RetVal", OleDbType.Integer);
    RetVal.Direction = ParameterDirection.ReturnValue;
    OleDbParameter IdIn = testCMD.Parameters.Add 
       ("@au_idIN", OleDbType.VarChar, 11);
    IdIn.Direction = ParameterDirection.Input;
    
    IdIn.Value = "213-46-8915";
    
    PubsConn.Open();
    
    strCount = testCMD.ExecuteScalar().ToString() ;
    
    Console.WriteLine("Number of Rows: " + strCount);
    Console.WriteLine("Return Value: " + RetVal.Value);
    					
  5. แก้ไขสายอักขระการเชื่อมต่อสำหรับการเชื่อมต่อวัตถุให้ชี้ไปยังคอมพิวเตอร์ที่กำลังเรียกใช้ SQL Server
  6. การเรียกใช้รหัส ประกาศเมธอดExecuteScalarของวัตถุคำสั่งส่งกลับค่าพารามิเตอร์ ExecuteScalarส่งกลับค่าของคอลัมน์ 1 แถวที่ 1 ของ rowset ส่งคืนมา ดังนั้น ค่าของintCountเป็นผลลัพธ์ของฟังก์ชัน count จากกระบวนงานที่เก็บไว้

ใช้เมธอด ExecuteNonQuery ของวัตถุคำสั่ง

ตัวอย่างนี้ใช้เมธอดExecuteNonQueryเพื่อเรียกใช้แบบสอบถาม และ จะส่งกลับค่าพารามิเตอร์ ExecuteNonQueryส่งกลับจำนวนของระเบียนที่จะได้รับผลกระทบหลังจากเรียกใช้แบบสอบถาม อย่างไรก็ตามExecuteNonQueryไม่กลับแถวหรือคอลัมน์ใด ๆ จากกระบวนงานที่เก็บไว้

วิธีการExecuteNonQueryมีประโยชน์มากเมื่อคุณใช้คำสั่ง INSERT, UPDATE หรือลบถ้าคุณต้องทราบจำนวนแถวที่มีการเปลี่ยนแปลง ในกระบวนงานที่เก็บที่คุณกำลังใช้เฉพาะคำสั่ง select คุณได้รับ -1 ได้เนื่องจากไม่มีแถวที่ได้รับผลจากแบบสอบถาม
  1. สร้างกระบวนงานที่เก็บไว้ดังต่อไปนี้บนคอมพิวเตอร์ที่กำลังเรียกใช้ SQL Server:
    Create Procedure TestProcedure3
    (
      @au_idIN varchar (11),
      @au_fnam varchar (30)
    )
    
    As
    /* set nocount on */ 
    Update authors set au_fname = @au_fnam
    where au_id = @au_idin	
    return (5)
    					
  2. สร้างคำใหม่ Visual C#แอพลิเคชัน Windows สุทธิโครงการ
  3. ใช้คำสั่งที่ใช้ในระบบและจำนวนมากSystem.Dataเพื่อให้คุณไม่ได้รับการประกาศในจำนวนมากเหล่านั้นในภายหลังในรหัสของคุณ เพิ่มรหัสนี้ไปยังด้านบนของแบบฟอร์มโค้ดโมดูล ตรวจสอบให้แน่ใจว่า คุณต้องคัดลอกรหัสเฉพาะสำหรับผู้ให้บริการที่คุณเลือกไคลเอ็นต์ SQL
    using System.Data.SqlClient;
    					
    ตัวให้บริการข้อมูล DB OLE
    using System.Data.OleDb;
    					
  4. การแทนรหัสใต้เหตุการณ์Form1_Loadส่วนตัวในโมดูล Form1 รหัส ด้วยรหัสต่อไปนี้:ไคลเอ็นต์ SQL
    string strRowAffect;
    SqlConnection PubsConn = new SqlConnection 
       ("Data Source=server;integrated Security=sspi;" + 
       "initial catalog=pubs;");
    SqlCommand testCMD = new SqlCommand 
       ("TestProcedure3", PubsConn);
    
    testCMD.CommandType = CommandType.StoredProcedure;
    
    SqlParameter RetVal = testCMD.Parameters.Add 
       ("RetVal", SqlDbType.Int);
    RetVal.Direction = ParameterDirection.ReturnValue;
    SqlParameter IdIn = testCMD.Parameters.Add 
       ("@au_idIN", SqlDbType.VarChar, 11);
    IdIn.Direction = ParameterDirection.Input;
    SqlParameter FnameIn = testCMD.Parameters.Add 
       ("@au_fnam", SqlDbType.VarChar, 30);
    FnameIn.Direction = ParameterDirection.Input;
    
    IdIn.Value = "213-46-8915";
    FnameIn.Value = "Marjorie";
    
    PubsConn.Open();
    
    strRowAffect =testCMD.ExecuteNonQuery ().ToString() ;
    
    Console.WriteLine("Number of Rows: " + strRowAffect );
    Console.WriteLine("Return Value: " + RetVal.Value);
    					
    ตัวให้บริการข้อมูล DB OLE
    int intRowAffected;
    OleDbConnection PubsConn = new OleDbConnection 
       ("Provider=SQLOLEDB;Data Source=server;" + 
       "integrated Security=sspi;initial catalog=pubs;");
    OleDbCommand testCMD = new OleDbCommand 
       ("TestProcedure3", PubsConn);
    
    testCMD.CommandType = CommandType.StoredProcedure;
    
    OleDbParameter RetVal = testCMD.Parameters.Add 
       ("RetVal", OleDbType.Integer);
    RetVal.Direction = ParameterDirection.ReturnValue;
    OleDbParameter IdIn = testCMD.Parameters.Add 
       ("@au_idIN", OleDbType.VarChar, 11);
    IdIn.Direction = ParameterDirection.Input;
    OleDbParameter FnameIn = testCMD.Parameters.Add
       ("@au_fname", OleDbType.VarChar, 30);
    FnameIn.Direction = ParameterDirection.Input;
    
    IdIn.Value = "213-46-8915";
    FnameIn.Value = "Marjorie";
    
    PubsConn.Open();
    intRowAffected = testCMD.ExecuteNonQuery();
    
    Console.WriteLine("Number of Rows affected: " + intRowAffected);
    Console.WriteLine(RetVal.Value);
    					
  5. แก้ไขสายอักขระการเชื่อมต่อสำหรับการเชื่อมต่อวัตถุให้ชี้ไปยังคอมพิวเตอร์ที่กำลังเรียกใช้ SQL Server
  6. การเรียกใช้รหัส หน้าต่างผลลัพธ์แสดงจำนวนของแถวที่ได้รับผลกระทบ (intRowAffect) และค่าของพารามิเตอร์ส่งคืน

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

สำหรับข้อมูลเพิ่มเติม โปรดเยี่ยมชมเว็บไซต์ต่อไปนี้:
บทนำสู่การโปรดเรียกไลบรารีของคลาส

รับข้อมูลโดยใช้การ DataReader

คุณสมบัติ

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

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

 

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