【转】MFC中用Ado连接数据库

news/2024/11/8 0:11:49/

转自http://blog.csdn.net/guomei/archive/2009/02/22/3921986.aspx

特此感谢。

内容拷贝如下:

 

VC++中使用MFC通过ADO连接数据库方法小结(不包括异常的捕捉)
这里主要讲MFC与SQL2000数据库的连接。

1.在StdAfx.h头文件中加入此句子
#import "c:/program files/common files/system/ado/msado15.dll"/
 no_namespace rename("EOF","adoEOF")

2.在App类的InitInstance()函数中加入

::CoInitialize(NULL);//表示com库的初始化 

鼠标右键点击App类名添加虚函数ExitInstance() ,在其中加入代码

 ::CoUninitialize();//释放com库。

3.获取连接字符串。

     最简单的方法就是新建一个.txt文件,将其后缀名改为.udl,双击它,在“提供程序”标签页中选择“Microsoft OLE DB Provide fo Sql Server”,然后在“连接”标签页选择填写服务器、数据库、登陆方式等信息,最后按“确定”。连接完成之后,将其用写字板打开,第三行信息,如“Provider=SQLOLEDB.1;Integrated Security=SSPI;Persist Security Info=False;Initial Catalog=RuleDB_Data;Data Source=PYE”即为连接字符串。注意,若数据库位于本机,在选择填写服务器一栏可直接填写(local),记得一定要加括号。

4.连接数据库

     在这里引入一个编写好的封装类:ADOConn。该类封装了连接数据库,对数据库进行添加、删除、修改操作及获取查询记录集操作的方法。用户可直接使用,这个类的头文件和cpp文件内容将在本文最后给出。

    在一个工程里加入该类的方法为:把该类的头文件和cpp文件拷贝到工程所在的文件夹里。 然后在工程的工作区选择Project->Add to Project->Files,将这两个文件选择加入。

     之后,就可以在程序里应用这个类了。

    首先在要用到数据库的类的头文件里设一个该类的对象,即加入代码:ADOConn m_Ado;注意:记得要先在最前面加入#include "ADOConn.h"。

    在应用这个对象对数据库进行操作之前,先对其初始化: m_Ado.OnInitADOConn(strConnect);其中strConnect即为上面获取的连接字符串。

    若要获取数据库中的部分记录集,用m_Ado.GetRecordSet(strSql);其中strSql中存放查询语句,查询结果存放于m_Ado.m_pRecordset中,然后可用GetCollect()函数挨个获取所有符合条件的记录的各个字段的值。用完后记得用m_Ado.m_pRecordset.Close()关闭记录集。

   添加、修改、删除操作,均用 m_Ado.ExecuteSQL(strSql);语句完成。

   此外,若同时需要多种记录集,则还需在要用到数据库的类的头文件里添加记录集的对象,即_RecordsetPtr m_pRecordset; m_pRecordset在用之前也需初始化,初始化语句为: m_pRecordset.CreateInstance(__uuidof(Recordset));,同样的,每回记录集用完之后也得用Close()函数关闭。

5.若在数据库应用程序编译时遇到102个错误,则可把Debug文件夹删了重新编译即可。

ADOConn类的头文件:

#if !defined(AFX_ADOCONN_H__2B491720_FA04_4800_B616_219E55ABEA46__INCLUDED_)
#define AFX_ADOCONN_H__2B491720_FA04_4800_B616_219E55ABEA46__INCLUDED_

#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000

class ADOConn : public CObject
{
public:
 //添加一个指向Connection对象的指针:
 _ConnectionPtr m_pConnection;
 //添加一个指向Recordset对象的指针:
 _RecordsetPtr m_pRecordset;
 char error[1024];
public:
 _ConnectionPtr& GetConnPtr()    {return m_pConnection;}
 _RecordsetPtr& GetRecoPtr()     {return m_pRecordset;}
public:
 //事务回滚
 BOOL RollbackTrans();
 //递交 事务
 BOOL CommitTrans();
 //事务开始
 BOOL BeginTrans();
 BOOL adoBOF();//头
 BOOL adoEOF();//尾
 BOOL MoveNext();//下一个
 BOOL CloseTable();//关闭表
 BOOL CloseADOConnection();//关闭连接
 BOOL GetCollect(LPCTSTR Name,CString &lpDest);//获取某个字段的值
 //执行SQL语句 包含update delete insert
 BOOL ExecuteSQL(LPCTSTR lpszSQL);
 //初始化连接数据库
 BOOL OnInitADOConn(LPCTSTR ConnStr);
 // 执行select语句 获取记录集
 _RecordsetPtr& GetRecordSet(LPCTSTR lpszSQL);
 ADOConn();
 virtual ~ADOConn();

};

#endif // !defined(AFX_ADOCONN_H__2B491720_FA04_4800_B616_219E55ABEA46__INCLUDED_)

class CADOException : public CException 
{
public:
 // Constructor
 CADOException(char* pchMessage);
 
public:
 ~CADOException() {}
 CString m_strMessage;
 virtual BOOL GetErrorMessage(LPTSTR lpstrError, UINT nMaxError,
  PUINT pnHelpContext = NULL);
private:
 int m_nError;
 
};

======================

ADOConn类的cpp文件:

#include "stdafx.h"
#include "ADOConn.h"

#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif

//
// Construction/Destruction
//

ADOConn::ADOConn()
{
 memset(error,0,1024);
 
}

ADOConn::~ADOConn()
{

}

//
// CADOException Class
//

//
// Construction/Destruction
//

CADOException::CADOException(char* pchMessage)
{
 m_strMessage = pchMessage;
 m_nError = GetLastError();
}
BOOL CADOException::GetErrorMessage(LPTSTR lpstrError, UINT nMaxError,PUINT pnHelpContext /*= NULL*/)
{
 
 char text[200];
 if(m_nError == 0)
 {
  wsprintf(text, "%s error", (const char*) m_strMessage);
 }
 else
 {
  wsprintf(text, "%s error #%d", (const char*) m_strMessage, m_nError);
 }
 strncpy(lpstrError, text, nMaxError - 1);
 return TRUE;
}

BOOL ADOConn::OnInitADOConn(LPCTSTR ConnStr)
{
 ::CoInitialize(NULL);
 
 try
 {
  // 创建Connection对象
  m_pConnection.CreateInstance("ADODB.Connection");
  // 设置连接字符串,必须是BSTR型或者_bstr_t类型
  _bstr_t strConnect = _bstr_t(ConnStr);//"Provider=SQLOLEDB; Server=127.0.0.1;Database=EventLogg; uid=event; pwd=event;";
  m_pConnection->Open(strConnect,"","",adModeUnknown);
  return TRUE;
 }
 // 捕捉异常
 catch(_com_error e)
 {
  // 显示错误信息
  TRACE(e.Description());
//  sprintf(error,"连接数据库失败 请检查连接字符串/r/n当前连接字符串为:%s",ConnStr);
//  throw new CADOException(error);
  throw new CADOException("连接数据库失败");
 }
 
}

//执行SQL语句  包含update delete insert
BOOL ADOConn::ExecuteSQL(LPCTSTR lpszSQL)
{
 // _variant_t RecordsAffected;
 try
 {
  // Connection对象的Execute方法:(_bstr_t CommandText,
  // VARIANT * RecordsAffected, long Options )
  // 其中CommandText是命令字串,通常是SQL命令。
  // 参数RecordsAffected是操作完成后所影响的行数,
  // 参数Options表示CommandText的类型:adCmdText-文本命令;adCmdTable-表名
  // adCmdProc-存储过程;adCmdUnknown-未知
  m_pConnection->Execute(_bstr_t(lpszSQL),NULL,adCmdText);
  return true;
 }
 catch(_com_error e)
 {
  TRACE(e.Description());
//  sprintf(error,"/t执行SQL语句失败/r/n SQL语句为:%s",lpszSQL);
//  throw new CADOException(error);
  throw new CADOException("执行SQL语句失败");
 }
 
}
//执行SELECT语句,获得结果集,结果集放在m_pRecordset中
_RecordsetPtr& ADOConn::GetRecordSet(LPCTSTR lpszSQL)
{
 try
 {
  // 创建记录集对象
  m_pRecordset.CreateInstance(__uuidof(Recordset));
  // 取得表中的记录
  m_pRecordset->Open(_bstr_t(lpszSQL),m_pConnection.GetInterfacePtr(),adOpenDynamic,adLockOptimistic,adCmdText);
 }
 // 捕捉异常
 catch(_com_error e)
 {
  // 显示错误信息
  TRACE(e.Description());
//  sprintf(error,"/t执行SELECT语句失败/r/nSELECT语句为:%s",lpszSQL);
//  throw new CADOException(error);
  throw new  CADOException("执行SELECT语句失败");
 }
 // 返回记录集
 return m_pRecordset;
}

//获取某个字段的值
BOOL ADOConn::GetCollect(LPCTSTR Name,CString &lpDest)
{
 VARIANT  vt;
 try
 {
  vt = m_pRecordset->GetCollect(Name);
 /* _bstr_t bstr = (_bstr_t)vt;
  if(lpDest != "")
  {
   strcpy(lpDest,bstr);
  }*/
  if(vt.vt!=VT_NULL)
   lpDest=(LPCSTR)_bstr_t(vt);
  else
   lpDest="";
  

 }
 catch (_com_error e)
 {
  TRACE(e.Description());
  sprintf(error,"获取字段:%s值失败",Name);
  throw new CADOException(error);
 }
 return TRUE;
}
//关闭数据库
BOOL ADOConn::CloseADOConnection()
{
 try
 {
  m_pConnection->Close();
 }
 catch (_com_error e)
 {
  TRACE(e.Description());
  sprintf(error,e.Description());
  throw new CADOException("关闭数据库失败");
 }
 return TRUE;
}
//关表
BOOL ADOConn::CloseTable()
{
 try
 {
  m_pRecordset->Close();
 }
 catch (_com_error e)
 {
  TRACE(e.Description());
  sprintf(error,e.Description());
  throw new CADOException("关闭表失败");
 }
 return TRUE;
}
//下一个
BOOL ADOConn::MoveNext()
{
 try
 {
  m_pRecordset->MoveNext();
 }
 catch (_com_error e)
 {
  TRACE(e.Description());
  sprintf(error,e.Description());
  throw new CADOException("结果集移向下一个失败");
 }
 return TRUE;
}
//尾
BOOL ADOConn::adoEOF()
{
 return m_pRecordset->adoEOF;
}
//头
BOOL ADOConn::adoBOF()
{
 return m_pRecordset->BOF;
}
//事务开始
BOOL ADOConn::BeginTrans()
{
 try
 {
  m_pConnection->BeginTrans();
 }
 catch (_com_error e)
 {
  TRACE(e.Description());
  sprintf(error,e.Description());
  throw new CADOException("事务开始失败");
 } 
 return TRUE;
}
//递交事务
BOOL ADOConn::CommitTrans()
{
 try
 {
  m_pConnection->CommitTrans();
 }
 catch (_com_error e)
 {
  TRACE(e.Description());
  sprintf(error,e.Description());
  throw new CADOException("递交事务失败");
 }
 return TRUE;
}
//事务回滚
BOOL ADOConn::RollbackTrans()
{
 try
 {
  m_pConnection->RollbackTrans();
 }
 catch (_com_error e)
 {
  TRACE(e.Description());
  sprintf(error,e.Description());
  throw new CADOException("回滚事务失败");
 }
 return TRUE;
}


http://www.ppmy.cn/news/356681.html

相关文章

精通python100天——第八天:集合

在学习了列表和元组之后,我们再来学习一种容器型的数据类型,它的名字叫集合(set)。说到集合这个词大家一定不会陌生,在数学课本上就有这个概念。通常我们对集合的定义是“把一定范围的、确定的、可以区别的事物当作一个…

NAR:gcMeta——全球微生物组数据存储和标准化分析平台

文章目录 gcMeta全球微生物组数据存储和标准分析平台导读摘要正文图1.用户数据管理、分析及发布流程图2.数据库结构表1.平台内置工具图3.用户界面展示图4.gcMeta的工作流程图5.数据分析及可视化系统图6.系统结构 中科院微生物所新闻稿Reference猜你喜欢写在后面 gcMeta全球微生…

POJ 1694

不会做不会做。。。 看别人的报告都看不懂,这下囧了。 http://blog.csdn.net/lijiecsu/article/details/7440108 http://blog.csdn.net/guomei/article/details/6630264 http://maybeiloveu.iteye.com/blog/522238 贴几个网址,过些天卷土重来。

fastJson的toJSONString解读

fastJson的toJSONString解读 先从一个小问题上我们抛砖引玉一下 首先我们先做准备工作 我们声明一个bean public class YunmiStoreStr {public String gome; ​public YunmiStoreStr(String gome) {this.gome gome;} ​ } 这时我们尝试使用toJSONString打印出来我们的json信…

媒体查询@media

media可以针对不同的媒体类型(包括显示器、便携设备、电视机,等等)设置不同的样式规则,CSS3 根据设置自适应显示。 1.使用方法: media 多媒体类型 and (条件) and (条件)... ①多媒体类型: all用于所有多媒体类型设备 print用于打印机 screen用于电脑…

@media媒体查询

media媒体查询 媒体查询(media Query)是CSS3新语法 使用 media 查询,可以针对不同的媒体类型定义不同的样式media 可以针对不同的屏幕尺寸设置不同的样式当你重置浏览器大小的过程中,页面也会根据浏览器的宽度和高度出行渲染页面目…

MEC架构

文章目录 MEC架构MEC参考架构MEC host:MEC platformMEC applicationMEC 系统级管理Multi-access edge orchestratorOperations Support System (OSS)User application lifecycle management proxy MEC主机级管理MEC platform managerVirtualisation infrastructure …