HOW TO:使用 ADO.NET 和 Visual C# .NET 调用带参数的存储过程
来源:互联网 发布:淘宝天猫店怎么开 编辑:程序博客网 时间:2024/05/16 11:32
HOW TO:使用 ADO.NET 和 Visual C# .NET 调用带参数的存储过程
対象製品本文的发布号曾为 CHS310070
有关本文的 Microsoft Visual Basic .NET 版本,请参见 308049。
有关本文的 Microsoft Visual C++ .NET 版本,请参见 310071。
有关本文的 Microsoft Visual J# .NET 版本,请参见 320627。
本文引用下面的 Microsoft .NET 框架类库名称空间:
有关本文的 Microsoft Visual C++ .NET 版本,请参见 310071。
有关本文的 Microsoft Visual J# .NET 版本,请参见 320627。
本文引用下面的 Microsoft .NET 框架类库名称空间:
- System.Data.SqlClient
- System.Data.OleDb
本任务的内容
概要
有多种方法使用 ADO.NET 调用存储过程并获得返回值和返回参数,包括:- 使用 DataSet 对象,在获得返回值和返回参数之外,还可以收集并使用返回的数据行。
- 使用 DataReader 对象收集返回的行,遍历这些行,然后收集返回值和返回参数。
- 使用 ExecuteScalar 方法返回结果中第一行的第一列的值,以及返回值和返回参数。这对于聚合函数特别有用。
- 使用 ExecuteNonQuery 方法只返回参数和返回值。任何返回的行都将被丢弃。这对于执行操作查询特别有用。
返回页首
使用 DataReader 返回行和参数
您可以使用 DataReader 对象返回只读的仅向前型数据流。DataReader 中所包含的信息可以来自一个存储过程。本示例使用 DataReader 对象运行带有输入参数和输出参数的存储过程,然后遍历返回记录,查看返回参数。- 在运行 Microsoft SQL Server 的服务器上创建下面的存储过程:
Create Procedure TestProcedure(@au_idIN varchar (11),@numTitlesOUT Integer OUTPUT)ASselect 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)
- 新建一个 Visual C# .NET Windows 应用程序项目。
- 对 System 和 System.Data 名称空间使用 using 语句,这样,在后面的代码中就不需要在这些名称空间中限定声明了。将此代码添加到"窗体"代码模块的顶部。请确保只复制对应于您所选的提供程序的代码。 SQL 客户机
using System.Data.SqlClient;
OLE DB 数据提供程序using System.Data.OleDb;
- 用以下代码替换 private 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);
- 修改 Connection 对象的连接字符串,以便指向运行 SQL Server 的计算机。
- 运行此代码。注意,DataReader 检索记录并返回参数值。您可以使用 DataReader 对象的 Read 方法遍历返回的记录。
输出窗口显示两本书的标题、返回值 5 和输出参数,其中包含记录的数目 (2)。注意,您必须关闭代码中的 DataReader 才能看到参数值。另请注意,如果关闭了 DataReader,则不必为了查看返回参数而遍历所有记录。
使用 Command 对象的 ExecuteScalar 方法
您可以使用 Command 对象的 ExecuteScalar 方法检索参数值。另外,ExecuteScalar 返回该存储过程的第一行的第一列。这对于聚合函数特别有用,如下例所示。- 在运行 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)
- 新建一个 Visual C# .NET Windows 应用程序项目。
- 对 System 和 System.Data 名称空间使用 using 语句,这样,在后面的代码中就不需要在这些名称空间中限定声明了。将此代码添加到"窗体"代码模块的顶部。请确保只复制对应于您所选的提供程序的代码。 SQL 客户机
using System.Data.SqlClient;
OLE DB 数据提供程序using System.Data.OleDb;
- 将下面的代码添加到 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);
- 修改 Connection 对象的连接字符串,以便指向运行 SQL Server 的计算机。
- 运行此代码。注意,Command 对象的 ExecuteScalar 方法返回参数。ExecuteScalar 也会将返回的行集合的第一行第一列的值返回。因此,intCount 的值是存储过程的统计函数的结果。
使用 Command 对象的 ExecuteNonQuery 方法
此示例使用 ExecuteNonQuery 方法运行查询并返回参数值。ExecuteNonQuery 还返回在运行此查询后受影响的记录数。但是,ExecuteNonQuery 不从该存储过程返回任何行或列。如果只需要知道更改的行数,那么在使用 INSERT、UPDATE 或 DELETE 语句时,ExecuteNonQuery 方法就特别有用。在存储过程中仅使用 SELECT 语句时,您将收到 -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_idinreturn (5)
- 新建一个 Visual C# .NET Windows 应用程序项目。
- 对 System 和 System.Data 名称空间使用 using 语句,这样,在后面的代码中就不需要在这些名称空间中限定声明了。将此代码添加到"窗体"代码模块的顶部。请确保只复制对应于您所选的提供程序的代码。 SQL 客户机
using System.Data.SqlClient;
OLE DB 数据提供程序using System.Data.OleDb;
- 用以下代码替换 Form1 代码模块中 private Form_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);
- 修改 Connection 对象的连接字符串,以便指向运行 SQL Server 的计算机。
- 运行此代码。"输出"窗口显示受影响的行数 (intRowAffect) 和返回参数的值。
参考
有关其他信息,请访问下面的 MSDN Web 站点:.NET 框架类库简介
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/cpguide/html/cpconthenetframeworkclasslibrary.asp
使用 DataReader 检索数据
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/cpguide/html/cpcontheadonetdatareader.asp
- HOW TO:使用 ADO.NET 和 Visual C# .NET 调用带参数的存储过程
- HOW TO:使用 ADO.NET 和 Visual C++ .NET 调用带参数的存储过程
- 如何使用 ADO.NET 和 Visual C# .NET 调用带参数的存储过程
- 如何使用 ADO.NET 和 Visual C# .NET 调用带参数的存储过程
- 如何使用 ADO.NET 和 Visual C# .NET 调用带参数的存储过程
- Ado.Net调用带输入,输出参数的存储过程
- 【ASP.NET开发】ADO.NET调用带输出参数的存储过程
- 使用ADO.NET对象调用存储过程的输入和输出参数
- C#二十六 使用Ado.Net调用存储过程
- HOW TO:使用 Visual C# .NET 在 ADO.NET 中以编程方式构建连接字符串
- VB.net 调用带参数存储过程
- asp.net调用带返回值参数的存储过程
- ADO.NET调用存储过程
- ADO.NET调用存储过程
- C#调用带参数的存储过程
- asp.net中使用带参数的存储过程
- [转载]asp.net中使用带参数的存储过程
- [.NET]ADO.NET调用存储过程
- 如何成为Java高手----献给所有初学者!(转贴)
- 正则表达式
- [转载]Java面试中的陷阱
- ASP.NET 应用程序安全设计原则
- 软件人员的生涯规划
- HOW TO:使用 ADO.NET 和 Visual C# .NET 调用带参数的存储过程
- How To Use a DataReader Against an Oracle Stored Procedure in Visual C# .NET
- 00016.url of media security
- 所有老公必看的爱情教条
- 《RFC 2464 Transmission of IPv6 Packets over Ethernet Networks》学习小结
- 留神MSN和QQ好友发送来的文件!!!
- .NET重要技术思考——原文在《程序员》杂志第六期
- 如何在WINDOWS 2000将ORALCE完全卸载
- 如何安装VS.NET2003中文版自带的QuickStart