这篇文章不是介绍ADO连接数据库的原理的,而是写一下连接的步骤和简便方法。
一、获取连接字符串。
连接数据库时需要用到 _ConnectionPtr 对象的open方法,参数如下:
HRESULT Connection15::Open(_bstr_t ConnectionString, _bstr_t UserID, _bstr_t Password, _bstr_t Options)
在写这个ConnectionString连接字符串时,有的人感觉很困难,下面是一种简单的方法来获得这个连接字符串。
1.1 新建一个.udl的文件,打开,在提供的程序选项中选择Microsoft OLE DB Provider for SQL Server 然后下一步。如下图:
1.2 在连接中填写必要的信息后,点击测试连接,如果成功会出现如下图所示的提示框。
其中的服务器名称就是你SQL Server服务器的名称,如果不知道,可以在SQL Server中的服务器属性中看到,如下图:
二、下面贴出控制台程序,说明连接过程。
编译环境:Visual Studio 2010 旗舰版
注意点:
1、如果发现执行后结果中有显示乱码现象,请将工程属性中的字符集项设置为:使用多字节字符集或未设置。
2、注意程序中的连接字符串是适合我电脑数据库的,你要是测试的需修改为你自己(可以按照上面的方法来获得连接字符串)
//导入一个ADO动态链接库msado15.dll
#import "C:\Program Files\Common Files\System\ADO\\msado15.dll"
#include <stdio.h>
inline void TESTHR(HRESULT x) {if FAILED(x) _com_issue_error(x);};
void ConnectionStringX(_ConnectionPtr pConnection); //连接数据库
_bstr_t GetState(int intState); //得到连接状态
void PrintProviderError(_ConnectionPtr pConnection); //输出错误
void PrintComError(_com_error &e); //输出错误
void ExitConnect(_ConnectionPtr pConnection); //关闭连接
void main()
{
// 初始化OLE/COM库环境
if(FAILED(::CoInitialize(NULL)))
{
return;
}
//创建连接对象
_ConnectionPtr pConnection = NULL;
ConnectionStringX(pConnection);
ExitConnect(pConnection);
// 释放环境
::CoUninitialize();
}
void ConnectionStringX(_ConnectionPtr pConnection)
{
HRESULT hr = S_OK;
try
{
//ADO方式连接数据库
TESTHR(pConnection.CreateInstance( __uuidof(Connection)));
pConnection->ConnectionString = "Provider='SQLOLEDB';Data Source='SD-20120421UVIT\\SQLEXPRESS';"
"Initial Catalog='master';Integrated Security='SSPI';";
pConnection->ConnectionTimeout = 10;
pConnection->Open("","","",adConnectUnspecified);
printf("Connection1 state: %s\n",(LPCSTR)GetState(pConnection->State));
}
catch(_com_error &e)
{
//打印错误
PrintProviderError(pConnection);
PrintComError(e);
}
}
//得到连接状态
_bstr_t GetState(int intState)
{
_bstr_t strState;
switch(intState)
{
case adStateClosed:
strState = "adStateClosed";
break;
case adStateOpen:
strState = "adStateOpen";
break;
default:
;
}
return strState;
}
//打印连接过程中的错误消息
void PrintProviderError(_ConnectionPtr pConnection)
{
// 打印连接对象的发生的错误
ErrorPtr pErr = NULL;
if( (pConnection->Errors->Count) > 0)
{
long nCount = pConnection->Errors->Count;
for(long i = 0; i < nCount; i++)
{
pErr = pConnection->Errors->GetItem(i);
printf("Error number: %x\t%s\n", pErr->Number,(LPCSTR)pErr->Description);
}
}
}
//打印COM错误
void PrintComError(_com_error &e)
{
_bstr_t bstrSource(e.Source());
_bstr_t bstrDescription(e.Description());
printf("Error\n");
printf("\tCode = %08lx\n", e.Error());
printf("\tCode meaning = %s\n", e.ErrorMessage());
printf("\tSource = %s\n", (LPCSTR) bstrSource);
printf("\tDescription = %s\n", (LPCSTR)bstrDescription);
}
//关闭连接
void ExitConnect(_ConnectionPtr pConnection)
{
if (pConnection)
if (pConnection->State == adStateOpen)
pConnection->Close();
}
结果如下图: