如何: 使用 ADO 调用参数化存储的过程。NET 和 C#。NET

文章翻译 文章翻译
文章编号: 310070 - 查看本文应用于的产品
本文的发布号曾为 CHS310070
展开全部 | 关闭全部

本文内容

概要

使用 ADO 的方法有多种。NET 调用存储的过程并获得返回值和返回参数,其中包括:
  • 使用DataSet对象收集返回的行,并使用这些行以及返回值和返回参数。
  • 使用DataReader对象收集返回的行,移动到这些行,然后收集返回值和返回参数。
  • 使用ExecuteScalar方法的返回值和返回参数的结果的第一行的第一列中返回的值。这是最有用的聚合函数。
  • 使用ExecuteNonQuery方法返回仅返回的参数和返回值。将丢弃任何返回的行。这是对执行操作查询非常有用。
本文演示的最后三个方法,并使用SqlCommandOleDbCommand的对象。请确保您托管提供程序所使用的复制的代码。如果您不确定应该使用哪个托管提供程序,请访问下面的 Microsoft 开发人员网络 Web 站点:
.NET 数据提供程序
在这篇文章中的示例中,参数将被添加到命令对象的参数集合中。当您使用的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#。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,第 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 的代码模块中的专用Form1_Load事件将下面的代码替换下面的代码: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 标准版
  • Microsoft Visual C# .NET 2003 标准版
关键字:?
kbhowtomaster kbsqlclient kbstoredproc kbsystemdata kbmt KB310070 KbMtzh
机器翻译
注意:这篇文章是由无人工介入的微软自动的机器翻译软件翻译完成。微软很高兴能同时提供给您由人工翻译的和由机器翻译的文章, 以使您能使用您的语言访问所有的知识库文章。然而由机器翻译的文章并不总是完美的。它可能存在词汇,语法或文法的问题,就像是一个外国人在说中文时总是可能犯这样的错误。虽然我们经常升级机器翻译软件以提高翻译质量,但是我们不保证机器翻译的正确度,也不对由于内容的误译或者客户对它的错误使用所引起的任何直接的, 或间接的可能的问题负责。
点击这里察看该文章的英文版: 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