310130 HOW TO:使用 ODBC .NET 提供程序和 Visual C# .NET 执行 SQL 参数化存储过程 (From MKBA)

本文的发布号曾为 CHS310130
有关本文的 Microsoft Visual Basic .NET 版本,请参见 309486
有关本文的 Microsoft Visual C++ .NET 版本,请参见 310142

本文引用下面的 Microsoft .NET 框架类库名称空间:
  • Microsoft.Data.Odbc

本任务的内容

概要

此分步指导文章描述如何使用 ODBC .NET 托管提供程序和 Visual C# .Net 调用参数化 SQL Server 存储过程。

尽管使用 ODBC .NET 提供程序执行参数化存储过程与使用 SQL 或 OLE DB 提供程序执行同一存储过程差别不大,但一个重要的差别是:存储过程必须使用 ODBC CALL 语法进行调用,而不能使用存储过程的名称。有关此 CALL 语法的其他信息,请参见 MSDN 库中 ODBC Programmer's Reference(ODBC 程序员参考)中的"Procedure Calls"(过程调用)主题。

返回页首

调用语法示例

  1. 这是罗斯文示例数据库中一个要求单个输入参数的实际存储过程的调用语法示例:
    {CALL CustOrderHist (?)}
  2. 这是一个要求单输入参数并返回一个输出参数和一个返回值的存储过程的调用语法示例:第一个占位符代表返回值:
    {? = CALL Procedure1 (?, ?)
  3. ODBC .NET 托管提供程序,如 OLE DB 提供程序,按照位置顺序(从 0 开始)而不是按名称处理参数。
返回页首

测试项目 - 单输入参数

  1. 从以下 Microsoft Web 站点下载并安装 ODBC.NET 托管提供程序(如果尚未进行):

    http://www.microsoft.com/data

  2. 启动 Visual Studio .NET,然后新建一个 Visual C# .NET Windows 应用程序(名称自定)。
  3. 项目菜单中,单击添加引用,然后双击 Microsoft.Data.ODBC.dll 将其添加到所选项目列表。关闭引用对话框。
  4. 将下面的语句添加到代码窗口的顶部:
    using System.Data;
    using Microsoft.Data.Odbc;
  5. Button 控件从工具箱拖到默认窗体中。
  6. 双击插入的按钮切换到该按钮的 Click 事件的代码窗口。将以下代码输入或粘贴到 Click 事件过程,根据需要修改 SQL Server 连接字符串:
    OdbcConnection cn;
    OdbcCommand cmd;
    OdbcParameter prm;
    OdbcDataReader dr;
    
    try{
    //Change the connection string to use your SQL Server.
    cn = new OdbcConnection("Driver={SQL Server};Server=servername;Database=Northwind;Trusted_Connection=Yes");
    
    //Use ODBC call syntax.
    cmd = new OdbcCommand("{call CustOrderHist (?)}", cn);
    
    prm = cmd.Parameters.Add("@CustomerID", OdbcType.Char, 5);
    prm.Value = "ALFKI";
    
    cn.Open();
    
    dr = cmd.ExecuteReader();
    
    //List each product.
    while (dr.Read())
    	Console.WriteLine(dr.GetString(0));
    
    //Clean up.
    dr.Close();
    cn.Close();
    }
    catch (OdbcException o) {
    MessageBox.Show(o.Message.ToString());
    }
  7. 运行该项目。此代码调用"CustOrderHist"存储过程,传递 CustomerID 作为单输入参数并返回一个结果集。在输出窗口中,您应该看到罗斯文顾客 ALFKI 订购的产品列表。

    备注:按 CTRL+ALT+O 组合键可以打开输出窗口。
返回页首

测试项目 - 多参数类型

  1. 使用 Query Analyzer,在罗斯文示例数据库中创建以下存储过程:此存储过程接受将 CustomerID 作为输入参数并返回一个顾客订单列表,返回顾客支付的每个订单的平均运费作为输出参数,返回顾客的订单数作为返回值。
    CREATE PROCEDURE usp_TestParameters
    @CustID CHAR(5),
    @AvgFreight MONEY OUTPUT
    AS
    SELECT @AvgFreight = AVG(Freight) FROM Orders WHERE CustomerID = @CustID
    SELECT * FROM Orders WHERE CustomerID = @CustID
    RETURN @@ROWCOUNT
  2. 重复上述步骤 1 到 6,将按钮的 Click 事件过程替换为以下代码:
    OdbcConnection cn;
    
    try{
    cn = new OdbcConnection("Driver={SQL Server};Server=servername;Database=Northwind;Trusted_Connection=Yes");
    
    OdbcCommand cmd = new OdbcCommand("{? = call usp_TestParameters (?, ?)}", cn);
    
    OdbcParameter prm = cmd.Parameters.Add("@RETURN_VALUE", OdbcType.Int);
    prm.Direction = ParameterDirection.ReturnValue;
    
    prm = cmd.Parameters.Add("@CustomerID", OdbcType.Char, 5);
    prm.Value = "ALFKI";
    
    prm = cmd.Parameters.Add("@AvgFreight", OdbcType.Double);
    prm.Direction = ParameterDirection.Output;
    
    cn.Open();
    OdbcDataReader dr = cmd.ExecuteReader();
    
    while (dr.Read())
    Console.WriteLine(dr.GetString(0));
    
    dr.Close();
    cn.Close();
    
    Console.WriteLine("Average Freight (output param):{0}", cmd.Parameters[2].Value);
    Console.WriteLine("Order Count (return value):{0}", cmd.Parameters[0].Value);
    
    }
    
    catch (OdbcException o) {
    MessageBox.Show(o.Message.ToString());
    }
  3. 运行该项目。此代码调用在上述步骤 1 中创建的"usp_TestParameters"存储过程,传递 CustomerID 作为单输入参数,并返回一个结果集和一个输出参数作为返回值。在输出窗口,您应看到罗斯文顾客 ALFKI 订购的产品列表、顾客为每个订单支付的平均运费和订单数。

    备注:按 CTRL+ALT+O 组合键可以打开输出窗口。
返回页首

疑难解答

  • 常用于调用存储过程的 ADO 语法(其中只将过程名作为 CommandText 提供)无法用于 ODBC .NET 托管提供程序。
  • 当存储过程返回一个结果集时,除非已访问并关闭结果集,否则看不到输出参数和返回值。例如,如果略去上面第二个示例中"dr.Close()"一行,我们将无法得到输出参数和返回值。
  • ODBC .NET 托管提供程序,如 OLE DB 提供程序,按照位置顺序(从 0 开始)而不是按名称处理参数。
  • ODBC .NET 托管提供程序不与 Visual Studio .NET 一起提供,必须单独下载。
返回页首

参考

有关 ODBC CALL 语法的其他信息,请参见 MSDN 库中 ODBC Programmer's Reference(ODBC 程序员参考)中的"Procedure Calls"(过程调用)主题。

返回页首

这篇文章中的信息适用于:

  • Microsoft ADO.NET(随 .NET 框架一起提供)
  • Microsoft Visual C# .NET (2002)
最近更新:2002-6-18 (1.0)
关键字kbDatabase kbhowto kbHOWTOmaster kbODBC kbSystemData KB310130
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值