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

原文地址:https://www.cnblogs.com/wlsandwho/p/4364899.html