SQL Server 2008 R2——VC++ ADO 操作 事务
==================================声明==================================
本文原创,转载在正文中显要的注明作者和出处,并保证文章的完整性。
未经作者同意请勿修改(包括本声明),保留法律追究的权利。
未经作者同意请勿用于出版、印刷或学术引用。
本文不定期修正完善,为保证内容正确,建议移步原文处阅读。
本文链接: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 操作 事务的更多相关文章
- SQL Server 2008 R2——VC++ ADO 操作 存储过程 向datetime类型参数传入空值
==================================声明================================== 本文原创,转载在正文中显要的注明作者和出处,并保证文章的完 ...
- SQL Server 2008 R2——VC++ ADO 操作 参数化查询
==================================声明================================== 本文原创,转载在正文中显要的注明作者和出处,并保证文章的完 ...
- 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 2000向SQL Server 2008 R2推送数据
[文章摘要]最近做的一个项目要获取存在于其他服务器的一些数据,为了安全起见,采用由其他“服务器”向我们服务器推送的方式实现.我们服务器使用的是SQL Server 2008 R2,其他“服务器”使用的 ...
- SQL Server 2008 R2数据库镜像部署
概述 “数据库镜像”是一种针对数据库高可用性的基于软件的解决方案.其维护着一个数据库的两个相同的副本,这两个副本分别放置在不同的SQL Server数据库实例中.建议使用不同位置的两台服务器来承载.在 ...
- SQL Server 2008 R2 性能计数器详细列表(五)
原文:SQL Server 2008 R2 性能计数器详细列表(五) SQL Server:SQL Statistics 对象: 监视编译和发送到 SQL Server 实例的请求类型 SQL Ser ...
随机推荐
- Qt之QAbstractItemView视图项拖拽(一)
一.需求说明 最近在搞视图项的拖拽,也上网查了一些资料,好多的文档都是一样的,只是被不通的网站所收录了(也有可能是被爬过去的,不明所以),不过也有一些文档写的不错,不过就是太简易,都是点睛之笔,总之功 ...
- scrum1.4---Sprint 计划
燃尽图
- 译:在ASP.NET MVC5中如何使用Apache log4net 类库来记录日志
译文出处:http://www.codeproject.com/Articles/823247/How-to-use-Apache-log-net-library-with-ASP-NET-MVC 在 ...
- 【C#】OOP之继承那点事
前言: 继承这点事,说多不多,说少不少,这里只描述了一些我认为的基础篇,望各位大神指教.本节参照了C#高级编程和Think in java对继承的描述,我个人认为OOP只是思想,故看明白一个就说通的, ...
- vs2012 编译运行报 项目程序包Dsp.Bds.dll还原失败,找不到版本xxxxxx的程序包问题的解决方法
原先vs2012程序运行项目是可以了,不会出现程序包Dsp.Bds.dll还原失败,找不到版本未2.0.1.0的程序包问题, 但是项目可以正常运行,每次调试看到下面一片红感觉不舒服 原因:可能当时我看 ...
- Python轻量Web框架Flask使用
http://blog.csdn.net/jacman/article/details/49098819 目录(?)[+] Flask安装 Python开发工具EclipsePyDev准备 Flask ...
- *nix下传统编程入门之GCC
准备工作 注意:本文可能会让你失望,如果你有下列疑问的话:为什么要在终端输命令啊? GCC 是什么东西,怎么在菜单中找不到? GCC 不能有像 VC 那样的窗口吗?…… 那么你真正想要了解的可能是 a ...
- PHP实现文字水印图片
php实现简单的文字水印图片,使用前需要开启php配置中的gd2功能 <?php/*打开图片*/ //1.配置图片路径 $src="image/55.jpg";//这个路径改 ...
- 使用PreparedStatement执行SQL语句时占位符(?)的用法
1.Student数据库表 ID name gender 2.Java代码 public static void main(String[] args) { int _id=1; Str ...
- EffectiveJava——类层次优于标签类
标签类: 有时候,可能会遇到带有两种甚至更多钟风格的类的实例的类,并包含表示实例风格的(tag)域.例如下面这个类,它能够表示圆形或者矩形: /** * 类层次优先与标签类 * @author wei ...