再探MFC(八)使用数据库

ADO包装类

A set of ADO classes - version 2.20

源文档 <http://www.codeproject.com/KB/database/caaadoclass1.aspx>

使用介绍

CADODatabase包装_ConnectionPtr,管理数据库连接.

连接数据库例子

//Sample withConnection string for SQL Server

CADODatabase* pAdoDb= new CADODatabase();

CStringstrConnection = _T("");

strConnection =_T("Provider=MSDASQL;PersistSecurityInfo=False;"

"Trusted_Connection=Yes;"

"Data Source=Access SqlServer;catalog=sampledb");

pAdoDb->SetConnectionString(strConnection);

if(pAdoDb->Open())

DoSomething();

.

.

.

//Sample withConnection String for Access database

CADODatabase* pAdoDb= new CADODatabase();

CStringstrConnection = _T("");

strConnection =_T("Provider=Microsoft.Jet.OLEDB.4.0;"

"DataSource=C:\\VCProjects\\ADO\\Test\\dbTest.mdb");

pAdoDb->SetConnectionString(strConnection);

if(pAdoDb->Open())

{

DoSomething();

.

.

.

pAdoDb->Close();

}

delete pAdoDb;

注意如果是access 2007版本以上,请使用如下连接字符串

strConnection =_T("Provider=Microsoft.Jet.OLEDB.12.0;")

_T("DataSource=simpledb.accdb;Persist Security Info=False");

CADORecordset包装_RecordsetPtr,管理结果集.

执行SQL

  1. CADODatabase::Execute执行SQL语句.
  1. 直接用Recordset对象进行查询取得记录集.
  1. 利用command对象来执行SQL命令,command对象在进行存储过程的调用中能真正体现它的作用

根据不同的目的执行不同的SQL方法.

CADORecordset* pRs =new CADORecordset(m_pDB);

TCHAR sql[256];

_stprintf_s(sql,sizeof(sql), _T("SELECT name,mobilephone FROM contacts"));

if(!pRs->Open(sql))

{

deletepRs;

}

else

{

while(!pRs->IsEOF())

{

Contactcontact = Contact();

pRs->GetFieldValue(_T("name"),contact.name);

pRs->GetFieldValue(_T("mobilephone"),contact.mobilephone);

contacts.push_back(contact);

pRs->MoveNext();

}

pRs->Close();

deletepRs;

pRs= NULL;

}

参数

adCmdText:表明CommandText是文本命令

adCmdTable:表明CommandText是一个表名

adCmdProc:表明CommandText是一个存储过程

adCmdUnknown:未知

_variant_tCOleDataTime转换

CstringstrValue;

_variant_tvar;

If(var.vt==VT_DATA)

{

DATA dt = var.data;

COleDataTime da = COleDateTime(dt);

strValue = da.Format("%Y-%m-%d%H:%M:%S");

}

BOFEOF

BOF、EOF 属性

BOF 指示当前记录位置位于Recordset 对象的第一个记录之前。

EOF 指示当前记录位置位于Recordset 对象的最后一个记录之后。

常见问题

Broken ADO whencompiling at Windows 7 SP1

I have changed my adoImport.h file to meet specs ofKB2640696.

This solves the problem of broken ADO when compilingat Windows 7 SP1

to make it compatible to run on Windows Vista andWindows XP.

I include adoImport.h as first include in ado2.h andadox.h

//////////////////////////////////////////////////////////////////////////

//

// adoImport.h

//

// Header file for ado2.h and adox.h

//

// Created by Theo Buys, 27-4-2005

//

// Last revision:

//   $Author: Buys_t $

//     $Date: 4-09-12 12:41 $

// $Revision: 2 $

//

// msado15.dll has namespace ADODB

// msadox.dll has namespace ADOX

// msjro.dll has namespace JRO

//

/////////////////////////////////////////////////////////////////////////////

#if!defined(AFX_ADOIMPORT_H__A8F183D1_116B_4869_9125_16CFF9A03ADA__INCLUDED_)

#defineAFX_ADOIMPORT_H__A8F183D1_116B_4869_9125_16CFF9A03ADA__INCLUDED_

#if _MSC_VER > 1000

#pragma once

#endif // _MSC_VER > 1000

#include
<comdef.h>

#pragma message (
"***adoImport.h:" )

#pragma message ( "***Make sure you have set the library directory for msadox.dll, msado15.dll andmsjro.dll." )

#pragma message ( "***In Visual Studio 2010 go to" )

#pragma message ( "***View > Property Manager > Properties > Microsoft.Cpp.Win32.user >VC++ Directories > Library Directories")

#pragma message ( "***and add $(CommonProgramFiles)\\system\\ado")

// CG : In order to use this codeagainst a different version of ADO, the appropriate

// ADO library needs to be used in the #import statement

#import <msadox.dll>

/////////////////////////////////////////////////////////////////////////////

// msado15.dll and type libraries (.tlb) issues for building in Windows 7SP1

// see: http://support.microsoft.com/kb/2640696

//

// 1) Consider the scenario where you are a C++ developer, and you include the

// following line of code in the application:

//

// #import <msado15.dll> rename("EOF","EndOfFile")

//

// 2) Consider the scenario that you recompile an application that must run in

// Windows Vista, in Windows Server 2008, or in later versions of Windows.

// And, you are not using MSJRO. In this scenario, you must change

// #import msado15.dll to the following:

//

// #import <msado60.tlb> rename("EOF","EndOfFile")

//

// 3) Consider the scenario that you are using MSJRO, and you recompile anapplication

// that must run in Windows Vista, in Windows Server 2008, or in a later

// version of Windows.

// 4) Consider the scenario that you recompile your application that must runin Windows XP

// or in Windows Server 2003. In both scenarios, you must change #importmsado15.dll

// to the following:

//

// #import <msado28.tlb> rename("EOF", "EndOfFile")

#import <msado28.tlb> rename("EOF",
"EndOfFile")

/////////////////////////////////////////////////////////////////////////////

// msjro.dll issues

//

// #import <msjro.dll> no_namespace rename("ReplicaTypeEnum","_ReplicaTypeEnum")

//

// Enable the namespace and suppress warning C4336:

// import cross-referenced type library ‘msado28.tlb‘ before importing‘msjro.dll‘

#import <msjro.dll> rename("ReplicaTypeEnum",
"_ReplicaTypeEnum")

#endif //!defined(AFX_ADOIMPORT_H__A8F183D1_116B_4869_9125_16CFF9A03ADA__INCLUDED_)

Note that I haveenabled the namespace JRO.

I never put a"using namespace" statement in a header-file but only in asource-file.

I hope that this ishelpfull.

modified 4-Sep-12 7:46am.

源文档 <http://www.codeproject.com/Articles/1075/A-set-of-ADO-classes-version#CADODatabase>

在VS2012
中编译 C
语言项目,如果使用了 scanf
函数,编译时便会提示如下错误:

error C4996: ‘scanf‘: This function or variable may be unsafe. Considerusing scanf_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. Seeonline help for details.

原因是VisualC++ 2012
使用了更加安全的 run-time library routines
。新的Security CRT functions(就是那些带有“_s”后缀的函数),请参见:

CRT函数的安全增强的版本

下面给出这个问题的解决方案:

方法一:将原来的旧函数替换成新的 Security CRT functions。

方法二:用以下方法屏蔽这个警告:

1. 在预编译头文件stdafx.h里(注意:一定要在没有include任何头文件之前)定义下面的宏:

#define _CRT_SECURE_NO_DEPRECATE

2. 或声明 #paramwarning(disable:4996)

3. 更改预处理定义:

项目->属性->配置属性->C/C++
-> 预处理器 ->
预处理器定义,增加:

_CRT_SECURE_NO_DEPRECATE

方法三:方法二没有使用更加安全的 CRT
函数,显然不是一个值得推荐的好方法,但我们又不想一个一个地改函数名,这里还有一个更简便的方法:

在预编译头文件 stdafx.h
里(同样要在没有include任何头文件之前)定义下面的宏:

#define_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES 1

在链接的时候便会自动将旧函数替换成 Security CRT functions

注意:这个方法虽然使用了新的函数,但是不能消除警告(原因见红字),你还得同时使用方法二(-_-)。即实际应在预编译头文件
stdafx.h 里加入下面两句:

#define _CRT_SECURE_NO_DEPRECATE

#define_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES 1

错误原因解释:

这种微软的警告,主要因为那些C库的函数,很多函数内部是不进行参数检测的(包括越界类的),微软担心使用这些会造成内存异常,所以就改写了同样功能的函数,改写了的函数进行了参数的检测,使用这些新的函数会更安全和便捷。关于这些改写的函数你不用专门去记忆,因为编译器对于每个函数在给出警告时,都会告诉你相应的安全函数,查看警告信息就可以获知,在使用时也再查看一下MSDN详细了解。

参考资料:《安全模板重载

源文档 <http://www.cnblogs.com/gb2013/archive/2013/03/05/SecurityEnhancementsInTheCRT.html>

Linkerror:
unresolved external symbol
ConvertStringToBSTRConvertBSTRToString

解决方案:

添加comsupp.lib release
模式

comsuppw.lib  debug模式

#ifdef_DEBUG

#pragmacomment (lib, "comsuppwd.lib")

#else

#pragmacomment (lib, "comsuppw.lib")

#endif

Pastedfrom <http://topic.csdn.net/u/20080620/11/81029171-b606-4e01-a511-4b17ae415b73.html>

参考资料

ADO第一次亲密接触 --ADO开发实践之一

Pastedfrom <http://www.vckbase.com/document/viewdoc/?id=215>

使用ADO实现BLOB数据的存取
-- ADO开发实践之二

Pastedfrom <http://www.vckbase.com/document/viewdoc/?id=252>

ProgrammaticallyInvoking the OLEDB Data Link Config Dialog

oledb数据源连接配置对话框

Pastedfrom <http://www.codeguru.com/cpp/data/mfc_database/oledb/article.php/c1175/>

自己如何正确获取MYSQL的ADO连接字符串

源文档 <http://blog.csdn.net/zyq5945/article/details/5486393>

时间: 2024-08-07 23:15:26

再探MFC(八)使用数据库的相关文章

再探MFC(七)用户自定义消息

用途 回调函数通信 子对话框与父对话框通信,子对话框间通信 线程通信 用户自定义消息使用 step1 定义消息ID 例如Resource.h #define                LBD_SET_CALL_STATE_MESSAGE                (WM_USER+100) step2 消息处理 类视图选中要发往消息的对话框类,在属性视图中重写WindowProc 在TODO下添加代码处理用户自定义消息 switch (message) { caseLBD_SET_CAL

再探MFC(五)状态栏

创建和初始化状态栏 step1 对话框添加变量 // 状态栏对象 CStatusBarm_wndStatusBar; step2 OnInitDialog调用 //创建和初始化状态栏 BOOLCLBDKFODlg::CreateStatusBar() { static UINT nIndicators[] = { ID_CALL_STATUS }; if (!m_wndStatusBar.Create (this)) return FALSE; m_wndStatusBar.SetIndicat

再探MFC(四)创建对话框

以点击菜单弹出非模式对话框为例. step1 资源视图添加对话框模板.重命名对话框资源ID. step2 选中对话框,右键菜单点击添加类. step3 在菜单项的消息处理函数中 CDialogAddContactdlg; INT_PTR nResponse =dlg.DoModal(); if (nResponse ==IDOK) { } else if (nResponse== IDCANCEL) { } 可以通过DoModel创建模式对话框,通过Create创建非模式对话框.Remarks解

再探Linux动态链接 -- 关于动态库的基础知识

  在近一段时间里,由于多次参与相关专业软件Linux运行环境建设,深感有必要将这些知识理一理,供往后参考. 编译时和运行时 纵观程序编译整个过程,细分可分为编译(Compiling,指的是语言到平台相关目标文件这一层次)和链接(Linking,指目标文件到最终形成可执行文件这一层次),这个总的过程可称为编译时:就动态链接而言,还存在一个运行时,即程序在被操作系统加载的过程中,系统将该程序需要的动态库加载至内存到程序开始运行的这一段过程.明确这两个过程在一般linux开发中的地位,以及了解每个"

再探css3

再探css3 我们知道,这几年来智能手机的高速发展使得人们使用移动端上网的时间和人数已经超过了PC端.例如在2015年,就中国电商而言,各电商平台在移动端持续发力,移动端购物占比不断攀升,双11期间,天猫交易额突破912亿元,其中移动端交易额占比68%,京东移动端下单量占比达到74%,其余各大电商平台移动端的支付比例也在60%-80%之间.即移动端在2015年超越PC端,成为网购市场的主流选择.这也使得网页设计师需要更加注重移动端的网页制作,而移动端对于HMTL5和CSS3目前已经支持的非常好了

【再探JNI】

上一次了解了一点JNI,然后不甘心的找到了JNI的官方文档.(官方文档绝对是一个最好的学习资料),百度找出来的一些资料大多数是比较零零碎碎的,不具有系统学习的可能,对于我这样的初学者,先全面的了解一个技术比往一个死角里钻研要好很多.并且百度出来的部分资料估计就是跟我这样的半吊子水平还不到的人的一些心得体会呢.因此,个人建议是看官方文档去全面了解一项技术,然后不理解的地方去再去搜集资料.加上自己的理解和实践,这样会进步的快一点. 好了,闲话少说.进入今天的真题.<再探JNI> (1)什么时候用J

QT开发(四十八)——数据库SQL接口层

QT开发(四十八)--数据库SQL接口层 SQL接口层提供了对数据库的访问,主要类包括Qt SQL模块中的QSqlDatabase.QSqlQuery.QSqlError.QSqlField.QSqlIndex和QSqlRecord.QSqlDatabase类用于创建数据库连接,QSqlQuery用于使用SQL语句实现与数据库交互. 一.QSqlDatabase 1.QSqlDatabase简介 QSqlDatabase类提供了通过连接访问数据库的接口,QSqlDatabase对象本身代表一个连

再探 butterfly.js - grunt.js篇(一)

再探 butterfly.js - grunt.js篇(一) 神器 grunt.js 久仰grunt.js的大名,学习grunt.js一直是我todo List的第一位.趁着新春佳节来临之际(打酱油的日子),就来填了这个坑,完了这个心愿. grunt.js的强大,强大在于它拥有很多用途丰富的插件,和不同插件之间的联动实现更牛逼的功能. 这里默认大家已经安装了npm和会用npm install等指令,就不详细讲了.下面讲用到grunt-contrib-watch和grunt-contrib-con

【足迹C++primer】33、再探迭代器

再探迭代器 这里有插入迭代器,有流迭代器,反向迭代器,移动迭代器. 插入迭代器 这是一种迭代器适配器,接受一个容器,生成一个迭代器,实现向给定容器添加元素. 插入迭代器有三种类型,差异在于元素插入的位置 back_inserter创建一个使用push_back的迭代器. front_inserter创建一个使用push_front的迭代器. inserter创建一个使用insert的迭代器. void fun1() { list<int> lst={1,2,3,4}; list<int&