C++ 数据库连接代码示例

最近在搞c++操作数据库,之前转过一篇很好的文章,现在又看到一篇总结的也不错,特此转过来,希望对和我一样的需要的朋友有个帮助。

本文转自:http://hi.baidu.com/lvguohao/blog/item/4990d2513872342c42a75b86.html/cmtid/78f46273571072108701b08f

 

一、引入ADO库文件

使用ADO前需要在工程的stdafx.h文件或写ADO代码的类的头文件中用#import引入ADO库文件。例如,建一个对话框工程,取名Lx4,在CLx4Dlg.h文件里引入ADO库文件,也就是加上下面两句。

#import "c:/program files/common files/system/ado/msado15.dll" no_namespace rename ("EOF", "adoEOF")

#pragma warning(disable: 4786)

二、初始化OLE/COM库环境

可以在InitInstance ()或OnInitDialog()函数里,添加如下代码

::CoInitialize(NULL);

三、操作数据库

1、接口介绍

在对数据库操作之前,先来认识一下ADO库的三个接口。ADO库包含三个基本接口:_ConnectionPtr接口、_CommandPtr接口和_RecordsetPtr接口。_ConnectionPtr接口用来连接数据库,_RecordsetPtr接口用来获得记录集,、_CommandPtr接口暂不讨论,因为我的程序中没用到那个接口(嘿嘿,这个理由充分吗)。

声明两个变量,可以声明为类的成员变量或函数的局部变量,我是声明为成员函数的:

_ConnectionPtr m_pConnection;

_RecordsetPtr m_pRecordset;

2、连接数据库

注意_ConnectionPtr 和_RecordsetPtr 接口在用之前必须初始化一下,很简单的,初始化可以放在构造函数里,下面来看初始化_ConnectionPtr 接口:

m_pConnection.CreateInstance("ADODB.Connection");

也可以用

m_pConnection.CreateInstance(__uuidof(Connection));

二者选一。

下面列出了连接三种数据库的语句

CString strConn;

连接SQL SERVER

strConn.Format("driver={SQL Server}; Server=%s; DATABASE=%s; UID=%s; PWD=%s", strServer, dbName, user, psw);

strServer是服务器名,如果访问本地数据库,可是设strServer = “172.0.0.1”或”.”;这是我试过的,都可以。

dbName是数据库名称,user, psw是用户名和密码。

连接ORACLE

strConn.Format("Provider=MSDAORA.1;Data Source=%s;", "%s", "%s", adModeUnknown, dbName, user, psw);

dbName, user, psw分别是数据库名,用户名,密码。

连接ACCESS(这里连接的是ACCESS2000及以上版本,此语句连接ACCESS97是不行的)

strConn.Format("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=%s;Persist Security Info=False;Jet OLEDB:Database Password=%s", dbName, psw);

dbName是数据库路径名,如“F: //DB//hermes.mdb”,psw是密码。

 

设置了连接语句,下面要和数据库进行连接了,对于上面三种数据库都是要执行下面这个连接的,下面语句是打一开连接的语句。

connPtr->Open((_bstr_t)strConn, "", "", adModeUnknown);

adModeUnknown:缺省。当前的许可权未设置
adModeRead:只读
adModeWrite:只写
adModeReadWrite:可以读写
adModeShareDenyRead:阻止其它Connection对象以读权限打开连接
adModeShareDenyWrite:阻止其它Connection对象以写权限打开连接
adModeShareExclusive:阻止其它Connection对象以读写权限打开连接
adModeShareDenyNone:阻止其它Connection对象以任何权限打开连接

连接UDL

CString strConnect = "File Name=" + udlDir; // 注意:Name="等号两边不能有空格

connPtr->Open((_bstr_t)strConnect, (_bstr_t)user, (_bstr_t)psw, adModeUnknown);

字符串udlDir是udl文件路径,user和pssw是udl连接数据库的用户名和密码。

3、操作结果集

得到记录集:

m_pRecordset.CreateInstance("ADODB.Recordset");

m_pRecordset->Open(_bstr_t(l_strSQLConn),

 _variant_t((IDispatch*)m_pConnection, true),

 adOpenStatic, adLockOptimistic, adCmdText);

l_strSQLConn是select语句

遍历结果集:

while( !m_pRecordset->adoEOF)

{

 ……// 在这里添加操作结果集的代码如:

 strTemp = (LPCSTR)(_bstr_t)m_pRecordsetTable->GetCollect(_variant_t((long)i));// 得到某个字段的记录。

 m_pRecordset->MoveNext();

}

对数据库的操作一般使用异常机制。也就是try{…}catch(){..}

注意打开两个数据表时的问题:

一个_RecordsetPtr的对象用完后如果忘记关闭,再打开另一个表时就会出错。所以如果要打开两个表的话,先打开一个表,用完后关闭记录集,并置NULL,再m_pRecordset.CreateInstance("ADODB.Recordset");这样就可以打开另一个表了。

四、关闭记录集和连接

关闭记录集:

m_pRecordsetTable->Close();

m_pRecordsetTable = NULL;

关闭连接:

m_pConnection->Close();

m_pConnection = NULL;

释放环境

::CoUninitialize();

 

附加:

我写了三个函数,分别得到指定表的字段数,指定字段的字段名及字段大小

// 得到字段数

int CLx4Dlg::GetFieldsCount(_RecordsetPtr RcdPtr)

{

 int nCount=0;

 if(NULL != RcdPtr)

 {

 nCount = RcdPtr->GetFields()->Count;

 }

 return nCount;

}

// 得到字段名

BOOL CLx4Dlg::GetFieldsName(_RecordsetPtr RcdPtr, int nField, CString & strFieldName)

{

 if(NULL == RcdPtr || nField >= RcdPtr->GetFields()->Count)return FALSE;

 _variant_t vt((long)nField);

 strFieldName.Format(_T("%s"), (char*)(RcdPtr->GetFields()->Item[vt]->Name));

 return true;

}

 

// 得到字段大小

int CLx4Dlg::GetFieldsSize(_RecordsetPtr RcdPtr, int nField)

{

 if(NULL == RcdPtr || nField >= RcdPtr->GetFields()->Count)return FALSE;

 _variant_t vt((long)nField);

 int nSize = RcdPtr->GetFields()->Item[vt]->DefinedSize; // 返回已声明的字段大小

 //int nSize = RcdPtr->GetFields()->Item[vt]->ActualSize; // 返回给定字段中数据的实际大小

 return nSize;

}

 

SQL 语句:

得到SQL SERVER的所有用户类型的表

select name from sysobjects where xtype='U'

得到ORACLE的所有用户表

select tname from tab where tabtype='TABLE'

得到ACCESS的所有用户建的表

SELECT Name FROM MSysObjects WHERE Flags=0 AND Type=1

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值