用ADO连接SQL Server数据库

这篇文章不是介绍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 

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();
}
结果如下图:



你可能感兴趣的:(数据库)