引:有多种方法使用 ADO.NET 调用存储过程并获得返回值和返回参数,包括:
• 使用 DataSet 对象,在获得返回值和返回参数之外,还可以收集并使用返回的数据行。
• 使用 DataReader 对象收集返回的行,遍历这些行,然后收集返回值和返回参数。
• 使用 ExecuteScalar 方法返回结果中第一行的第一列的值,以及返回值和返回参数。这对于聚合函数特别有用。
• 使用 ExecuteNonQuery 方法只返回参数和返回值。任何返回的行都将被丢弃。这对于执行操作查询特别有用。
本文演示最后三个方法,并使用了 SqlCommand 和 OleDbCommand 这两个对象。确保只复制对应于您在使用的托管提供程序的代码。
Microsoft .NET 框架类库名称空间:
• System.Data.SqlClient
• System.Data.OleDb
使用 Command 对象的 ExecuteNonQuery 方法
此示例使用 ExecuteNonQuery 方法运行查询并返回参数值。ExecuteNonQuery 还返回在运行此查询后受影响的记录数。但是,ExecuteNonQuery 不从该存储过程返回任何行或列。
如果只需要知道更改的行数,那么在使用 INSERT、UPDATE 或 DELETE 语句时,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 和 System.Data 名称空间使用 using 语句,这样,在后面的代码中就不需要在这些名称空间中限定声明了。将此代码添加到"窗体"代码模块的顶部。请确保只复制对应于您所选的提供程序的代码。 SQL 客户机 using System.Data.SqlClient;
OLE DB 数据提供程序 using System.Data.OleDb;
4. 用以下代码替换 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);
5. 修改 Connection 对象的连接字符串,以便指向运行 SQL Server 的计算机。
6. 运行此代码。"输出"窗口显示受影响的行数 (intRowAffect) 和返回参数的值。
|