SQL Server 2008 R2——VC++ ADO 操作 参数化查询
==================================声明==================================
本文原创,转载在正文中显要的注明作者和出处,并保证文章的完整性。
未经作者同意请勿修改(包括本声明),保留法律追究的权利。
未经作者同意请勿用于出版、印刷或学术引用。
本文不定期修正完善,为保证内容正确,建议移步原文处阅读。
本文链接:http://www.cnblogs.com/wlsandwho/p/4364899.html
=======================================================================
文中使用到的TESTHR函数,并非本人所写,摘自中文版chm格式的《microsoft ado 2.5 程序员参考》。
inline void TESTHR(HRESULT x) {if FAILED(x) _com_issue_error(x);}
=======================================================================
错误处理跟优雅退出肯定写的不好,凑合下吧。
=======================================================================
本例的目的/效果:用参数化查询的方式从表testtable3中读取部分数据。
=======================================================================
用于测试的数据库
testdb
用于测试的登录名和密码
testdev
123456
用于测试的sqlserver_ed.udl文件内容
[oledb]
Everything after this line is an OLE DB initstring
Provider=SQLOLEDB.1;Password=HTSQL;Persist Security Info=True;User ID=sa;Initial Catalog=testdb;Data Source=192.168.0.14\SQLEXPRESS
用于测试的表
CREATE TABLE [dbo].[testtable3](
[No] [int] IDENTITY(1,1) NOT NULL,
[id] [int] NULL,
[val] [nvarchar](50) NULL,
CONSTRAINT [PK_testtable3] PRIMARY KEY CLUSTERED
(
[No] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
表中初始数据
No id val
----------- ----------- ------
1 123 1
2 125 123123
3 126 12
4 127 2
5 128 2
6 127 123123
=======================================================================
VC++测试代码
void CTestADOwithParameterizedDlg::OnBnClickedButton1()
{
// TODO: 在此添加控件通知处理程序代码
if (FAILED(::CoInitialize(NULL)))
{
MessageBox(TEXT("初始化失败")); return;
} int nNo=;
int nId=; _ConnectionPtr pConn;
_CommandPtr pCmd;
_ParameterPtr pParam1;
_ParameterPtr pParam2;
_RecordsetPtr pRecordset; try
{
TESTHR(pConn.CreateInstance(TEXT("ADODB.Connection"))); pConn->ConnectionString=TEXT("File Name=sqlserver_ed.udl");
pConn->CommandTimeout=;
pConn->CursorLocation=adUseClient;
pConn->Mode=adModeUnknown;
pConn->Open(TEXT(""),TEXT(""),TEXT(""),adConnectUnspecified); TESTHR(pCmd.CreateInstance(TEXT("ADODB.Command"))); pCmd->ActiveConnection=pConn;
pCmd->CommandText=TEXT("select id,val from testtable3 where No<? and id>?"); TESTHR(pParam1.CreateInstance(TEXT("ADODB.Parameter"))); pParam1=pCmd->CreateParameter(TEXT(""),adInteger,adParamInput,sizeof(int));
pParam1->Value=_variant_t(nNo);
pCmd->Parameters->Append(pParam1); TESTHR(pParam2.CreateInstance(TEXT("ADODB.Parameter"))); pParam2=pCmd->CreateParameter(TEXT(""),adInteger,adParamInput,sizeof(int));
pParam2->Value=_variant_t(nId);
pCmd->Parameters->Append(pParam2); TESTHR(pRecordset.CreateInstance(TEXT("ADODB.Recordset"))); pRecordset=pCmd->Execute(NULL,NULL,adCmdText); VARIANT vtRes;
while (!pRecordset->adoEOF)
{
vtRes=pRecordset->GetCollect(TEXT("id"));
OutputDebugString((LPCWSTR)_bstr_t(vtRes));
OutputDebugString(TEXT("\t"));
vtRes=pRecordset->GetCollect(TEXT("val"));
OutputDebugString((LPCWSTR)_bstr_t(vtRes));
OutputDebugString(TEXT("\n")); pRecordset->MoveNext();
}
}
catch (_com_error &e)
{
} CoUninitialize();
}
=======================================================================
执行结果
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 操作 参数化查询的更多相关文章
- SQL Server 2008 R2——VC++ ADO 操作 事务
==================================声明================================== 本文原创,转载在正文中显要的注明作者和出处,并保证文章的完 ...
- SQL Server 2008 R2——VC++ ADO 操作 存储过程 向datetime类型参数传入空值
==================================声明================================== 本文原创,转载在正文中显要的注明作者和出处,并保证文章的完 ...
- SQL Server 2008 R2——VC++ ADO 操作 重复利用_CommandPtr
==================================声明================================== 本文原创,转载在正文中显要的注明作者和出处,并保证文章的完 ...
- SQL Server 2008 R2——VC++ ADO 操作 存储过程
==================================声明================================== 本文原创,转载在正文中显要的注明作者和出处,并保证文章的完 ...
- SQL Server 2008 R2——VC++ ADO 操作 重复利用_ParameterPtr
==================================声明================================== 本文原创,转载在正文中显要的注明作者和出处,并保证文章的完 ...
- SQL Server 2008 R2——VC++ ADO 操作 多线程操作 代码结构
==================================声明================================== 本文原创,转载在正文中显要的注明作者和出处,并保证文章的完 ...
- SQL Server 2008 R2 性能计数器详细列表(五)
原文:SQL Server 2008 R2 性能计数器详细列表(五) SQL Server:SQL Statistics 对象: 监视编译和发送到 SQL Server 实例的请求类型 SQL Ser ...
- SQL Server 2008 R2 性能计数器详细列表(四)
原文:SQL Server 2008 R2 性能计数器详细列表(四) SQL Server Latches 对象: 监视称为闩锁的内部 SQL Server 资源锁.通过监视闩锁来确定用户活动和资源使 ...
- SQL Server 2000向SQL Server 2008 R2推送数据
[文章摘要]最近做的一个项目要获取存在于其他服务器的一些数据,为了安全起见,采用由其他“服务器”向我们服务器推送的方式实现.我们服务器使用的是SQL Server 2008 R2,其他“服务器”使用的 ...
随机推荐
- Angular系列------AngularJS快速开始(转载)
Hello World! 开始学习AngularJS的一个好方法是创建经典应用程序“Hello World!”: 使用您喜爱的文本编辑器,创建一个HTML文件,例如:helloworld.html. ...
- EF错误记录
纯属个人记录错误使用: 1.EntityType“area”未定义键.请为该 EntityType 定义键. 产生原因: 1.命名空间引用错误,可能命名重复导致引用错误 2.实体类无法识别主键或者未设 ...
- 专题——web.xml 中 url-pattern
一.映射什么? 一个请求发送到 servlet 容器,servlet 容器会将当前请求的 url 路径减去 协议.端口号.contextPath,剩下 servletPath 就是用来做 url-pa ...
- 移动端前端常见的触摸相关事件touch、tap、swipe等整理
前端的很多事件在PC端和浏览器端可公用,但有些事件却只在移动端产生,如触摸相关的事件 本文整理了移动端常见的一些事件,包括原生支持的click.touch.tap.swipe事件,也有定义型的gest ...
- ajax 跨域 headers JavaScript ajax 跨域请求 +设置headers 实践
解决跨域调用服务并设置headers 主要的解决方法需要通过服务器端设置响应头.正确响应options请求,正确设置 JavaScript端需要设置的headers信息 方能实现. 此处手札 供后人参 ...
- Winform开发的界面处理优化
在Winform开发中,客户体验是个很好的参考性指标,如果一个功能使用的时候感觉很流畅,说明我们的程序执行效率还不错,但是随着数据的真多,原先可能流程的地方可能会变得比较卡,这时候就需要追本索源,找到 ...
- 关于URL、Web的一些概念
关于URL ★ 书写路径时,网络文件用斜杠“/”划分不同层级,本地文件管理系统用反斜杠“\”,分隔不同层级: 如下图示 ★ 绝对/相对 ...
- eclipse中改变默认的workspace的方法及说明
eclipse中改变默然的workspace的方法可以有: 1.在创建project的时候,手动选择使用新的workspace,如创建一个web project,在向导中的Location选项,取消使 ...
- 解决打印机报错:操作无法完成(错误0x00000709)。
解决:操作无法完成(错误0x00000709).再次检查打印机名称,并确保打印机已连接到... 上午同时说,网络打印机打印不了,于是首先看一下打印服务器IP是不是给换了,结果没换. 接着尝试重新添加一 ...
- 用C#开发的双色球走势图(一)
首先声明,个人纯粹无聊之作,不作商业用途. 我相信每个人都拥有一个梦想那就是有朝一日能中500W,这个也一直是我的梦想,并默默每一期双色球或多或少要贡献自己一点点力量,本人并不属于那种铁杆的彩票迷,每 ...