由于项目需要,需要在windows平台上连接sql server,于是就学了一下,在其中遇到了一些问题,现在自己总结一下.
总结如下:
首先,我们需要连接数据库:
#include "stdafx.h"
#include <windows.h>
#include <sqltypes.h>
#include <sql.h>
#include <sqlext.h>
#import "c:\program files\common files\system\ado\msado15.dll" no_namespace rename("EOF", "adoEOF")(这个必须导入)
以上是包含windows的头文件,并且引入ado所需的dll文件,后面是不引用命 名空间,并且改变EOF和BOF的声明,防止冲突。
_ConnectionPtr pConnection;//连接指针
_CommandPtr pCmd;//命令指针
_RecordsetPtr pRecord;//结果集指针
long m_row_count=0;
long m_col_count=0;
1.bool connect()
{
HRESULT Hr = ::CoInitialize(NULL); //这句话必须添加,否则创建实例会失败(要成功使用ADO,需要先初始化COM)
HRESULT hr;
hr = m_pConnection.CreateInstance(_uuidof(Connection));
_bstr_t strConnect = "Driver={sql server};server;uid;pwd;database;";
if(SUCCEEDED(hr))
{
m_pConnection->ConnectionTimeout = 0;
hr = m_pConnection->Open(strConnect,"","",adModeUnknown);
if(SUCCEEDED(hr))
{
m_pCommand.CreateInstance(__uuidof(Command));
m_pCommand->CommandTimeout = 5;
m_pCommand->ActiveConnection = m_pConnection;
return TRUE;
}
else
{
return FALSE;
}
}
OutputDebugString("创建实例失败");
return FALSE;
}
server uid;pwd;database:这四个是我们要填的四个参数,即是ip地址,用户名,密码,数据库名字。
2.查找表:
HRESULT hr = m_pRecord.CreateInstance(__uuidof(Recordset));
hr = m_pRecord->Open(esqlexitdata.c_str(),
m_pConnection.GetInterfacePtr(),
adOpenStatic,
adLockOptimistic,
adCmdText);
m_row_count = m_pRecord->GetRecordCount(); //记录即行数(如果参数是adOpenDynamic,得到记录会是-1)
m_col_count = m_pRecord->GetFields()->Count; //列数
3.关闭数据库和结果集
这个pRecord->Close()是用来关闭结果集的,但是如果没有结果集,那么关闭会报错。
pConnection->Close()是关闭数据库连接的;如果没有连接数据库就关闭会报错
m_pRecord->GetRecordCount()这个函数得到的函数有可能不准,可以用下面这个方法:
while(!m_pRecord->adoEOF) //这个就是前面#import导入语句的作用
{
m_row_count++;
m_pRecord->MoveNext();
}
4.在这个期间,遇到的一个奇怪问题,在自己的电脑上,写了一个exe应用程序,运行代码,没有什么问题,把编译出来的dll程序拷贝到另一个电脑进行测试,其它的一个exe应用程序调用这个总是dump,具体现象就是会报告:故障模块名称:MSVRC100.dll,一开始以为是这个dll问题,于是把本地电脑上的MSVRC100.dll拷贝过去,现象是一样的,试了很多方法,都不行,但是在本地电脑上是好的(现在知道是因为本地连接数据库网络信号相对计较好,不容易出现),感觉很懵逼,最后不知道怎么突然想到是不是数据库的问题,为了验证这个问题,做了好多次尝试,总结出是网络信号不好,导致数据库刚开始连接成功后,在后面操作数据表时,像这种m_pRecord->MoveNext();语句,m_pRecord有可能会变为NULL空指针。知道原因之后,操作时,先判断数据库连接是否成功,不成功,重新建立连接,现在这个现象没有再复现,在整个过程中,遇到很多其它小问题,下次再把细节总结一下。由于本人以前没有搞过数据库,从这里学到了很多,在这里也感谢我的导师提供的帮助。