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 存储过程名。
 

你可能感兴趣的:(数据库,存储,PostgreSQL,VBScript,sqlserver,Delphi)