转至繁体中文版     | 网站首页 | 图文教程 | 资源下载 | 站长博客 | 图片素材 | 武汉seo | 武汉网站优化 | 
最新公告:     敏韬网|教学资源学习资料永久免费分享站!  [mintao  2008年9月2日]        
您现在的位置: 学习笔记 >> 图文教程 >> 站长学院 >> Web开发 >> 正文
vc使用ADO操作数据库总结         ★★★★

vc使用ADO操作数据库总结

作者:闵涛 文章来源:闵涛的学习笔记 点击数:1539 更新时间:2009/4/23 10:41:35

一 关于初始化ADODB

    需要在InitInstance()中首先调用AfxOleInit()对OLE进行初始化,之后要导入
c:\program files\common files\system\ado\msado15.dll,经过以上几步操作,接下来可以通过调用_ConnectionPtr和_RecordsetPtr来建立连接对象与记录集对象。为了简化编程,我封装了一个很简单的类库CDB,实现了对_ConnectionPtr的简单调用。

// DB.h: interface for the CDB class.
//
//////////////////////////////////////////////////////////////////////

#if !defined(__DB_H__)
#define __DB_H__

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

#import "c:\program files\common files\system\ado\msado15.dll" no_namespace \
rename("EOF", "adoEOF") \
rename("LockTypeEnum", "adoLockTypeEnum") \
rename("DataTypeEnum", "adoDataTypeEnum")
#include "icrsint.h"
inline void TESTHR(HRESULT x) { if FAILED(x) _com_issue_error(x); }
inline BOOL IS_VT_NULL(unsigned short x) { return (x == VT_NULL ? TRUE : FALSE); }

class CDB
{
public:
 CDB();
 virtual ~CDB();
 _RecordsetPtr Exec(CString& strSql);
 void Close();

private:
 _ConnectionPtr m_Conn;
};

class CSecUtil
{
public:
 static CString StrReplace(LPTSTR lpszString, LPTSTR lpszKey, LPTSTR lpszReplace);
 static BOOL    StrCheck(LPCTSTR);
};


#endif // !defined(__DB_H__)

 

// DB.cpp: implementation of the CDB class.
//
//////////////////////////////////////////////////////////////////////

#include "stdafx.h"
#include "DB.h"

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

//////////////////////////////////////////////////////////////////////
// CDB  Construction/Destruction
//////////////////////////////////////////////////////////////////////

CDB::CDB()
{
 try
    {
        m_Conn.CreateInstance(__uuidof(Connection));
//  _bstr_t connstr = "driver={SQL Server};Server=127.0.0.1;DATABASE=;UID=;PWD="; // 针对mssql
  _bstr_t connstr = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=;user id=admin;jet oledb:database password="; // 针对ACCESS
 }
 catch(_com_error& e)
 {
  AfxMessageBox(e.Description());
 }
}

CDB::~CDB()
{
 if(m_Conn->State)
 {
  m_Conn->Close();
 }
}

_RecordsetPtr CDB::Exec(CString& strSql)
{
 _RecordsetPtr rs;
 try
 {
  rs = m_Conn->Execute((_bstr_t)strSql, NULL, adCmdText);
 }
 catch(_com_error& e)
 {
  AfxMessageBox(e.Description());
 }

 return rs;
}

void CDB::Close()
{
 if(m_Conn->State)
 {
  m_Conn->Close();
 }
}

使用时先按需要填充connstr,之后可以使用

CDB db;

建立一个对象,调用db.Exec来执行sql语句,其内部通过调用连接对象的Execute()方法来实现,Exec()方法调用后返回一个_RecordsetPtr的对象。调用db.close()关闭数据库。

 

二 类型转换
    成功执行一次SELECT操作后从数据库中取出的记录保存在由_RecordsetPtr所定义的记录集对象中,通过调用GetCollect方法,可以将记录取出,如:
CDB db;
_RecordsetPtr rs;
CString strSql;
strSql = "SELECT id, user FROM logon";
rs = db.Exec(strSql);
if(rs->EOF)
    ...
else
    rs->GetCollect("id");

然而调用GetCollect()返回的类型为_variant_t(相关介绍见MSDN),需要将其转化成控件所支持得类型才能显示,当然这些数据的原始类型是由数据库字段的定义类型,可以通过判断结构中的vt这个变量来取出当前的数据类型。这个变量返回一个VARTYPE类型的值(见表1)。
以下列出的是针对ACCESS的字段类型的转换,MSSQL与ACCESS的字段类型相类似,大部分可以按照下面的方法对类型进行转换。

数字:rs->GetCollect("id").intVal;
BYTE:rs->GetCollect("id").bVal;
文本/备注/时间:(char*)(_bstr_t)(rs->GetCollect("user")

这里要注意,对于数字类型,需要判断有无符号的情况。下面是VARIANT结构对于数据类型的定义。注释后面的为VARTYPE枚举类型。对于特定类型的转换可以通过查表1来进行操作,对于VARTYPE类型的定型可以以VARENUM为关键字在MSDN中搜索(我使用的是MSDN 2003 April)。
      LONGLONG                llval;             // VT_I8.
      LONG                    lVal;              // VT_I4.
      BYTE                    bVal;              // VT_UI1.
      SHORT                   iVal;              // VT_I2.
      FLOAT                   fltVal;            // VT_R4.
      DOUBLE                  dblVal;            // VT_R8.
      VARIANT_BOOL            boolVal;           // VT_BOOL.
      _VARIANT_BOOL           bool;
      SCODE                   scode;             // VT_ERROR.
      CY                      cyVal;             // VT_CY.
      DATE                    date;              // VT_DATE.
      BSTR                    bstrVal;           // VT_BSTR.
      IUnknown                * punkVal;         // VT_UNKNOWN.
      IDispatch               * pdispVal;        // VT_DISPATCH.
      SAFEARRAY               * parray;          // VT_ARRAY|*.
      BYTE                    * pbVal;           // VT_BYREF|VT_UI1.
      SHORT                   * piVal;           // VT_BYREF|VT_I2.
      LONG                    * plVal;           // VT_BYREF|VT_I4.
      LONGLONG                * pllVal;          // VT_BYREF|VT_I8.
      FLOAT                   * pfltVal;         // VT_BYREF|VT_R4.
      DOUBLE    &nbs

[1] [2]  下一页


没有相关教程
教程录入:mintao    责任编辑:mintao 
  • 上一篇教程:

  • 下一篇教程:
  • 【字体: 】【发表评论】【加入收藏】【告诉好友】【打印此文】【关闭窗口
      注:本站部分文章源于互联网,版权归原作者所有!如有侵权,请原作者与本站联系,本站将立即删除! 本站文章除特别注明外均可转载,但需注明出处! [MinTao学以致用网]
      网友评论:(只显示最新10条。评论内容只代表网友观点,与本站立场无关!)

    同类栏目
    · Web开发  · 网页制作
    · 平面设计  · 网站运营
    · 网站推广  · 搜索优化
    · 建站心得  · 站长故事
    · 互联动态
    更多内容
    热门推荐 更多内容
  • 没有教程
  • 赞助链接
    更多内容
    闵涛博文 更多关于武汉SEO的内容
    500 - 内部服务器错误。

    500 - 内部服务器错误。

    您查找的资源存在问题,因而无法显示。

    | 设为首页 |加入收藏 | 联系站长 | 友情链接 | 版权申明 | 广告服务
    MinTao学以致用网

    Copyright @ 2007-2012 敏韬网(敏而好学,文韬武略--MinTao.Net)(学习笔记) Inc All Rights Reserved.
    闵涛 投放广告、内容合作请Q我! E_mail:admin@mintao.net(欢迎提供学习资源)

    站长:MinTao ICP备案号:鄂ICP备11006601号-18

    闵涛站盟:医药大全-武穴网A打造BCD……
    咸宁网络警察报警平台