ADO访问数据库

ADO(ActiveX Data Object的简称)是Microsoft为最新和最强大的数据访问范例OLE DB而设计的,是一个便于使用的应用程序层接口。ADO通过OLE DB提供访问和操作数据库服务器中的数据。ADO不仅可以访问关系型数据库,还可以访问非关系型数据库。同时由于OLE DB是基于COM接口的技术,使用这种技术可以直接对数据库的驱动程序进行访问,从而大大提供了访问速度。与众多的数据库编程接口比较,ADO具有易于使用、速度快、内存支出少和磁盘遗迹小等优点。

但由于Microsoft并没有提供有关ADO的类,更不幸的是微软所提供的ADO文档几乎没有关于Visual C++的内容,这使得Visual C++程序开发人员要想利用ADO访问数据库相对比较麻烦。然而这又是每个Visual C++程序员不可回避的问题。解决这个问题的比较可行的办法就是自己编写这个类。本文将介绍如何具体编写自己的ADO类。

(1) 在使用ADO前必须使用#import引入ADO库文件,其中ADO库文件的路径视实际情况而定,同时为了避免常数冲突,通常将常数EOF改名为adoEOF。

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

(2) 在使用ADO之前还必须初始化OLE库。Visual C++ .net已经在CWinApp::InitInstance()中对OLE库进行了初始化。但是如果使用的Visual C++ 6.0,则必须初始化OLE库。

if (!AfxOleInit())
{
    AfxMessageBox(“初始化OLE库失败”);
}

(3) ADO库包含三个智能指针:_ConnectionPtr、_CommandPtr和_RecordsetPtr。_ConnectionPtr通常被用来创建一个数据连接或执行一条不返回任何结果的SQL语句。_CommandPtr返回一个记录集,它提供了一种简单的方法来执行返回记录集的存储过程和SQL语句。_RecordsetPtr是一个记录集对象,它对记录集提供了更多的控制功能,如记录锁定,游标控制等。创建Connection对象和Recordset对象方法如下:

_ConnectionPtr m_pConnection; // 连接接口
_RecordsetPtr m_pRecordset;   // 记录集指针
HRESULT hr;
hr = m_pConnection.CreateInstance("ADODB.Connection");
if (!SUCCEEDED(hr))
{
    AfxMessageBox("创建Connection对象失败");
}
hr = m_pRecordset.CreateInstance("ADODB.Recordset");
if (!SUCCEEDED(hr))
{
    AfxMessageBox("创建Recordset对象失败");
}

(4) 连接不同数据库。参数sConnection为连接属性设置标准。它随数据源类型的不同而变化。以下是其常见值:

1. 访问ODBC数据:

"Provider=MSDASQL;DSN=dsnName;UID=userName;PWD=userPassword;"

2. 访问ACCESS 97数据库:

"Provider=Microsoft.Jet.OLEDB.3.51;Data Source=databaseName;User ID=userName;Password=userPassword;"

3. 访问ACCESS 2000数据库:

"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=databaseName;User ID=userName;Password=userPassword;"

4. 访问MS SQL数据库:

"Provider=SQLOLEDB;Data Source=serverName;Initial Catalog=databaseName;User ID=userName;Password=userPassword;"

5. 访问ORACLE数据库:

"Provider=MSDAORA.1;Data Source=serverName;User ID=userName;Password=userPassword;"

inline BOOL ConnectDB(CString sConnection)
{
    try
    {
        m_pConnection->Open(_bstr_t(sConnection), "", "", adModeUnknown);
    }
    catch (_com_error e)
    {
        AfxMessageBox("连接数据库失败,错误信息:%s", e.ErrorMessage());
        return FALSE;
    }
    return TRUE;
}

(5) 查询:

BOOL Query(CString SqlCommand)
{
    try
    {
        m_pRecordset->Open((_bstr_t) SqlCommand, m_pConnection.GetInterfacePtr(), adOpenDynamic, adLockOptimistic, adCmdText);
    }
    catch (_com_error* e)
    {
        AfxMessageBox(e->ErrorMessage());
        return FALSE;
    }
    return TRUE;
}

(6) 修改记录:

_variant_t vNULL;
CString SqlCommand = "UPDATE TableName SET …[ WHERE…]";
m_pConnection->Execute((_bstr_t) SqlCommand, &vNULL, adCmdText);

(7) 添加记录:

_variant_t vNULL;
CString SqlCommand = "INSERT INTO TableName (…) VALUES (…)[ WHERE…]";
m_pConnection->Execute((_bstr_t) SqlCommand, &vNULL, adCmdText);

(8) 删除记录:

_variant_t vNULL;
CString SqlCommand = "DELETE FROM TableName WHERE …";
m_pConnection->Execute((_bstr_t) SqlCommand, &vNULL, adCmdText);

(9) 统计。参数SqlCommand的形式如下:

1. 统计纪录数:SELECT COUNT(*) FROM TableName[ WHERE…]

2. 统计字段总和:SELECT SUM FieldName FROM TableName[ WHERE…]

3. 统计字段平均值:SELECT AVG FieldName FROM TableName[ WHERE…]

4. 统计字段最大值:SELECT MAX FieldName FROM TableName[ WHERE…]

5. 统计字段最小值:SELECT MIN FieldName FROM TableName[ WHERE…]

inline _variant_t Statistics(CString SqlCommand)
{
    _variant_t vNULL;
    _RecordsetPtr pRecordset;
    pRecordset = m_pConnection->Execute((_bstr_t) SqlCommand, &vNULL, adCmdText);
    _variant_t vCount = pRecordset->GetCollect((_variant_t) (long) 0);
    pRecordset->Close();
    Recordset.Release();
    return vCount;
}

 

你可能感兴趣的:(VC++7.0,数据库,microsoft,c++,statistics,数据库服务器,access)