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

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

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

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

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

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

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

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

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

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

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

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

本例的目的/效果:以事务的方式从表testtable中删除并插入到testtable2中。

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

用于测试的数据库

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  testtable(
id int NULL,
val int NULL
) CREATE TABLE testtable2(
id int NULL,
val int NULL
)

表中初始数据

testtable中

10086,10010

testtable2中

用于测试的存储过程

(不要吐槽我为什么用存储过程了,我就是练一下,简单功能用普通的参数化语句就行了。)

(PS:据说数据库会编译存储过程,这样下次运行会更快。我不是专业数据库人员,详细的还是看手册吧。)

 CREATE PROC proc_DeleteSomething @id INT, @val INT
AS
BEGIN
DELETE FROM dbo.testtable
WHERE id = @id AND val=@val
END GO CREATE PROC proc_InsertSomething @id INT, @val INT
AS
BEGIN
INSERT INTO dbo.testtable2
( id, val )
VALUES ( @id, -- id - int
@val -- val - int
)
END GO

记得要给用户授予执行权限。

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

VC++测试代码

     if (FAILED(::CoInitialize(NULL)))
{
MessageBox(TEXT("初始化失败")); return;
} int nID=;
int nVal=; _ConnectionPtr pConn;
_CommandPtr pCmd;
_ParameterPtr pParam1;
_ParameterPtr pParam2; int nTransLevel=; HRESULT hr = S_OK; 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->CommandType=adCmdStoredProc; TESTHR(pParam1.CreateInstance(TEXT("ADODB.Parameter"))); pParam1=pCmd->CreateParameter(TEXT("id"),adInteger,adParamInput,sizeof(int));
pParam1->Value=_variant_t(nID);
pCmd->Parameters->Append(pParam1); TESTHR(pParam2.CreateInstance(TEXT("ADODB.Parameter"))); pParam2=pCmd->CreateParameter(TEXT("val"),adInteger,adParamInput,sizeof(int));
pParam2->Value=_variant_t(nVal);
pCmd->Parameters->Append(pParam2); nTransLevel=pConn->BeginTrans();
pCmd->CommandText=_bstr_t(TEXT("proc_DeleteSomething"));
pCmd->Execute(NULL,NULL,adCmdStoredProc); pCmd->CommandText=_bstr_t(TEXT("proc_InsertSomething"));
pCmd->Execute(NULL,NULL,adCmdStoredProc);
pConn->CommitTrans();
}
catch (_com_error &e)
{
if (nTransLevel==)
{
pConn->RollbackTrans();
}
}
catch (CException* e)
{
} CoUninitialize();

在代码中制造错误的时候,可以将第二个存储过程名写错。

=================================写给自己=================================

软件开发这种实践性很强的东西,不自己亲手实验,又怎能解除困惑?

最新文章

  1. CentOS 6.6编译安装Nginx1.6.2+MySQL5.6.21+PHP5.6.3
  2. sendto频率过快导致发送丢包
  3. js公有、私有、静态属性和方法的区别
  4. win7下配置apache和php
  5. Csharp 高级编程 C7.1.2
  6. Java学习笔记--JDBC数据库的使用
  7. Intellij Idea配置提高速度
  8. sql server 数据库创建链接服务器
  9. 小容量的byteBuffer 读取大文本
  10. C# 启动外部进程
  11. java枚举通俗实例解析
  12. 第27月第18天 epoll lt et
  13. Powershell script to install Windows Updates (msu) from folder
  14. 关于spring事务
  15. js数据结构之栈和队列的详细实现方法
  16. linux 用户配制文件 用户增加及删除 以及用户属于的更改
  17. C#简单操作MongoDB
  18. SQLServer 之 树查询
  19. CentOS下Redis安装与配置
  20. mongodb3集群搭建

热门文章

  1. sprint3与总结
  2. for循环的嵌套,for循环的穷举迭代
  3. jQuery数据类型总结
  4. 关于spring配置文件properties的问题
  5. [PE结构分析] 6.IMAGE_SECTION_HEADER
  6. floyd离散,最小环
  7. [moka同学笔记]yii2.0数据库操作以及分页
  8. CodeBlocks VS2015编译环境设置
  9. ahjesus用forever管理nodejs服务
  10. GetReadyForWin10Develop