http://support2.microsoft.com/kb/310130/zh-cn

此分步指导文章描述如何使用 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 托管提供程序(如果尚未进行):

  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 订购的产品列表、顾客为每个订单支付的平均运费和订单数。

使用 ODBC .NET 提供程序和 Visual C# .NET 执行 SQL 参数化存储过程的更多相关文章

  1. 远程sql数据库连接不上,provider: 命名管道提供程序, error: 40 - 无法打开到 SQL Server 的连接 错误解决

    错误信息: “ 标题: 连接到服务器------------------------------ 无法连接到 192.168.1.20. ------------------------------其 ...

  2. SQL2008安装时,“provider: 命名管道提供程序, error: 40 - 无法打开到 SQL Server 的连接) (.Net SqlClient Data Provider)” 错误的解决方案

    错误提示: 在与 SQL Server 建立连接时出现与网络相关的或特定于实例的错误.未找到或无法访问服务器.请验证实例名称是否正确并且 SQL Server 已配置为允许远程连接. (provide ...

  3. "provider: 命名管道提供程序, error: 40 - 无法打开到 SQL Server 的连接"错误的解决方法

    这个错误主要有以下几个原因造成: 1. 错误的连接字符串:例如数据源的实例名称“\"错误写成"/"了 2.Named Pipes(NP)没有启动 其他原因,详见:http ...

  4. 如何 ︰ 执行批量更新和插入使用.NET 提供程序在 C#.NET OpenXML

    https://support.microsoft.com/zh-cn/kb/315968 如何 ︰ 执行批量更新和插入使用.NET 提供程序在 C#.NET OpenXML Email Prin ...

  5. ADO.NET入门教程(二)了解.NET数据提供程序

    出处:http://www.cnblogs.com/liuhaorain/archive/2012/02/11/2346312.html 1. 什么是.NET数据提供程序? .NET Framewor ...

  6. SimpleMembership,成员资格提供程序、 通用的提供者和新的 ASP.NET 4.5 Web 窗体和 ASP.NET MVC 4 模板

    ASP.NET MVC 4 互联网模板中添加一些新的. 非常有用的功能,构建 SimpleMembership.这些更改将添加一些很有特色,像很多更简单. 可扩展会员 API 和 OAuth 的支持. ...

  7. 记VS2008初始化Microsoft Visual Sourcesafe源码管理提供程序时失败

    之前vs2008开发一直都好好,不知道为什么如今的vs2008打开和关闭都老是弹出这这个初始化Microsoft Visual Sourcesafe源码管理提供程序时失败的错误 解决方法非常easy: ...

  8. 未在本地计算机上注册"microsoft.ACE.oledb.12.0"提供程序解决办法

    错误信息:未在本地计算机上注册“microsoft.ACE.oledb.12.0”提供程序. 解决办法: 去http://download.microsoft.com/download/7/0/3/7 ...

  9. 未在本地计算机上注册“Microsoft.ACE.OLEDB.12.0”提供程序。

    笔记本装的是windows 7旗舰版64位系统,使用的是MS Office 2007(Microsoft.ACE.OLEDB.12.0,32位程序),开发用的是Visual Studio 2010,我 ...

随机推荐

  1. MySQL Python教程(1)

    首先对于数据库的基本操作要有一定基础,其次了解Python的基础语法. 建议先阅读MysqL中文教程http://doc.mysql.cn/mysql5/refman-5.1-zh.html-chap ...

  2. FineUI第十二天---锚点布局

    锚点布局的典型结构: <x:Panel Layout="Anchor" runat="server">              <Items ...

  3. linux 下安装ftp服务器

    最后重启    # service vsftpd restart   1.查看是否安装vsftp rpm -qa | grep ftp 如果出现    vsftpd-2.0.5-16.el5_5.1 ...

  4. 淘宝(阿里百川)手机客户端开发日记第一篇 android 主框架搭建(一)

    android 主框架搭建(一) 1.开发环境:Android Studio 相继点击下一步,直接项目建立完毕(如下图) 图片看的效果如果很小,请放大您的浏览器显示百分比  转载请注明http://w ...

  5. 第一款支持容器和云部署的开源数据库Neo4j 3.0

    导读 Neo4j 3.0.0 正式发布,这是 Neo4j 3.0 系列的第一个版本.此版本对内部架构进行了全新的设计:提供给开发者更强大的生产力:提供更广阔的部署选择.Neo4j 3.0 被认为是世界 ...

  6. Xcode 8 打印输出: Class PLBuildVersion is implemented in both...

    在xcode8中,屏蔽了一些奇怪的输出之后,又发现了一个.具体啥原因还不是太清楚.但是可以解决这个问题,让其停止打印这个信息. 在 info.plist 中,添加两个键值对: 针对photo: key ...

  7. hiho #1114 : 小Hi小Ho的惊天大作战:扫雷·一

    #1114 : 小Hi小Ho的惊天大作战:扫雷·一 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 故事背景:密室.监视器与充满危机的广场 “我们还是循序渐进,先来考虑这 ...

  8. 多版本python共存

    当不同版本python之间相互不能兼容时,可以使用virtualenv创建不同版本python的虚拟环境 当没有指定python解释器时(如下-p 即为指定的python版本),将使用默认的全局pyt ...

  9. 一、 Java的值传递和引用传递

    如果参数类型是原始类型(基本类型),那么传过来的就是这个参数的一个副本,也就是这个原始参数的值,这个跟之前所谈的传值是一样的.如果在函数中改变了副本的值不会改变原始的值. 如果参数类型是引用类型,那么 ...

  10. qt-5.6.0 移植之qt文件系统的建立

    经过差不多两个星期的奋斗,终于在板子里面跑起来了qt 程序,虽然现在还没有把触摸屏驱动加上去,但是我相信已经不远了!!!!! 在前两篇的随笔里面 , 已经编译好了最纯净的文件系统以及交叉编译完成了qt ...