• SQL Server 2008 R2——VC++ ADO 操作 参数化查询


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

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

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

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

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

    本文链接: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.14SQLEXPRESS

    用于测试的表

    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=6;
    12     int nId=125;
    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=10;
    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("	"));
    57             vtRes=pRecordset->GetCollect(TEXT("val"));
    58             OutputDebugString((LPCWSTR)_bstr_t(vtRes));
    59             OutputDebugString(TEXT("
    "));
    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

  • 相关阅读:
    thrift ssl 证书整理
    snmp学习笔记
    你必须了解的Session的本质
    安装大文件提示错误
    说说大型高并发高负载网站的系统架构(更新)
    【错误】未能找到类型或命名空间名称XXXX和未能解析引用的程序
    js调用后台代码的几种方式
    HTTP 错误 401.1
    万能的编程语言不要习惯性地把工具当作你天性缺陷的遮羞布
    PostgreSQL与MySQL比较
  • 原文地址:https://www.cnblogs.com/wlsandwho/p/4364899.html
Copyright © 2020-2023  润新知