==================================声明==================================

本文原创,转载在正文中显要的注明作者和出处,并保证文章的完整性。

未经作者同意请勿修改(包括本声明),保留法律追究的权利。

未经作者同意请勿用于出版、印刷或学术引用。

本文不定期修正完善,为保证内容正确,建议移步原文处阅读。

本文链接:http://www.cnblogs.com/wlsandwho/p/4364899.html

=======================================================================

文中使用到的TESTHR函数,并非本人所写,摘自中文版chm格式的《microsoft ado 2.5 程序员参考》。

  1. inline void TESTHR(HRESULT x) {if FAILED(x) _com_issue_error(x);}

=======================================================================

错误处理跟优雅退出肯定写的不好,凑合下吧。

=======================================================================

本例的目的/效果:用参数化查询的方式从表testtable3中读取部分数据。

=======================================================================

用于测试的数据库

testdb

用于测试的登录名和密码

testdev

123456

用于测试的sqlserver_ed.udl文件内容

  1. [oledb]
  2. Everything after this line is an OLE DB initstring
  3. Provider=SQLOLEDB.1;Password=HTSQL;Persist Security Info=True;User ID=sa;Initial Catalog=testdb;Data Source=192.168.0.14\SQLEXPRESS

用于测试的表

  1. CREATE TABLE [dbo].[testtable3](
  2. [No] [int] IDENTITY(1,1) NOT NULL,
  3. [id] [int] NULL,
  4. [val] [nvarchar](50) NULL,
  5. CONSTRAINT [PK_testtable3] PRIMARY KEY CLUSTERED
  6. (
  7. [No] ASC
  8. )WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
  9. ) ON [PRIMARY]

表中初始数据

No          id          val
----------- ----------- ------
1           123         1
2           125         123123
3           126         12
4           127         2
5           128         2
6           127         123123

=======================================================================

VC++测试代码

  1. void CTestADOwithParameterizedDlg::OnBnClickedButton1()
  2. {
  3. // TODO: 在此添加控件通知处理程序代码
  4. if (FAILED(::CoInitialize(NULL)))
  5. {
  6. MessageBox(TEXT("初始化失败"));
  7.  
  8. return;
  9. }
  10.  
  11. int nNo=;
  12. int nId=;
  13.  
  14. _ConnectionPtr pConn;
  15. _CommandPtr pCmd;
  16. _ParameterPtr pParam1;
  17. _ParameterPtr pParam2;
  18. _RecordsetPtr pRecordset;
  19.  
  20. try
  21. {
  22. TESTHR(pConn.CreateInstance(TEXT("ADODB.Connection")));
  23.  
  24. pConn->ConnectionString=TEXT("File Name=sqlserver_ed.udl");
  25. pConn->CommandTimeout=;
  26. pConn->CursorLocation=adUseClient;
  27. pConn->Mode=adModeUnknown;
  28. pConn->Open(TEXT(""),TEXT(""),TEXT(""),adConnectUnspecified);
  29.  
  30. TESTHR(pCmd.CreateInstance(TEXT("ADODB.Command")));
  31.  
  32. pCmd->ActiveConnection=pConn;
  33. pCmd->CommandText=TEXT("select id,val from testtable3 where No<? and id>?");
  34.  
  35. TESTHR(pParam1.CreateInstance(TEXT("ADODB.Parameter")));
  36.  
  37. pParam1=pCmd->CreateParameter(TEXT(""),adInteger,adParamInput,sizeof(int));
  38. pParam1->Value=_variant_t(nNo);
  39. pCmd->Parameters->Append(pParam1);
  40.  
  41. TESTHR(pParam2.CreateInstance(TEXT("ADODB.Parameter")));
  42.  
  43. pParam2=pCmd->CreateParameter(TEXT(""),adInteger,adParamInput,sizeof(int));
  44. pParam2->Value=_variant_t(nId);
  45. pCmd->Parameters->Append(pParam2);
  46.  
  47. TESTHR(pRecordset.CreateInstance(TEXT("ADODB.Recordset")));
  48.  
  49. pRecordset=pCmd->Execute(NULL,NULL,adCmdText);
  50.  
  51. VARIANT vtRes;
  52. while (!pRecordset->adoEOF)
  53. {
  54. vtRes=pRecordset->GetCollect(TEXT("id"));
  55. OutputDebugString((LPCWSTR)_bstr_t(vtRes));
  56. OutputDebugString(TEXT("\t"));
  57. vtRes=pRecordset->GetCollect(TEXT("val"));
  58. OutputDebugString((LPCWSTR)_bstr_t(vtRes));
  59. OutputDebugString(TEXT("\n"));
  60.  
  61. pRecordset->MoveNext();
  62. }
  63. }
  64. catch (_com_error &e)
  65. {
  66. }
  67.  
  68. CoUninitialize();
  69. }

=======================================================================

执行结果

126    12
127    2
128    2

=======================================================================

基本上不会在前台用到查询语句,广泛的是调用存储过程。

=======================================================================

PS:代码37和43行的TEXT宏中,写不写东西,随便写点东西不影响结果。

  当然这是在普通的一次性调用中。

  如果_CommandPtr想多次利用,而每次调用的存储过程又是不同的参数,那么最好是起个名字,每次都删除一下。

  详见http://www.cnblogs.com/wlsandwho/p/4367798.html

SQL Server 2008 R2——VC++ ADO 操作 参数化查询的更多相关文章

  1. SQL Server 2008 R2——VC++ ADO 操作 事务

    ==================================声明================================== 本文原创,转载在正文中显要的注明作者和出处,并保证文章的完 ...

  2. SQL Server 2008 R2——VC++ ADO 操作 存储过程 向datetime类型参数传入空值

    ==================================声明================================== 本文原创,转载在正文中显要的注明作者和出处,并保证文章的完 ...

  3. SQL Server 2008 R2——VC++ ADO 操作 重复利用_CommandPtr

    ==================================声明================================== 本文原创,转载在正文中显要的注明作者和出处,并保证文章的完 ...

  4. SQL Server 2008 R2——VC++ ADO 操作 存储过程

    ==================================声明================================== 本文原创,转载在正文中显要的注明作者和出处,并保证文章的完 ...

  5. SQL Server 2008 R2——VC++ ADO 操作 重复利用_ParameterPtr

    ==================================声明================================== 本文原创,转载在正文中显要的注明作者和出处,并保证文章的完 ...

  6. SQL Server 2008 R2——VC++ ADO 操作 多线程操作 代码结构

    ==================================声明================================== 本文原创,转载在正文中显要的注明作者和出处,并保证文章的完 ...

  7. SQL Server 2008 R2 性能计数器详细列表(五)

    原文:SQL Server 2008 R2 性能计数器详细列表(五) SQL Server:SQL Statistics 对象: 监视编译和发送到 SQL Server 实例的请求类型 SQL Ser ...

  8. SQL Server 2008 R2 性能计数器详细列表(四)

    原文:SQL Server 2008 R2 性能计数器详细列表(四) SQL Server Latches 对象: 监视称为闩锁的内部 SQL Server 资源锁.通过监视闩锁来确定用户活动和资源使 ...

  9. SQL Server 2000向SQL Server 2008 R2推送数据

    [文章摘要]最近做的一个项目要获取存在于其他服务器的一些数据,为了安全起见,采用由其他“服务器”向我们服务器推送的方式实现.我们服务器使用的是SQL Server 2008 R2,其他“服务器”使用的 ...

随机推荐

  1. Spring总结—— IOC 和 Bean 的总结

    一.Spring 官方文档中给出的 Spring 的整体结构. 二.我自己所理解的 Spring 整体结构图. 三.本次总结 Spring 核心部分 1.从上面图中可以看出,Beans 和 Conte ...

  2. ok6410 android driver(12)

    In this essay, I will talk about how to write the service libraries. TIPS : I won't discuss the name ...

  3. 重构第7天 重命名(Rename )

    理解:重命名就是把一些函数.字段.类.参数的名称 重命名为易于理解,最好是和自身的意义相同的名称.这样更易于理解,也可以减少大量的注释,名字即含义. 详解: 这个重构方法是我经常也是最常用的一种.我们 ...

  4. UnityShader快速上手指南(一)

    简介 引言 其实网上有很多shader教程,但是大概看了下,也不知是网上各位大神已经脱离了代码层面的高度还是啥原因.貌似没有找到从代码方面作为入门讲解的,导致了shader对于苦逼程序员入门有一定要求 ...

  5. jQuery的事件change

    人生还在继续,只有不断补充以前所不懂的知识,今天练习一个jQuery的事件change.这个事件是在对象失去focus并且原本值有所变化时就产生此事件.如select时,用户所选择的选项有变时,或是t ...

  6. Python入门笔记(9):元组

    一.元组特性 1.类似列表,但不可变类型,正因如此,它可以做一个字典的key2.当处理一组对象时,这个组默认是元组类型(老写错"元祖")3.所有的多对象,逗号分隔的,没有明确用符号 ...

  7. 验证控件插图扩展控件ValidatorCalloutExtender(用于扩展验证控件)和TextBoxWatermarkExtender

    <asp:ScriptManager ID="ScriptManager1" runat="server">  </asp:ScriptMan ...

  8. Titanium开发环境搭建第二个坑

    1. build时总提示  --key-password <keypass> 参数没传,不填又说密码不对,填对了又说没传,应该是ide的问题,暂时不知怎样去设置该命令参数: 2. 继续去T ...

  9. 使scp不用输入密码

    使scp不用输入密码 有些时候,我们在复制/移动文件 到另一台机器时会用到scp,因为它比较安全.但如果每次都要输入密码,就比较烦了,尤其是在script里.不过,ssh有另一种用密钥对来验证的方式. ...

  10. 设置php下载文件的超时时间

    使用curl 可以使用curl自己实现一个curl_file_get_contents函数 //CURLOPT_FOLLOWLOCATION TRUE 时将会根据服务器返回 HTTP 头中的 &quo ...