C++中ADO访问数据库方法? (c 队列访问数据库)

这个过程有点复杂,详细请参阅孙鑫《VC++深入详解》最后一章,HOOK和数据库访问技术,那里讲得更明白!

#include

#include

using namespace std;

//导入ADO动态链接库,必须的

#import “c:\program files\common files\system\ado\msado15.dll”no_namespace rename(“EOF”,”adoEOF”)

void main()

{

_ConnectionPtr m_pConnection; //创建智能指针,必庆如须的

m_pConnection.CreateInstance(__uuidof(Connection)); //或 m_pConnection.CreateInstance(“ADODB.Connection”);

CoInitialize(NULL); //初始化COM,必须的

try

{

//连接字符串,Student为数据库名

m_pConnection->ConnectionString=”Provider=SQLOLEDB.1;Password=sa;Persist Security Info=True;User ID=sa;Initial Catalog=Student”;

m_pConnection->Open(” “,” “,” “,adModeUnknown); //调用Open方法

coutExecute(“select * from student”,NULL,adCmdText);//使用Execute方法,student为表名

if(!pRst>adoEOF)

pRst>MoveFirst();

else

{

coutadoEOF)

{

var = pRst>GetCollect(“Name”);

if(var.vt != VT_NULL)

strName = (LPCSTR)_bstr_t(var);

pRst>MoveNext();

}

//者差巧首键关闭

pRst->Close();

m_pConnection->Close();

pRst.Release();

m_pConnection->Release();

CoUninitialize(); //释放COM

}

一、ADO概述

ADO是Microsoft为最新和最强大的数据访问范例 OLE DB 而设计的,是一个便于使用的应用程序层接口。ADO 使您能够编写应用程序以通过 OLE. DB 提供者访问和操作数据库服务器中的数据。ADO 最主要的优点是易于使用、速度快、内存支出少和磁盘遗迹小。ADO 在关键袭返改的应用方案中使用最少的网络流量,并且在前端和数据源之间使用最少的层数,所有这些都是为了提供轻量、高性能的接口。之所以称为 ADO,是用了一个比较熟悉的暗喻,OLE 自动化接口。

OLE DB是一组”组件对象模型”(COM) 接口,是新的数据库低层接口,它封装了ODBC的功能,并以统一的方式访问存储在不同信息源中的数据。OLE DB是Microsoft UDA(Universal Data Access)策略的技术基础。OLE DB 为任何数据源提供了高性能的访问,这些数据源包括关系和非关系数据库、电子邮件和文件系统、文本和图形、自定义业务对象等等。也就是说,OLE DB 并不局限于 ISAM、Jet 甚至关系数据源,它能够处理任何类型的数据,而不考虑它们的格式和存储方法。在实际应用中,这种多样性意味着可以访问驻留在 Excel 电子数据表、文本文件、电子邮件/目录服务甚至邮件服务器,诸如 Microsoft Exchange 中的数据。但是,OLE DB 应用程序编程接口的目的是为各种应用程序提供更佳的功能,它并不符合简单化的要求。您需要的API 应该是一座连接应用程序和OLE DB 的桥梁,这就是 ActiveX Data Objects (ADO)。

二拍判、在VC中使用ADO(开发步骤如下:)

1、引入ADO库文件

使用ADO前必须在工程的stdafx.h头文件里用直接引入符号#import引入ADO库文件,以使编译器能正确编译。代码如下所示:

用#import引入ADO库文件

#import “c:\program files\common files\system\ado\msado15.dll”no_namespaces rename(“EOF” adoEOF”)

这行语句声明在工程中使用ADO,但不使用ADO的名字空间,并且为了避免常数冲突,将常数EOF改名为adoEOF。现在不需添加另外的头文件,就可以使用ADO接口了。

2、初始化OLE/COM库环境

必须注意的是,ADO库是一组COM动态库,这意味应用程序在调用ADO前,必须初始化OLE/COM库环境。在MFC应用程序里,一个比较好的方法是在应用程序主类的InitInstance成员函数里初始化OLE/COM库环境。

BOOL CMyAdoTestApp::InitInstance()

{

if(!AfxOleInit())//这就是初始化COM库

{

AfxMessageBox(“OLE初始化出错!”);

return FALSE;

}

……

}

3、ADO接口简介

ADO库包含三个基本接口:_ConnectionPtr接口、_CommandPtr接口和_RecordsetPtr接口。

_ConnectionPtr接口返回一个记录集或一个空指针。通常使用它来创建一个数据连接或执行一条不返回任何结果的SQL语句,如一个存储过程。使用_ConnectionPtr接口返回一个记录集不是一个好的使用方法。对于要返回记录的操作通常用_RecordserPtr来实现。而用_ConnectionPtr操作时要想得到记录条数得遍历所有记录,而用_RecordserPtr时不需要。

_CommandPtr接口返回一个记录集。它提供了一种简单的方法世模来执行返回记录集的存储过程和SQL语句。在使用_CommandPtr接口时,你可以利用全局_ConnectionPtr接口,也可以在_CommandPtr接口里直接使用连接串。如果你只执行一次或几次数据访问操作,后者是比较好的选择。但如果你要频繁访问数据库,并要返回很多记录集,那么,你应该使用全局_ConnectionPtr接口创建一个数据连接,然后使用_CommandPtr接口执行存储过程和SQL语句。

_RecordsetPtr是一个记录集对象。与以上两种对象相比,它对记录集提供了更多的控制功能,如记录锁定,游标控制等。同_CommandPtr接口一样,它不一定要使用一个已经创建的数据连接,可以用一个连接串代替连接指针赋给_RecordsetPtr的connection成员变量,让它自己创建数据连接。如果你要使用多个记录集,更好的方法是同Command对象一样使用已经创建了数据连接的全局_ConnectionPtr接口

,然后使用_RecordsetPtr执行存储过程和SQL语句。

4、使用_ConnectionPtr接口

_ConnectionPtr主要是一个连接接口,取得与数据库的连接。它的连接字符串可以是自己直接写,也可以指向一个ODBC DSN。

_ConnectionPtr pConn;

if (FAILED(pConn.CreateInstance(“ADODB.Connection”)))

{

AfxMessageBox(“Create Instance failed!”);

return;

}

CString strSRC;

strSRC=”Driver=SQL Server;Server=”;

strSRC+=”suppersoft”;

strSRC+=”;Database=”;

strSRC+=”mydb”;

strSRC+=”;UID=SA;PWD=”;

CString strSQL = “Insert into student(no,name,sex,address) values(3,’aaa’,’male’,’beijing’)”;

_variant_t varSRC(strSRC);

_variant_t varSQL(strSQL);

_bstr_t bstrSRC(strSRC);

if (FAILED(pConn->Open(bstrSRC,””,””,-1)))

{

AfxMessageBox(“Can not open Database!”);

pConn.Release();

return;

}

COleVariant vtOptional((long)DISP_E_PARAMNOTFOUND,VT_ERROR);

pConn->Execute(_bstr_t(strSQL),&vtOptional,-1);

pConn.Release();

AfxMessageBox(“ok!”);

5、使用_RecordsetPtr接口(以连接SQL Server为例)

_RecordsetPtr pPtr;

if (FAILED(pPtr.CreateInstance(“ADODB.Recordset”)))

{

AfxMessageBox(“Create Instance failed!”);

return FALSE;

}

CString strSRC;

strSRC=”Driver=SQL Server;Server=”;

strSRC+=”210.46.141.145″;

strSRC+=”;Database=”;

strSRC+=”mydb”;

strSRC+=”;UID=sa;PWD=”;

strSRC+=”sa”;

CString strSQL = “select id,name,gender,address from personal”;

_variant_t varSRC(strSRC);

_variant_t varSQL(strSQL);

if(FAILED(pPtr->Open(varSQL,varSRC,adOpenStatic,adLockOptimistic,adCmdText)))

{

AfxMessageBox(“Open table failed!”);

pPtr.Release();

return FALSE;

}

while(!pPtr->GetadoEOF())

{

_variant_t varNo;

_variant_t varName;

_variant_t varSex;

_variant_t varAddress;

varNo = pPtr->GetCollect (“id”);

varName = pPtr->GetCollect (“name”);

varSex = pPtr->GetCollect (“gender”);

varAddress = pPtr->GetCollect (“address”);

CString strNo =(char *)_bstr_t(varNo);

CString strName =(char *)_bstr_t(varName);

CString strSex =(char *)_bstr_t(varSex);

CString strAddress =(char *)_bstr_t(varAddress);

strNo.TrimRight();

strName.TrimRight();

strSex.TrimRight();

strAddress.TrimRight();

int nCount = m_list.GetItemCount();

int nItem = m_list.InsertItem (nCount,_T(“”));

m_list.SetItemText (nItem,0,strNo);

m_list.SetItemText (nItem,1,strName);

m_list.SetItemText (nItem,2,strSex);

m_list.SetItemText (nItem,3,strAddress);

pPtr->MoveNext();

}

pPtr->Close();

pPtr.Release();

6、使用_CommandPtr接口

_CommandPtr接口返回一个Recordset对象,并且提供了更多的记录集控制功能,以下代码示例了使用_CommandPtr接口的方法:

代码:使用_CommandPtr接口获取数据

_CommandPtr pCommand;

_RecordsetPtr pRs;

pCommand.CreateInstance(__uuidof(Command));

pCommand->ActiveConnection=pConn;

pCommand->CommandText=”select * from student”;

pCommand->CommandType=adCmdText;

pCommand->Parameters->Refresh();

pRs=pCommand->Execute(NULL,NULL,adCmdUnknown);

_variant_t varValue = pRs->GetCollect(“name”);

Cstring strValue=(char*)_bstr_t(varValue);

7、关于数据类型转换由于COM对象是跨平台的,它使用了一种通用的方法来处理各种类型的数据,因此Cstring 类和COM对象是不兼容的,我们需要一组API来转换COM对象和C++类型的数据。_vatiant_t和_bstr_t就是这样两种对象。它们提供了通用的方法转换COM对象和C++类型的数据。

详情请见

(转的):

介绍

VC用ADO访问数据库全攻略,介绍了VC用ADO来访问数据库的各个对象及各方法,很经典,也很实用,很值得一看。

正文

一、ADO概述

ADO是Microsoft为最新和最强大的数据访问范例 OLE DB 而设计的,是一个便于使用的应用程序层接口。ADO 使您能够编写应用程序以通过 OLE. DB 提供者访问和操作数据库服务器中的数据。ADO 最主要的优点是易于使用、速度快、内存支出少和磁盘遗迹小。ADO 在关键的应用方案中使用最少的网络流量,并且在前端和数据源之间使用最少的层数,所有这些都是为了提供轻量、高性能的接口。之所以称为 ADO,是用了一个比较熟悉的暗喻,OLE 自动化接口。

OLE DB是一组”组件对象模型”(COM) 接口,是新的数据库低层接口,它封装了ODBC的功能,并以统一的方式访问存储在戚前不同信息源中的数据。OLE DB是Microsoft UDA(Universal Data Access)策略的技术基础。OLE DB 为任何数据源峁┝烁咝阅艿姆梦剩�庑┦�菰窗�ü叵岛头枪叵凳�菘狻⒌缱佑始�臀募�低场⑽谋竞屯夹巍⒆远ㄒ逡滴穸韵蟮鹊取R簿褪撬担琌LE DB 并不局限于 ISAM、Jet 甚至关系数据源,它能够处理任何类型的数据,而不考虑它们的格式和存储方法。在实际应用中,这种多样性意味着可以访问驻留在 Excel 电子数据表、文本文件、电子邮件/目录服务甚至邮件服务器,诸如 Microsoft Exchange 中的数据。但是,OLE DB 应用程序编程接口的目的是为各种应用程序提供更佳的功能,它并不符合简单化的要求。您需要的API 应该是一座连接应用程序和OLE DB 的桥梁,这就是 ActiveX Data Objects (ADO)。

二、在VC中使用ADO(开发步骤好下:)

1、引入ADO库文件

使用ADO前必须在工程的stdafx.h头文件里用直接引入符号#import引入ADO库文件,以使编译器能正确编译。代码如下所示:

用#import引入ADO库文件

#import “c:\program files\common files\system\ado\msado15.dll”no_namespaces rename(“EOF” adoEOF”)

这行语句声明在工程中使用ADO,但不使用ADO的名字空间,并且为了避免常数冲突,将常数EOF改名为adoEOF。现在不需添加另外的头文件,就可以使用ADO接口了。

2、初始化OLE/COM库环境

必须注意的是,ADO库是一组COM动态库,这意味应用程序在调用ADO前,必须初始化OLE/COM库环境。在MFC应用程序里,一个比较好的方法是在应用程序主类的InitInstance成员函数里初始化OLE/COM库环境。

BOOL CMyAdoTestApp::InitInstance()

{

if(!AfxOleInit())//这就是初始化COM库

{

AfxMessageBox(“OLE初始化出错!”);

return FALSE;

}

……

}

3、ADO接口简介

ADO库包含三个基本接口:_ConnectionPtr接口、_CommandPtr接口和_RecordsetPtr接口。

_ConnectionPtr接口返回一个记录集或一个空指针。高码清通常使用它来创建一个数据连接或执行一条不返回任何结果的SQL语句,如一个存储过程。使用_ConnectionPtr接口返回一个记录集不是一个好的使用方法。对于要返回记录的操作通常用_RecordserPtr来实现。而用_ConnectionPtr操作时要想得到记录条数得遍历所有记录,而用_RecordserPtr时不需要。

_CommandPtr接口返回一个记录集。它提供了一种简单的方法来执行返回记录集的存储过程和SQL语模猜句。在使用_CommandPtr接口时,你可以利用全局_ConnectionPtr接口,也可以在_CommandPtr接口里直接使用连接串。如果你只执行一次或几次数据访问操作,后者是比较好的选择。但如果你要频繁访问数据库,并要返回很多记录集,那么,你应该使用全局_ConnectionPtr接口创建一个数据连接,然后使用_CommandPtr接口执行存储过程和SQL语句。

_RecordsetPtr是一个记录集对象。与以上两种对象相比,它对记录集提供了更多的控制功能,如记录锁定,游标控制等。同_CommandPtr接口一样,它不一定要使用一个已经创建的数据连接,可以用一个连接串代替连接指针赋给_RecordsetPtr的connection成员变量,让它自己创建数据连接。如果你要使用多个记录集,更好的方法是同Command对象一样使用已经创建了数据连接的全局_ConnectionPtr接口

,然后使用_RecordsetPtr执行存储过程和SQL语句。

4、使用_ConnectionPtr接口

_ConnectionPtr主要是一个连接接口,取得与数据库的连接。它的连接字符串可以是自己直接写,也可以指向一个ODBC DSN。。

_ConnectionPtr pConn;

if (FAILED(pConn.CreateInstance(“ADODB.Connection”)))

{

AfxMessageBox(“Create Instance failed!”);

return;

}

CString strSRC;

strSRC=”Driver=SQL Server;Server=”;

strSRC+=”suppersoft”;

strSRC+=”;Database=”;

strSRC+=”mydb”;

strSRC+=”;UID=SA;PWD=”;

CString strSQL = “Insert into student(no,name,sex,address) values(3,”aaa”,”male”,”beijing”)”;

_variant_t varSRC(strSRC);

_variant_t varSQL(strSQL);

_bstr_t bstrSRC(strSRC);

if (FAILED(pConn->Open(bstrSRC,””,””,-1)))

{

AfxMessageBox(“Can not open Database!”);

pConn.Release();

return;

}

COleVariant vtOptional((long)DISP_E_PARAMNOTFOUND,VT_ERROR);

pConn->Execute(_bstr_t(strSQL),&vtOptional,-1);

pConn.Release();

AfxMessageBox(“ok!”);

5、使用_RecordsetPtr接口(以连接SQL Server为例)

_RecordsetPtr pPtr;

if (FAILED(pPtr.CreateInstance(“ADODB.Recordset”)))

{

AfxMessageBox(“Create Instance failed!”);

return FALSE;

}

CString strSRC;

strSRC=”Driver=SQL Server;Server=”;

strSRC+=”210.46.141.145″;

strSRC+=”;Database=”;

strSRC+=”mydb”;

strSRC+=”;UID=sa;PWD=”;

strSRC+=”sa”;

CString strSQL = “select id,name,gender,address from personal”;

_variant_t varSRC(strSRC);

_variant_t varSQL(strSQL);

if(FAILED(pPtr->Open(varSQL,varSRC,adOpenStatic,adLockOptimistic,adCmdText)))

{

AfxMessageBox(“Open table failed!”);

pPtr.Release();

return FALSE;

}

while(!pPtr->GetadoEOF())

{

_variant_t varNo;

_variant_t varName;

_variant_t varSex;

_variant_t varAddress;

varNo = pPtr->GetCollect (“id”);

varName = pPtr->GetCollect (“name”);

varSex = pPtr->GetCollect (“gender”);

varAddress = pPtr->GetCollect (“address”);

CString strNo =(char *)_bstr_t(varNo);

CString strName =(char *)_bstr_t(varName);

CString strSex =(char *)_bstr_t(varSex);

CString strAddress =(char *)_bstr_t(varAddress);

strNo.TrimRight();

strName.TrimRight();

strSex.TrimRight();

strAddress.TrimRight();

int nCount = m_list.GetItemCount();

int nItem = m_list.InsertItem (nCount,_T(“”));

m_list.SetItemText (nItem,0,strNo);

m_list.SetItemText (nItem,1,strName);

m_list.SetItemText (nItem,2,strSex);

m_list.SetItemText (nItem,3,strAddress);

pPtr->MoveNext();

}

pPtr->Close();

pPtr.Release();

6、使用_CommandPtr接口

_CommandPtr接口返回一个Recordset对象,并且提供了更多的记录集控制功能,以下代码示例了使用_CommandPtr接口的方法:

代码11:使用_CommandPtr接口获取数据

_CommandPtr pCommand;

_RecordsetPtr pRs;

pCommand.CreateInstance(__uuidof(Command));

pCommand->ActiveConnection=pConn;

pCommand->CommandText=”select * from student”;

pCommand->CommandType=adCmdText;

pCommand->Parameters->Refresh();

pRs=pCommand->Execute(NULL,NULL,adCmdUnknown);

_variant_t varValue = pRs->GetCollect(“name”);

CString strValue=(char*)_bstr_t(varValue);

6、关于数据类型转换由于COM对象是跨平台的,它使用了一种通用的方法来处理各种类型的数据,

因此Cstring 类和COM对象是不兼容的,我们需要一组API来转换COM对象和C++类型的数据。_vatiant_t和_bstr_t就是这样两种对象。它们提供了通用的方法转换COM对象和C++类型的数据。

孙鑫老师的 《深入浅出MFC》最后一章着重讲了这个问题,建议去论坛下载看看吧

C++链接SQL2023

#import “C:\Program Files\Common Files\System\ADO\戚迟msado15.dll” \

no_namespace rename(“EOF”, “EndOfFile”)

#include

#include

#include

// Function declarations

inline void TESTHR(HRESULT x) {if FAILED(x) _com_issue_error(x);};

void ConnectionStringX();

_bstr_t GetState(int intState);

void PrintProviderError(_ConnectionPtr pConnection);

void PrintComError(_com_error &e);

void main()

{

if(FAILED(::CoInitialize(NULL)))

return;

ConnectionStringX();

/历仔岩/Wait here for user to see the output..

printf(“\nPress any key to continue…”);

getch();

::CoUninitialize();

}

void ConnectionStringX()

{

// Define Connection object pointers.

// Initialize pointers on define.

// These are in the ADODB:: namespace

_ConnectionPtr pConnection1 = NULL;

_ConnectionPtr pConnection2 = NULL;

_ConnectionPtr pConnection3 = NULL;

_ConnectionPtr pConnection4 = NULL;

//Define Other Variables

HRESULT hr = S_OK;

try

{

// Open a connection using OLE DB syntax.

TESTHR(pConnection1.CreateInstance(__uuidof(Connection)));

pConnection1->ConnectionString =

“Provider=’sqloledb’;Data Source=’MySqlServer’;”

“Initial Catalog=’Pubs’;Integrated Security=’SSPI’;”;

pConnection1->ConnectionTimeout = 30;

pConnection1->Open(“”,””,””,adConnectUnspecified);

printf(“cnn1 state: %s\n”,

(LPCTSTR)GetState(pConnection1->State));

// Open a connection using a DSN and ODBC tags.

/肢御/ It is assumed that you have create DSN ‘Pubs’ with a user name as

// ‘MyUserId’ and password as ‘MyPassword’.

TESTHR(pConnection2.CreateInstance(__uuidof(Connection)));

pConnection2->ConnectionString = “DSN=Pubs;UID=MyUserId;PWD=MyPassword;”;

pConnection2->Open(“”,””,””,adConnectUnspecified);

printf(“cnn2 state: %s\n”,

(LPCTSTR)GetState(pConnection2->State));

// Open a connection using a DSN and OLE DB tags.

TESTHR(pConnection3.CreateInstance(__uuidof(Connection)));

pConnection3->ConnectionString = “Data Source=Pubs;”;

pConnection3->Open(“”,””,””,adConnectUnspecified);

printf(“cnn3 state: %s\n”,

(LPCTSTR)GetState(pConnection3->State));

// Open a connection using a DSN and individual

// arguments instead of a connection string.

// It is assumed that you have create DSN ‘Pubs’ with a user name as

// ‘MyUserId’ and password as ‘MyPassword’.

TESTHR(pConnection4.CreateInstance(__uuidof(Connection)));

pConnection4->Open(“Pubs”,”MyUserId”,”MyPassword”,adConnectUnspecified);

printf(“cnn4 state: %s\n”,

(LPCTSTR)GetState(pConnection4->State));

}

catch(_com_error &e)

{

// Notify user of any errors.

// Pass a connection pointer accessed from the Connection.

PrintProviderError(pConnection1);

if(pConnection2)

PrintProviderError(pConnection2);

if(pConnection3)

PrintProviderError(pConnection3);

if(pConnection4)

PrintProviderError(pConnection4);

PrintComError(e);

}

//Cleanup objects before exit.

if (pConnection1)

if (pConnection1->State == adStateOpen)

pConnection1->Close();

if (pConnection2)

if (pConnection2->State == adStateOpen)

pConnection2->Close();

if (pConnection3)

if (pConnection3->State == adStateOpen)

pConnection3->Close();

if (pConnection4)

if (pConnection4->State == adStateOpen)

pConnection4->Close();

}

_bstr_t GetState(int intState)

{

_bstr_t strState;

switch(intState)

{

case adStateClosed:

strState = “adStateClosed”;

break;

case adStateOpen:

strState = “adStateOpen”;

break;

default:

;

}

return strState;

}

void PrintProviderError(_ConnectionPtr pConnection)

{

// Print Provider Errors from Connection object.

// pErr is a record object in the Connection’s Error collection.

ErrorPtr pErr = NULL;

if( (pConnection->Errors->Count) > 0)

{

long nCount = pConnection->Errors->Count;

// Collection ranges from 0 to nCount -1.

for(long i = 0; i Errors->GetItem(i);

printf(“Error number: %x\t%s\n”, pErr->Number,

(LPCSTR)pErr->Description);

}

}

}

void PrintComError(_com_error &e)

{

_bstr_t bstrSource(e.Source());

_bstr_t bstrDescription(e.Description());

printf(“Error\n”);

printf(“\tCode = %08lx\n”, e.Error());

printf(“\tCode meaning = %s\n”, e.ErrorMessage());

printf(“\tSource = %s\n”, (LPCSTR) bstrSource);

printf(“\tDescription = %s\n”, (LPCSTR) bstrDescription);

}

相关问题拓展阅读:

怎样用vc++ 6.0访问SQL Server数据库

这个不是一句两句可以说清楚的

给你语句还有其他工作要做

比如用ADO连接数据源前的蠢漏春准备工作

1)在头文件中引入相应的库文件(一般带耐放在StdAfx.h中搜镇)。

……

#import “c:\Program Files\Common Files\System\ADO\msado15.dll”

no_namespace rename(“EOF”,”_EOF”)

……

注意:为了避免类型库文件中EOF与系统定义的EOF相关的名称相冲突,所以使用rename将其重命名。

2)初始化COM环境(一般放在函数BOOL CTheApp::InitInstance()里面)。

CoInitialize(NULL);//初始化COM环境

还有Connection与Recordset

因为在使用数据库时,首先会打开数据库,然后再对数据库中的某个数据表进行操作。ADO访问数据库时也要遵循这个规矩。Connection对象代表了打开与数据源的连接。而Recordset对象表示的是来自基本表或命令执行结果的记录集。在使用Connection与Recordset之前,需要创建它们的实例:

_ConnectionPtr cnn=NULL;

cnn.CreateInstance(__uuidof(Connection));

_RecordsetPtr rst=NULL;

rst.CreateInstance(_uuidof(Recordset));

完全可以把cnn及rst看成是一个对象指针来使用。而不用考虑它的COM对象的实例。

声明一个Connection对象实例后,就可以使用这个对象实例来连接数据库了。

比如cnn-ConnectionString=”uid=admin;pwd=111;DRIVER={Microsoft Access Driver (*.mdb)};

DBQ=khzy.mdb;”; //连接ACCESS数据库。

cnn-Open(L””,L””,L””,adConnectUnspecified);

还有具体的

还是建议你先看书

慢慢实践

不愿意问老师

可以问同学

同学间还是有高手的

从功能简单的数据库(如Jet Engine)到复杂的大型数据库系统(如oracle),VC++6.0都提供了一些编程接口。本文主要介绍以下五种: 1.ODBC API;2.MFC ODBC类;3.MFC DAO类;(数据访问对象)4.MFC的OLE/DB;5.ActiveX数据对象(ADO)。6.RDO远程数据访问

1.开放数据库连接(ODBC API):提供了一个通用的编程接口,允许程序与多种不同的数据库连接。它为Oracle,SQL Server,MS Excel等都提供了驱动程序,使得用户可以使用SQL语句对数据库进行直接的底层功能操作。在使用ODBC API时,用户须引入的头文件为 “sql.h “, “sqlext.h “, “sqltypes.h “。用ODBC API创建数据库应用程序遵循一定的基本步骤:

之一步是分配游咐ODBC环境,使一些内部结构初始化。完成这一步,须分配一个SQLHENV类型的变量在ODBC环境中做句柄使用。

第二步是为将要使用的每一个数据源分配一个连接句柄,由函数SQLALLocHandle()完成。

第三步是使用SQLConnect()把连接句柄与数据库连接,可以先通过SQLSetConnectAttr()设置连接属性。

然后就可以进行SQL语句的操作,限于篇幅,相关的函数就不具体介绍了,读者可以参考相关书籍。

操作完成后,用户取回相应的结果,就可以取消与数据库的连接。

最后需要释放ODBC环境。

ODBC API的特点是功能强大丰富,提供了异步操作,事务处理等高级功能,但相应的编程复杂,工作量大。

2.MFC ODBC类:MFC1.5后的版本里引入封装了ODBC功能的类。通过这些类提供与ODBC的接口,使得用户可以不须处理ODBC API中的繁杂处理就可以进行数据库操作。主要的MFC ODBC类如下。

CDatabase类:一个CDatabase对象表示一个到数据源的连接,通过它可以操作数据源。应用程序可使用多个CDatabase对象:构造一个对象并调用OpenEx()成员函数打开一个连接。接着构造CRecordSet对象以操作连接的数据源,并向CDatabase对象传递记录集构造程序指针。完成使用后用Close()成员函数销毁CDatabase对象。一般情况下并不需要直接使用CDatabase对象,因为CRecordSet对象可以实现大多数的功能。但是在进行事务处理时,CDatabase就起到关键作用。事务(Transaction)指的是将一系列对数据源的更新放在一起,同时提交或一个也不提交,为的是确保多用户对数据源同时操作时的数据正确性。

CRecordSet类:一个CRecordSet对象代表一个从数据源选择的一组记录的-记录集。记录集有两种形式:snapshot和dynaset。前者表示数据的静态视图,后者表示记录集与其他用户对数据库的更新保持同步。通过CRecordSet对象,用户可以对数据库中的记录进行各种操作。

CRecordView类:CRecordView对象是在空间中显示数据库记录的视图。这种视图是一种直接连到一个CRecordSet对象的格式视图,它从一个对话框模板资源创建,并将CRecordSet对象的字段显示在对话框模板的控件里。对象利用DDX和RFX机制,使格式上的控件和记录集的字段之间数据移动自动化,也就是说,用户甚至不要编写一行代码就可以实现简单的数据库记录查看程序。

CDBException类:由Cexception类派生,以三个继承的成员变量反映对数据库操作时的异常:

m_nRetCode:以ODBC返回代码(SQL_RETURN)的形式表明造成异常的原因。

m_strError:字符串,描述造成抛出异常的错误原埋段因。

m_strStateNativeOrigin:字符串,用以描述以ODBC错误代码表示的异常错误。

MFC数据库类成员函数都能抛出CDBException类型的异常,所以在神液纯代码对数据库进行操作后监测异常是正确做法。

MFC ODBC类在实际开发中应用最广,因为它功能丰富,操作相对简便。

3.MFC DAO(数据访问对象)编程:DAO用于和微软的Access数据库接口。在数据库应用程序如果只需与Access数据库接口时,使用DAO编程较方便。其主要类如下。

CDaoWorkspace:CDaoWorkspace对象可以让一个用户管理从登陆到离开期间,指定的密码保护的数据库会话全过程。大多数情况下不要多个工作区也不要创建明确的工作区对象。因为在打开数据库和记录集对象时,它们可以使用DAO缺省工作区。

CDaoDatabase:代表一个连接,类似上述CDatabase类。

CDaoRecordSet:用来选择记录集并操作,类似上述CRecordSet类。

CDaoRecordView:类似上述CRecordView类。

CDaoException:类似上述CDBException类。

CDaoTableDef:表示基本表或附加表的定义。每个DAO数据库对象包括一个称为TableDef的收集,包含所有存储的DAO表定义对象。CDaoTableDef对象可以用来控制表定义。

CDaoQueryDef:CDaoQueryDef对象表示了一个查询定义(querydef)。

CDaoFieldExchange:支持数据库类使用的DAO字段交换(DFX)例程。也可处理事务,类似MFC ODBC类。

MFC DAO仅用来支持Access数据库,应用范围相对固定。

4.OLE DB:OLE DB在数据提供程序和用户之间提供了灵活的组件对象模型(COM)接口,这种灵活性有时会使得操作复杂化。OLE DB框架定义了应用的三个基本类。

数据提供程序Data Provider:拥有自己的数据并以表格形式显示数据的应用程序。提供OLE DB的行集COM接口,期显示范围可以从单一数据表格的简单提供者知道更复杂的分布式数据库系统。

使用者Consumers:使用OLE DB接口对存储在数据提供程序中的数据进行控制的应用程序。用户应用程序归为使用类。

服务提供程序Service Provider:是数据提供程序和使用者的组合。服务提供程序没有自己的数据,但使用

OLE DB使用者接口来访问存储在数据提供程序中的数据。然后,服务提供程序通过打开数据提供程序接口使得数据对使用者有效。服务提供程序常用于向应用程序提供高层次服务,比如高级分布式查询。

OLE DB编程时,用户使用组件对象开发应用程序。这些组件有:

枚举器:用于列出可用的数据源;

数据源:代表单独的数据和服务提供程序,用于创建对话;

对话:用于创建事务和命令;

事务:用于将多个操作归并为单一事务处理;

命令:用于向数据源发送文本命令(SQL),返回行集;

错误:用于获得错误信息。

5.ActiveX数据对象(ADO):是微软提供的面向对象的接口,与OLE DB类似,但接口更简单,具有更广泛的特征数组和更高程度的灵活性。ADO基于COM,提供编程语言可利用的对象,除了面向VC++,还提供面向其他各种开发工具的应用,如VB,VJ等。ADO在服务器应用方面非常有用,特别是对于动态服务器页面ASP(Active Server Page)。

ADO对象结构类似于OLE DB,但并不依靠对象层次。大多数情况下,用户只需要创建并只使用需要处理的对象。下面的对象类组成了ADO接口。

Connection:用于表示与数据库的连接,以及处理一些命令和事务。

Command:用于处理传送给数据源的命令。

Recordset:用于处理数据的表格集,包括获取和修改数据。

Field:用于表示记录集中的列信息,包括列值和其他信息。

Parameter:用于对传送给数据源的命令之间来回传送数据。

Property:用与操作在ADO中使用的其他对象的详细属性。

Error:用于获得可能发生的错误的详细信息。

在VC++使用ADO需要进行COM操作,详细方法在此就不赘述了。

在当今流行的分布式开发环境下,VC++6.0在数据库开发方面有较强的优势,学会

在不同的场合选用不同的技术,对开发人员来说是必要的技术。

常用VC、MFC访问数据库常用的技术是ADO

导入ADO库

#import “c:\Program Files\Common Files\System\ADO\msado15.dll” no_namespace rename(“EOF”, “adoEOF”)

2、用导入枝铅的

动态库

的指针操作数据库.

打开数据库连接

_ConnectionPtr m_pConn; // 数据库连接指针

// 创建Conneciton对象

m_pConn.CreateInstance(_T(“ADODB.Connection”));

用ConnectionPtr 的open方法m_pConn->Open(_bstr_t(m_sConn),

_T(“”), _T(“”), lOptions));

m_sConn为你连接数据库的信息,你应该按照你的要求打开数据库

然后你用打开的那个连接进行操作数据库。比如

_RecordsetPtr pRec = m_pConn->Execute(_bstr_t(pszSql), NULL, CmdText);

pszSql 就你要操作数据库的SQL语句。在这个SQL语句里你可以创建表、更新表等。

用ADO访问的时候要求初始他COM库和释放COM对象

// 初始化COM环境(库)

::CoInitialize(NULL);

//释放COM对象

::CoUninitialize();

ODBC访问数据库

配置ODBC数据源:打开

控制面板

下的“数据源”,弹出“ODBC数据源管理器”,选择DSN选项卡-》添加->你选择你的SQL Server选项,单击完成。如图然后你再按照向导提示添加。

代码中用ODBC访问数据库你得加上afxdb.h

头文件

用CDataBase 类连接数据库、CRecordSet类查询记录。

现在在VC访问数据库州搭兄常用的是ADO访问,你可以找一下我前面的回答有ADO访问数据库的步骤。

CDataBase m_cODBCDb;

用CDataBase类的OpenEx()函数打开数据库连接。册袭连接

字符串

你自己构造一下。

定义一个与上面数据库相关的查询对象

CRecordSet m_cODBCRec(&m_cODBCDb);

用这个查询对象的open方法就可以执行SQL语句与数据库交互了;

给你个例子桐圆渗:ServerIp是服务器的ip地址,databasename是局脊数据库腔芦名

#import “C:\Program Files\Common Files\System\ado\msado15.dll” no_namespace rename(“EOF”,”adoEOF”)

int main()

{

CoInitialize(NULL);

try

{

_ConnectionPtr pConn(“ADODB.Connection”);

_RecordsetPtr pRs(“ADODB.Recordset”);

pConn->Open(“driver={SQL Server};Server=ServerIP;DATABASE=databasename;UID=sa;PWD=”,””,””,adModeUnknown);

pRs->Open(“select * from TABLENAME”,_variant_t((IDispatch*)pConn,true),adOpenForwardOnly,adLockReadOnly,adCmdUnknown);

while(!pRs->adoEOF)

{

CString FieldName1,FieldName2;

_variant_t var;

var = pRs->GetCollect(_variant_t(“FieldName1”));

var.ChangeType(VT_BSTR);

FieldName1 = var.bstrVal;

pRs->MoveNext();

}

}

catch(CException *e)

{

e->ReportError();

e->Delete();

}

CoUninitialize();

return 0;

}

c 队列访问数据库的介绍就聊到这里吧,感谢你花时间阅读本站内容,更多关于c 队列访问数据库,C++中ADO访问数据库方法?,怎样用vc++ 6.0访问SQL Server数据库的信息别忘了在本站进行查找喔。


数据运维技术 » C++中ADO访问数据库方法? (c 队列访问数据库)