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

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

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

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

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

本文链接: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();

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

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

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

SQL Server 2008 R2——VC++ ADO 操作 事务的更多相关文章

  1. SQL Server 2008 R2——VC++ ADO 操作 存储过程 向datetime类型参数传入空值

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

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

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

  3. SQL Server 2008 R2——VC++ ADO 操作 重复利用_CommandPtr

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

  4. SQL Server 2008 R2——VC++ ADO 操作 存储过程

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

  5. SQL Server 2008 R2——VC++ ADO 操作 重复利用_ParameterPtr

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

  6. SQL Server 2008 R2——VC++ ADO 操作 多线程操作 代码结构

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

  7. SQL Server 2000向SQL Server 2008 R2推送数据

    [文章摘要]最近做的一个项目要获取存在于其他服务器的一些数据,为了安全起见,采用由其他“服务器”向我们服务器推送的方式实现.我们服务器使用的是SQL Server 2008 R2,其他“服务器”使用的 ...

  8. SQL Server 2008 R2数据库镜像部署

    概述 “数据库镜像”是一种针对数据库高可用性的基于软件的解决方案.其维护着一个数据库的两个相同的副本,这两个副本分别放置在不同的SQL Server数据库实例中.建议使用不同位置的两台服务器来承载.在 ...

  9. SQL Server 2008 R2 性能计数器详细列表(五)

    原文:SQL Server 2008 R2 性能计数器详细列表(五) SQL Server:SQL Statistics 对象: 监视编译和发送到 SQL Server 实例的请求类型 SQL Ser ...

随机推荐

  1. .Net魔法堂:log4net详解

    一.作用 提供一个记录日志的框架,可以将日志信息记录到文件.控制台.Windows事件日志和数据库(MSSQL.Acess.Oracle.DB2和SQLite等). 二.先看看示例,感受一下吧   c ...

  2. TinyFox在VS2015上的调试器

    这个一个TinyFox在VS2015上的调试工具 : 开源了 https://github.com/maxzhang1985/TinyFoxDEBUG 开发这个工具的初衷,是想更便捷的调试Nancy ...

  3. mysql根据身份证信息来获取用户属性信息

    需要:根据身份证信息来获取用户属性 方法:可以使用如下sql语句: ) ' then '北京市' ' then '天津市' ' then '河北省' ' then '山西省' ' then '内蒙古自 ...

  4. HDFS-RAID原理和实现

    HDFS-RAID 是Facebook基于hadoop-20-append分支(第一代Hadoop)开发的raid方案,对HDFS的修改极少,主要包括为NameNode增加了根据block信息找到bl ...

  5. HTML5定稿一周年,你必须要重新认识HTML5了

    原文网址链接:http://www.csdn.net/article/2015-11-24/2826317 去年此时,W3C定稿了HTML5.我曾发表一篇文章<HTML 5终于定稿,为什么原生A ...

  6. myeclipse的实用快捷键

    (1)Ctrl+M切换窗口的大小(2)Ctrl+Q跳到最后一次的编辑处(3)F2当鼠标放在一个标记处出现Tooltip时候按F2则把鼠标移开时Tooltip还会显示即Show Tooltip Desc ...

  7. VS "15" 预览 5 中 VB 15 新增的功能

    VS "15" 预览 5 给 VB 带来了更新.这次的更新内容有3个: * 值元组 ValueTuple这个功能能把一组计算结果成组返回.为了使用这个功能,我们要安装 System ...

  8. 重新想象 Windows 8 Store Apps (38) - 契约: Search Contract

    [源码下载] 重新想象 Windows 8 Store Apps (38) - 契约: Search Contract 作者:webabcd 介绍重新想象 Windows 8 Store Apps 之 ...

  9. ArrayList实现源码分析

    本文将以以下几个问题来探讨ArrayList的源码实现 1.ArrayList的大小是如何自动增加的 2.什么情况下你会使用ArrayList?什么时候你会选择LinkedList? 3.如何复制某个 ...

  10. 调用另一个Activity

    <转>调用另一个Activity Intent对象的使用 范例说明 前一个范例介绍了如何运用切换Layout的方式,进行手机页面间的转换.如果要转换的页面并不单只是背景.颜色或文字内容的不 ...