MFC ODBC数据库开发技术、 ADO数据库开发技术

1.mfc odbc开发技术

1.利用odbc建立数据源

2.数据库连接

1).包含头文件 #include

2).对数据源进行操作之前需要定义一个cdatabase对象,代码如下

cdatabase m_db;

3).调用cdatabase的成员函数openex建立和数据源的连接,代码如下

try { m_db.openex(l”dsn=test;uid=sa;pwd=”, cdatabase::noodbcdialog); } catch(_com_error e) { messagebox(l”连接数据库失败”); }

其中dsn为数据源名称,uid数据库用户名,pwd为相应的密码

3.数据库操作

查询记录

crecordset rs(&m_db); //crecordset rs; rs = &m_db;

rs.open(crecordset::dynaset, l”select * from test”); //详见msdn

获得字段值

getfieldvalue

添加,删除,修改记录方法如下

1.先定义相应操作的sql语句

2.调用executesql函数即可

ado数据库开发技术

1.ado是windows环境中比较流行的数据库技术。它是建立在ole db底层技术之上的高级编程接口,因而具有强大的数据处理功能和简单易用的编程接口,并且得到了广泛的应用。

ado的底层是ole db(微软的战略性的通向不同的数据源的低级应用程序接口),所以不仅能访问关系型数据库,也可以访问非关系型数据库,更是现在最快速的数据库访问中间层。

2.ado主要对象介绍

1).

connection object(连接对象)

command object(命令对象)

recordset object(记录集对象)

field object(字段对象)

record object(记录对象)

error object(错误对象)

parameter object(参数对象)

property object(属性对象)

stream object(流对象)

其中最重要的是connection object(连接对象),command object(命令对象),recordset object(记录集对象)

connection object:连接对象代表了一个和数据源的连接,之后的数据库操作都是建立在这个连接上。

command object:命令对象用来处理数据库的一些操作,在某些方面具有和连接对象相同的功能,例如都可以可行标准的sql语句以及存储过程,不过命令对象可以返回带有记录集的结果。

recordset object:记录集对象代表了一个记录集,用来访问记录集。

在使用这三个对象之前,需要定义与之对应的3个职能指针,分别为_connectionptr, _commandptr, _recordsetptr,然后调用它们的createinstance函数进行实例化,从而创建这3个对象的实例。

2)._bstr和_variant_t类

在利用ado进行数据库开发时,_bstr_t和_variant_t两个类很有用,从来省去了bstr和variant类型转换的麻烦。

com编程不适用cstring类,因为com必须设计成跨平台,它需要一种更普遍的方式来处理字符串以及其他数据类型。

3).引入ado库

在stdafx.h末尾处引入ado库文件

#import “c:/program files/common files/system/ado” no_namespace rename(“eof”, “adoeof”)

使用预处理指令import使程序在编译过程中引入ado动态库(msado115.dll).no_namespace表明不使用命名空间。rename(“eof”, “adoeof”)表明把ado中用到eof改为adoeof,防止发生命名冲突。

注意:利用应用程序向导进行ado数据库开发时,需要在程序向导的第二步选择(automation)选项,使应用程序能够支持“自动操作”的方式。

数据库连接

_connectionptr m_pconnection; //定义一个_connectionptr指针

m_pconnection.createinstance(_uuidof(connection)); //调用createinstance方法实例化

最后,调用connection对象的open函数创建数据库连接,open函数原型如下。

hresult open(

_bstr_t connectiongstring,

_bstr_t userid,

_bstr_t password,

long options);

其中,connectionstring是一个包含连接信息的字符串,uerid是访问数据库的用户名,password是访问数据库的秘密,options为可选参数。如果在connectiongstring中包含了数据库用户名和密码,uerid和password值可以为空。

下面附上一些代码说明(代码为我写的“壁虎桌面日历”部分代码)

连接数据库

m_pconn.createinstance(__uuidof(connection)); wchar_t wpath[200]; getmodulefilename(null,wpath,200); pathremovefilespec(wpath); wcscat(wpath,l”//anycaler.mdb”); wchar_t wconn[400]; wsprintf(wconn,l”provider = microsoft.jet.oledb.4.0; data source = %s; persist security info=false”,wpath); try { m_pconn->open(wconn, “”, “”, adconnectunspecified); } catch(_com_error e) { /* cstring errormsg; errormsg.format(_t(“连接数据库失败!/n%s”), e.errormessage()); lpctstr errmsg; errmsg = (const wchar*)(errormsg.allocsysstring()); afxmessagebox(errmsg);*/ messagebox(null,l”数据库连接失败!”,l”警告”,mb_iconwarning); exit(0); }

查询 添加记录 修改记录

_recordsetptr rst; _variant_t var; hresult hr;

rst.createinstance(_uuidof(recordset)); //打开连接 char sqlstr[100] = {0}; sprintf(sqlstr, “select * from memoinfo where date = ‘%d-%d-%d'”, m_memodlg.m_year, m_memodlg.m_month, m_memodlg.m_date);

try { hr = rst->open(sqlstr, m_pconn.getinterfaceptr(), adopendynamic,adlockoptimistic,adcmdtext); } catch(_com_error *e) { afxmessagebox(e->errormessage()); } if (rst->adoeof) { rst->addnew(); rst->putcollect(“date”, _variant_t(tempdatestr)); rst->putcollect(“time”, _variant_t(temptimestr)); rst->putcollect(“memo”, _variant_t(m_memo)); rst->putcollect(“warn”, _variant_t(m_memodlg.checkremind)); rst->putcollect(“shark”, _variant_t(m_memodlg.checkshake)); rst->putcollect(“card”, _variant_t(m_memodlg.checkpopwindow)); rst->putcollect(“sound”, _variant_t(m_memodlg.checkpopwindow)); rst->putcollect(“del”, _variant_t(“1”)); rst->update(); } else { rst->putcollect(“date”, _variant_t(tempdatestr)); rst->putcollect(“time”, _variant_t(temptimestr)); rst->putcollect(“memo”, _variant_t(m_memo)); rst->putcollect(“warn”, _variant_t(m_memodlg.checkremind)); rst->putcollect(“shark”, _variant_t(m_memodlg.checkshake)); rst->putcollect(“card”, _variant_t(m_memodlg.checkpopwindow)); rst->putcollect(“sound”, _variant_t(m_memodlg.checkpopwindow)); rst->putcollect(“del”, _variant_t(“1”)); rst->update(); } rst->close(); rst = null;

删除

rst->delete(adaffectcurrent);

备注:_connectionptr对象可申明为全局变量,在app的initinstance函数中连接数据源,在exitinstance断开数据源连接;每个_recordset指针在使用完之后记得close并附空值。

还可以利用ado数据控件进行数据库编程,具体参考visual c++++++ sql server数据库开发与实例

(0)
上一篇 2022年3月21日
下一篇 2022年3月21日

相关推荐