==================================声明==================================
本文原创,转载在正文中显要的注明作者和出处,并保证文章的完整性。
未经作者同意请勿修改(包括本声明),保留法律追究的权利。
未经作者同意请勿用于出版、印刷或学术引用。
本文不定期修正完善,为保证内容正确,建议移步原文处阅读。
本文链接: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=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("\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想多次利用,而每次调用的存储过程又是不同的参数,那么最好是起个名字,每次都删除一下。