HOW TO: 使用 ADO 來呼叫參數化的預存程序。NET 和視覺化 C#。NET

文章翻譯 文章翻譯
文章編號: 310070 - 檢視此文章適用的產品。
全部展開 | 全部摺疊

在此頁中

結論

有幾種方式可以使用 ADO。NET 呼叫預存程序,並取回傳回值,並傳回參數,包括:
  • 蒐集傳回的資料列,並與這些資料列中,除了傳回值和傳回參數搭配使用,請使用資料集物件。
  • 您可以使用DataReader物件蒐集傳回的資料列,將這些資料列,然後再以蒐集傳回值和傳回參數。
  • 使用ExecuteScalar方法來傳回結果的傳回值和傳回參數的第一列的第一欄的值。這是最有用的彙總函式。
  • 請使用ExecuteNonQuery方法來傳回傳回的參數和傳回值。傳回的資料列都會被捨棄。這是最適合用來執行巨集指令查詢。
本文將示範最後三個方法,並同時使用sql 命令OleDbCommand物件。請確定您複製受管理的提供者所使用的程式碼。如果您不確定應該使用哪一個受管理提供者,請造訪下列 Microsoft 開發人員網路的網站:
.NET 資料提供者
在這份文件中的範例中,參數會加入至命令物件的參數集合。當您使用sql 命令物件時,您沒有在任何特定順序中的新增參數,但參數都必須有正確的名稱。當您使用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#。NET Windows 應用程式專案。
  3. 使用系統System.Data命名空間的using陳述式,這樣您不需要限定這些命名空間,稍後在程式碼中的宣告。將這段程式碼加入至表單的程式碼模組的頂端。請確定您已選擇之提供者中複製的程式碼。SQL 用戶端
    using System.Data.SqlClient;
    					
    OLE DB 資料提供者
    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);
    					
    OLE DB 資料提供者
    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物件的Read方法傳回的記錄之間移動。

    [輸出] 視窗會顯示兩本書的標題、 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#。NET Windows 應用程式專案。
  3. 使用系統System.Data命名空間的using陳述式,這樣您不需要限定這些命名空間,稍後在程式碼中的宣告。將這段程式碼加入至表單的程式碼模組的頂端。請確定您複製您所選擇的提供者的程式碼。SQL 用戶端
    using System.Data.SqlClient;
    					
    OLE DB 資料提供者
    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);
    					
    OLE DB 資料提供者
    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,傳回的資料列集的第一列的資料行的值。因此, intCount的值是計算函式的預存程序的結果。

使用命令物件的 ExecuteNonQuery 方法

這個範例使用ExecuteNonQuery方法,以執行查詢,並傳回的參數值。ExecuteNonQuery也會傳回所造成的影響查詢執行後的記錄數目。不過, ExecuteNonQuery不會從預存程序傳回任何列或欄。

如果您只需要知道變更多少資料列會使用插入、 更新或刪除的陳述式時, ExecuteNonQuery方法十分實用。在您使用 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#。NET Windows 應用程式專案。
  3. 使用系統System.Data命名空間的using陳述式,這樣您不需要限定這些命名空間,稍後在程式碼中的宣告。將這段程式碼加入至表單的程式碼模組的頂端。請確定您複製您所選擇的提供者的程式碼。SQL 用戶端
    using System.Data.SqlClient;
    					
    OLE DB 資料提供者
    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);
    					
    OLE DB 資料提供者
    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) 數和傳回參數的值。

?考

如需詳細資訊,請造訪下列 MSDN 網站:
簡介。NET Framework 類別庫

擷取使用 DataReader 的資料

屬性

文章編號: 310070 - 上次校閱: 2012年6月12日 - 版次: 1.0
這篇文章中的資訊適用於:
  • Microsoft ADO.NET 1.1
  • Microsoft Visual C# .NET 2002 Standard Edition
  • Microsoft Visual C# .NET 2003 標準版
關鍵字:?
kbhowtomaster kbsqlclient kbstoredproc kbsystemdata kbmt KB310070 KbMtzh
機器翻譯
重要:本文是以 Microsoft 機器翻譯軟體翻譯而成,而非使用人工翻譯而成。Microsoft 同時提供使用者人工翻譯及機器翻譯兩個版本的文章,讓使用者可以依其使用語言使用知識庫中的所有文章。但是,機器翻譯的文章可能不盡完美。這些文章中也可能出現拼字、語意或文法上的錯誤,就像外國人在使用本國語言時可能發生的錯誤。Microsoft 不為內容的翻譯錯誤或客戶對該內容的使用所產生的任何錯誤或損害負責。Microsoft也同時將不斷地就機器翻譯軟體進行更新。
按一下這裡查看此文章的英文版本:310070
Microsoft及(或)其供應商不就任何在本伺服器上發表的文字資料及其相關圖表資訊的恰當性作任何承諾。所有文字資料及其相關圖表均以「現狀」供應,不負任何擔保責任。Microsoft及(或)其供應商謹此聲明,不負任何對與此資訊有關之擔保責任,包括關於適售性、適用於某一特定用途、權利或不侵權的明示或默示擔保責任。Microsoft及(或)其供應商無論如何不對因或與使用本伺服器上資訊或與資訊的實行有關而引起的契約、過失或其他侵權行為之訴訟中的特別的、間接的、衍生性的損害或任何因使用而喪失所導致的之損害、資料或利潤負任何責任。

提供意見

 

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