C++操作SQL Server数据库

前期准备

  1. 导入库
1
2
#import "c:\Program Files\Common Files\System\ADO\msado15.dll" \
no_namespace rename("EOF", "EndOfFile")
  1. COM初始化(进程级使用只需初始化一次,如果在线程中使用,则在线程函数中每次执行初始化)

    ::CoInitialize(NULL);

  2. 关键变量

    _ConnectionPtr m_pConnection;

简单实例

m_pConnection.CreateInstance("ADODB.Connection");
m_pConnection->Open(connStr,"","",adModeUnknown);
char query_cmd[500] = {0};

...

m_pConnection->Execute(query_cmd,NULL,1); //用Execute执行sql语句来执行写入
m_pConnection->Close();

常见错误_com_error的处理

使用try catch语句捕获异常信息,确定错误原因:

1
2
3
4
5
6
7
8
9
try
{
	m_pConnection->Execute(query_cmd,NULL,1);
}
catch(_com_error& e)
{
	MessageBox(NULL, e.Description(), e.ErrorMessage(), MB_ICONERROR);
	return;
}

一个恶心的Bug,更新于[2013,6,3]

最近同事使用上述代码操作数据,在Win7和Windows Server 2008R2上运行OK,当拿到XP或者Windows 2003上去跑,遇到如下错误:

1
This application has requested the Runtime to terminate it in an unusual way. Please contact the application's support team for more information.

我们各种排查,最后找出原因为:

WIN7的ado15.dll与其他系统不兼容!!!拷贝个XP的ado15.dll到WIN7下在编译,或者直接把工程移到XP下重新编译一次;

这个问题,好像从vista开始就对msado15.dll进行了扩展,悲催的是前后不兼容。

最终我们没动一行代码,在Win2003上重新编译,就可以在xp上跑了。此时,解决这个问题我们已经花费了3个多小时,对于这个错误原因,我表示真的很蛋疼!!!!

做个文明人,这里就不骂微软了。