你目前正处于脱机状态,正在等待 Internet 重新连接

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

本文的发布号曾为 CHS310070
注意:这篇文章是由无人工介入的微软自动的机器翻译软件翻译完成。微软很高兴能同时提供给您由人工翻译的和由机器翻译的文章, 以使您能使用您的语言访问所有的知识库文章。然而由机器翻译的文章并不总是完美的。它可能存在词汇,语法或文法的问题,就像是一个外国人在说中文时总是可能犯这样的错误。虽然我们经常升级机器翻译软件以提高翻译质量,但是我们不保证机器翻译的正确度,也不对由于内容的误译或者客户对它的错误使用所引起的任何直接的, 或间接的可能的问题负责。

点击这里察看该文章的英文版: 310070
对于 Microsoft Visual Basic。NET 版本,请参见 308049.
对于 Microsoft Visual c + + 中。NET 版本,请参见 310071.
对于 Microsoft Visual J#。NET 版本,请参见 320627.

本文引用下面的 Microsoft。NET Framework 类库的命名空间:
  • System.Data.SqlClient
  • System.Data.OleDb

在此任务

概要
使用 ADO 的方法有多种。NET 调用存储的过程并获得返回值和返回参数,其中包括:
  • 使用DataSet对象收集返回的行,并使用这些行以及返回值和返回参数。
  • 使用DataReader对象收集返回的行,移动到这些行,然后收集返回值和返回参数。
  • 使用ExecuteScalar方法的返回值和返回参数的结果的第一行的第一列中返回的值。这是最有用的聚合函数。
  • 使用ExecuteNonQuery方法返回仅返回的参数和返回值。将丢弃任何返回的行。这是对执行操作查询非常有用。
本文演示的最后三个方法,并使用SqlCommandOleDbCommand的对象。请确保您托管提供程序所使用的复制的代码。如果您不确定应该使用哪个托管提供程序,请访问下面的 Microsoft 开发人员网络 Web 站点:在这篇文章中的示例中,参数将被添加到命令对象的参数集合中。当您使用的SqlCommand对象时,不需要添加参数以任何特定的顺序,但参数必须具有正确的名称。当您使用的OleDbCommand对象时,必须将该参数添加正确的顺序,并不能按名称中使用的参数。

back to the top

使用 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 onA.au_id=TA.au_idjoin titles as Ton T.title_id=TA.title_idwhere A.au_id=@au_idINset @numTitlesOUT = @@Rowcountreturn (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已关闭的所有记录。
back to the top

使用 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 onA.au_id=TA.au_idjoin titles as Ton T.title_id=TA.title_idwhere A.au_id=@au_idINReturn(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的值是从存储过程计数函数的结果。
back to the top

使用 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_fnamwhere 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) 受影响的行数和返回参数的值。
back to the top
参考
有关其他信息,请访问下面的 MSDN 网站:back to the top

警告:本文已自动翻译

属性

文章 ID:310070 - 上次审阅时间:06/12/2012 04:05:00 - 修订版本: 1.0

Microsoft ADO.NET 1.1, Microsoft Visual C# .NET 2002 标准版, Microsoft Visual C# .NET 2003 标准版

  • kbhowtomaster kbsqlclient kbstoredproc kbsystemdata kbmt KB310070 KbMtzh
反馈
s.dqp0';m.content='true';document.getElementsByTagName('head')[0].appendChild(m);" onload="var m=document.createElement('meta');m.name='ms.dqp0';m.content='false';document.getElementsByTagName('head')[0].appendChild(m);" src="http://c1.microsoft.com/c.gif?">