方式一:(直接链接SQL server方式)
_bstr_t strConnect="Provider=SQLOLEDB;Data Source=LENOVO-PC\\SQLEXPRESS;Persist Security Info=True;User ID=Mysa;Pwd=malingyi123654;Initial Catalog=Emploees";
方式二:(通过ODBC的参数传递)--个人不是很熟悉这种,因此只对上面的方式举例说明,想要这种方式的可以求大神
m_pConnection->ConnectionString="DSN=RocketsPayers;DBQ=E:\\gucas\\vs2010projects\\Rockets\\RocketsPlayers.mdb;DriverId=25;FIL=MS Access;MaxBufferSize=2048;PageTimeout=5";
//众多属性之中大部分都可以在ConnectionString中声明,下面的例子就是如此。有一些不用声明,有缺省参数:State、CommandTimeout、DefaultDatabase等 等,链 接参数当中提供基本的数据信息就可以了。
CommandTimeout // 指示在种植尝试和产生错误之前执行命令期间需要等待的时间
ConnectionString // 该属性包含用来建立到数据源的链接信息,通过传递包含一系列由分隔的Argument=value语句的详细链接字符串可指定数据源
ConnectionTimeout // 指示在种植尝试和产生错误之前建立链接期间需要等待的时间
DefaultDatabase // 属性可设置或返回指定Connection对象上默认数据库的名称。指示Connectiong对象的默认数据库
Mode // 可设置或返回当前连接上提供者正在使用的访问权限。只能在关闭Connection对象时方可设置
Provider // 可设置或返回链接提供者的名称
State // 可以随时使用State属性确定hiding对象的当前状态。该属性为只读
Version // 表示ADO的版本号
//链接参数设置 m_pConnection->ConnectionTimeout=2;///设置超时时间为2秒 //连接SQL数据库 m_pConnection->Open("driver={SQL Server};Server=LENOVO-PC\\SQLEXPRESS;DATABASE=Emploees;UID=Mysa;PWD=malingyi123654","","",adModeUnknown); //Open里参数设置我说下: driver={SQL Server};//连接SQL Server 2000数据库 Server=LENOVO-PC\\SQLEXPRESS;//服务器名字,也就是本机上的,打开sql server服务管理器里服务器(v)的名字 DATABASE=Emploees;//SQL server服务器里一个自己的数据库的名字. UID=Mysa; //数据库用户名 PWD=malingyi123654; //用户名所对应的数据库密码 ConnectionTimeout=2; //此为服务器超时时间,Connection 对象的 ConnectionTimeout 属性, 默认值是15, //意思是当服务器链接超时后15秒显示错误提示、或者超时提示 adModeUnknown ;//此为链接模式,还有其它参数,需要具体了解的可以到其它博客或者书籍查询
open()函数是用来启动数据库链接的。它有多重重载方式。每种重载方式的参数大致相同,有些是解决当用户在链接参数里面输入的参数顺寻或者类型多样化的
问题。
// 函数原型如下: HRESULT Open(_bstr_t ConnectionString,_bstr_t UserID,_bstr_t Password,long Options); ConnectionString://表示链接参数,如果在Connection 实列中已经将其初始化了那么再Open()函数中就不用作为参数传递了,因为已经完成 //参数的传递了。 UserID ://表示数据库用户ID,如果在Connection的链接参数strConnect 中已经含有了,那么也不用传递了直接用 “” (空字串) //代替 Password : //表示数据库用户密码,同上,如果在链接参数中已经说明,那么也只用 "" (空字串)代替 Options : //说明打开数据库的方式,此参数为枚举型,决定Open()函数是同步执行还是异步执行
//其实 Open()函数只是一个接口而已,真正负责打开链接的是另外一个被保护的成员函数 :raw_Open()
virtual HRESULT __stdcall raw_Open ( /*[in]*/ BSTR ConnectionString, /*[in]*/ BSTR UserID, /*[in]*/ BSTR Password, /*[in]*/ long Options ) = 0;
Open()函数体中调用raw_Open()完成链接,因此从raw_Open()的参数列表中我们也可以看到,链接时不需要提供全部的Connection属性。:
inline HRESULT Connection15::Open ( _bstr_t ConnectionString, _bstr_t UserID, _bstr_t Password, long Options ) { HRESULT _hr = raw_Open(ConnectionString, UserID, Password, Options); if (FAILED(_hr)) _com_issue_errorex(_hr, this, __uuidof(this)); return _hr; }
它的参数跟Open的一样。
下面我就给大家放几段链接的代码上去,希望能够帮助大家。
步骤一:ADO对象的导入
在使用ADO技术的时候,需要导入一个ADO动态链接库 msado**.dll(不同操作系统不一样,我的操作系统是msado15.dll,后面就用它来讲解),该动态库位于系统盘下的“Program Files\Common Files\System\ado\msado15.dll”。例如,系统盘为C盘,则该文件位于"C:\Program Files\Common Files\System\ado\msado15.dll"。
//在VC++中,需要使用预处理命令#import 将动态链接库导入到到工程的 —"StdAdx.h" 头文件中,这样才能使用ADO链接对象,完成链接。 #import "C:\Program Files\Common Files\System\ado\msado15.dll" no_namespace rename("EOF","AdoEOF") rename("BOF","AdoBOF") //将上面这段代码插入到"StdAdx.h" 头文件中, 后面的no_namespace 是为了省去命名空间,rename 是为了避免与原有的EOF、BOF标志冲突,改成什么可以自 //定。
步骤二:初始化COM环境
由于ADO库是一个COM动态库,所以在应用程序调用ADO之前,必须初始化COM环境。通常在MFC里面用CoInitialize函数初始化。
<pre class="cpp" name="code"> //注意,一定要在你链接数据库之前初始化,不然会链接失败。 //一般在程序类的InitInstance函数中初始化COM环境 ::CoInitialize(NULL); //初始化COM环境 //程序最后还要释放COM环境,具体的地方不定,但是至少在你已经不会用到数据库的地方 //一般在程序的ExitInstance()中 ::CoUninitialize(); //释放COM环境
步骤三:ADO只能指针的创建---为了方便创建和删除ADO对象,也可以不用,直接实列话一个对象
//首先在你第一次使用数据库链接的类的头文件中声明指针,并在构造函数当中初始化为null _ConnectionPtr m_pConnection;
</pre><pre class="cpp" name="code"> //然后,在Oninitial***()(某个窗体,或者是直接定义的一个ADO类最好)中创建对象实例
m_pConnection.CreareInstance("ADODB.Connection"); //第一种方法
m_pConnection.CreateInstance(__uuidof(Connection)); //第二种方法
步骤四:链接数据库
使用ADO链接数据库是通过COnnection对象的Open方法实现的。
m_pConnection.Open(_bstr_t ConnectionString,_bstr_t UserID,_bstr_t Password,long options); //链接参数的设置上面已经讲到,此处不再说明 //函数原型如下: HRESULT Open(_bstr_t ConnectionString,_bstr_t UserID,_bstr_t Password,long Options); ConnectionString://表示链接参数,如果在Connection 实列中已经将其初始化了那么再Open()函数中就不用作为参数传递了,因为已经完成 //参数的传递了。 UserID ://表示数据库用户ID,如果在Connection的链接参数strConnect 中已经含有了,那么也不用传递了直接用 “” (空字) //代替 Password ://表示数据库用户密码,同上,如果在链接参数中已经说明,那么也只用 "" (空字串)代替 Options ://说明打开数据库的方式
void C数据库试炼Dlg::OnInitADOConn(void) {
HRESULT hr = NULL; try { hr = m_pConnection.CreateInstance("ADODB.Connection");///创建 Connection 对象 if(SUCCEEDED(hr)){ //登录数据库并连接数据库DBCourse //这里的server不能写成127.0.0.1否则会出现未指定的错误,应该写成Sql server登录界面的服务器名称,而且要有两个反斜杠 \\
m_pConnection->ConnectionString = "driver={SQL Server};server=LENOVO-PC\\SQLEXPRESS;uid=Mysa;pwd=malingyi123654;";
m_pConnection->Open("","","",adConnectUnspecified);//已经对ConnectionString复制了,因此Open函数就不需要传递链接参数了
//上面的strConnect中有了User ID,那么这里就要缺省,不然就会 //报错;同理,可以在上面也把密码写了,下面就不要写密码了
m_pConnection->DefaultDatabase = (_bstr_t)_T("Emploees"); //这段代码可以直接在ConnectionString中添加(Initial Catalog= //Emploees) Initial Catalog是说数据库的名称
// _bstr_t strConnect="Provider=SQLOLEDB;Data Source=LENOVO-PC\\SQLEXPRESS;Persist Security Info=True;User ID=Mysa //;Pwd=malingyi123654;Initial Catalog=Emploees"; } else{ AfxMessageBox(TEXT("创建 Connection 对象失败"));///显示错误信息 return ; } } catch(_com_error e){///捕捉异常 CString errormessage; errormessage.Format( TEXT("连接数据库失败 !\r\n 错误信息 :%s(%ld)"),e.ErrorMessage(),e.Error() ); AfxMessageBox(errormessage);///显示错误信息 return ; } return ; }
大家要善于利用异常捕获机制,因为链接的时候很容易出现位置错误,所以要将链接的地方Try起来,这样才能帮助你更快的发现错误。
上面就是我自己的一些体会,这个东西折磨我太久了,不像Java的JDBC很容易就搞定了。能力有限,心有余而力不足,思路可能有点乱,不过还是希望能够帮助到大家,同时更希望大神来指点!