常用数据库连接方式 ODBC,ADO 等 | from web

 

常用的数据库连接方式:

目前比较流行的是ODBC方式和ADO方式;

ODBC方式应用的比较早,但是用它的话是要设置数据源的,而且它没有通用的数据驱动;

ADO方式是才发展起来的,它是基于OLEDB层来访问数据库的,访问的时候无需建立数据源,而且通用;

 

VC访问数据库技术的方法实例

 

1.     ODBC——开放数据库互联

ODBC为使用不同的关系数据库提供了一个统一的程序设计接口。在安装不同的数据库后,需要创建ODBC数据源,

2.     DAO——数据访问对象

3.     RDO——远程数据对象

4.     OLE DB——对象连接与嵌入数据库

5.     ADO——ActiveX数据对象

 

这里我说明我使用的两种方法:ODBC和ADO。

 

1.       ODBC

在安装数据库首先要创建ODBC数据源,使用CDatabase和CRecordset两个MFC的类与数据库建立连接,访问数据库。

1.1              条件

包含头文件:#include <afxdb.h>

声明成员变量:CDatabase m_dbPostGre;

1.2              连接数据库

       int nRetVal;

       nRetVal = m_dbPostGre.OpenEx( _T( "DSN=PostgreSQL30W;UID=PostGre;PWD=PostGre" ),

                                                         CDatabase::openReadOnly | CDatabase::noOdbcDialog );

       if ( nRetVal )

       {

              AfxMessageBox( _T( "连接数据库成功!" ) );

       }

1.3              访问数据

       CRecordset recordset( &m_dbPostGre );

       CString strSQL = _T( "select * from product" );

       recordset.Open( CRecordset::forwardOnly, strSQL, CRecordset::readOnly );

 

       CDBVariant var;

 

       while ( !recordset.IsEOF() )

       {

              TAG_PRODUCTINFO tagProductInfo;

              // ID

              recordset.GetFieldValue( _T( "ID" ), var );

              tagProductInfo.nProductID = var.m_iVal;

              // Name

              recordset.GetFieldValue( _T( "Name" ), tagProductInfo.strProductName );

 

              m_vecProductInfo.push_back( tagProductInfo );

             

              recordset.MoveNext();

       }

 

       recordset.Close();

 

2.      ADO技术

ActiveX Data Object, ActiveX数据对象。

ADO建立在OLE DB之上,采用ADO技术访问数据库的话,实际的调用过程是:ADO客户程序通过ADO再访问OLE DB提供的程序,这样访问速度就要慢一些。

如果某个关系型数据库没有OLE DB的提供程序,那么可以利用ODBC的OLE DB提供程序去访问ODBC,然后利用ODBC再去访问支持ODBC的数据库。

2.1              条件

l         头文件和动态库的加载

#include <comdef.h>

#include <atlbase.h>

#pragma   warning(disable:4146) 

#import   "C:\Program Files\Common Files\System\ado\msado15.dll"   named_guids   rename("EOF","adoEOF"),   rename("BOF","adoBOF") 

#pragma   warning(default:4146) 

using   namespace   ADODB;

l         COM组件的加载

       if ( CoInitialize( NULL ) != 0 )

       {

              AfxMessageBox( _T( "初始化Com库失败!" ) );

              return FALSE;

       }

l         变量的声明

       _ConnectionPtr m_pConnection;

2.2              连接数据库

       m_pConnection.CreateInstance( __uuidof(Connection) );

       m_pConnection->ConnectionString = _T( "DSN=PostgreSQL30W;UID=PostGre;PWD=PostGre" );

       HRESULT hr = m_pConnection->Open( _T(""), _T(""), _T(""), adConnectUnspecified );

       if ( SUCCEEDED( hr ) )

       {

              AfxMessageBox( _T( "连接数据库成功!" ) );

       }

2.3              访问数据库

       _CommandPtr pCommand(__uuidof(Command));

       _RecordsetPtr pRecordset( __uuidof(Recordset) );

       CString strSQL = _T( "select * from \"pg_getProductInfo\"()" );

 

       try

       {

              pCommand->ActiveConnection=m_pConnection;

              pCommand->CommandText=_bstr_t(strSQL);

              pRecordset=pCommand->Execute(NULL,NULL,adCmdText);

       }

       catch (_com_error & e)

       {

              AfxMessageBox(e.Description());

              return ;

       }

 

       _variant_t var;

       int nRecordNum = pRecordset->GetRecordCount();

       while( !pRecordset->GetadoEOF() )

       {

              TAG_PRODUCTINFO tagProductInfo;

             

              // ID

              var = pRecordset->GetCollect( _T( "ID" ) );

              tagProductInfo.nProductID= var.intVal;

              // Name

              var = pRecordset->GetCollect( _T( "Name" ) );

              tagProductInfo.strProductName = (char*)_bstr_t(var);

 

              m_vecProductInfo.push_back( tagProductInfo );

 

              pRecordset->MoveNext();

       }

 

       pRecordset->Close();

       pRecordset.Release();

 

总结:

       现在DAO和RDO这两种技术已经很少使用了,OLE DB和ADO这两种是比较新的技术,OLE DB的功能非常强大,但是他对自动化的支持不是很好。为了更好地支持自动化,微软在OLE DB的基础上开发了ADO,便于像VBScript这样的脚本语言,以及VB,Delphi这样的语言都可以很方便的使用ADO去访问数据库。

 

       上面两种技术对于不同的关系数据库,使用方法都是一样的,不同的就是数据源,名称,密码以及SQL语句的调用方式。

举个例子:以调用存储过程为例

SQLServer2000的调用方法是”{CALL sp_addMember( '%s', '%s', %d )}”,如果不带参数,则没有小括号,如果带参数,字符串的参数需要加单引号。

PostGre的调用方法是” _T( "select \"pg_modifyOneProduct\"( %d, '%s' )"”,“\“是转义字符,因为在PostGre定义存储过程时,如果存储过程名称加上了双引号,那么在调用的时候,就一定要加上双引号,SQL中应该就是这么规定的。还有一个存储过程如果是想返回表中所有记录,那么在调用存储过程的时候就要使用Selece * from 存储过程名。

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值