VC++6.0下使用ADO技术访问SQL 数据库(一、ADO类和数据库表类的建立)
关键词: ADO,SQL*********************************************************************************************
1. ADOConn功能类的引入
*********************************************************************************************
// ADOConn.h: interface for the ADOConn class.
//
//
#import "c:\Program Files\Common Files\System\ado\msado15.dll" no_namespace rename("EOF","adoEOF") rename("BOF","adoBOF")
#if !defined(AFX_ADOCONN_H__20D9D06A_E099_4B1C_99DD_5B1F11B3A313__INCLUDED_)
#define AFX_ADOCONN_H__20D9D06A_E099_4B1C_99DD_5B1F11B3A313__INCLUDED_
#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000
class ADOConn
{
public:
_ConnectionPtr m_pConnection;
_RecordsetPtr m_pRecordset;
public:
ADOConn();
virtual ~ADOConn();
void OnInitADOConn();
_RecordsetPtr& GetRecordSet(_bstr_t bstrSQL);
BOOL ExecuteSQL(_bstr_t bstrSQL);
void ExitConnect();
};
#endif // !defined(AFX_ADOCONN_H__20D9D06A_E099_4B1C_99DD_5B1F11B3A313__INCLUDED_)
--------------------------------------------------------------------------------------------
// ADOConn.cpp: implementation of the ADOConn class.
//数据库连接、读记录及断开操作
//
#include "stdafx.h"
#include "CheckMan.h"
#include "ADOConn.h"
#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif
//
// Construction/Destruction
//
ADOConn::ADOConn()
{
}
ADOConn::~ADOConn()
{
}
//初始化——连接数据库
void ADOConn::OnInitADOConn()
{
// 初始化OLE/COM库环境
::CoInitialize(NULL);
try
{
// 创建Connection对象
m_pConnection.CreateInstance("ADODB.Connection");
// 设置连接字符串,必须是BSTR型或者_bstr_t类型
_bstr_t strConnect = "Provider=SQLOLEDB;Server=127.0.0.1;Database=basename;uid=sa;pwd=pwd;";
m_pConnection->Open(strConnect,"","",adModeUnknown);
}
// 捕捉异常
catch(_com_error e)
{
AfxMessageBox("数据库连接失败,请开启数据库服务!");
PostQuitMessage(0);
//AfxMessageBox(e.Description());
}
}
// 执行查询
_RecordsetPtr& ADOConn::GetRecordSet(_bstr_t bstrSQL)
{
try
{
// 连接数据库,如果Connection对象为空,则重新连接数据库
if(m_pConnection==NULL)
OnInitADOConn();
// 创建记录集对象
m_pRecordset.CreateInstance(__uuidof(Recordset));
// 取得表中的记录
m_pRecordset->Open(bstrSQL,m_pConnection.GetInterfacePtr(),adOpenDynamic,adLockOptimistic,adCmdText);
}
// 捕捉异常
catch(_com_error e)
{
AfxMessageBox("数据库记录读取失败!");
PostQuitMessage(0);
// 显示错误信息
//AfxMessageBox(e.Description());
}
// 返回记录集
return m_pRecordset;
}
// 执行SQL语句,Insert Update _variant_t
BOOL ADOConn::ExecuteSQL(_bstr_t bstrSQL)
{
try
{
// 是否已经连接数据库
if(m_pConnection==NULL)
OnInitADOConn();
// Connection对象的Execute方法:(_bstr_t CommandText,
// VARIANT * RecordsAffected, long Options )
// 其中CommandText是命令字串,通常是SQL命令。
// 参数RecordsAffected是操作完成后所影响的行数,
// 参数Options表示CommandText的类型:adCmdText-文本命令;adCmdTable-表名
// adCmdProc-存储过程;adCmdUnknown-未知
m_pConnection->Execute(bstrSQL,NULL,adCmdText);
return true;
}
catch(_com_error e)
{
AfxMessageBox("数据库SQL语句执行失败!");
PostQuitMessage(0);
//AfxMessageBox(e.Description());
return false;
}
}
void ADOConn::ExitConnect()
{
// 关闭记录集和连接
if(m_pRecordset!=NULL)
m_pRecordset->Close();
m_pConnection->Close();
// 释放环境
::CoUninitialize();
}
*********************************************************************************************
2. 建立数据库中表对应的表类,将表中的各个要操作的列都以变量的形式在类中再现,注意要保证对应的数据结构相通,例如SQL server中的 char n 类型对应VC++中的CString类型等。然后建立要操作的功能对应的功能函数,如sql_select(),sql_insert() 等等。
*********************************************************************************************
--------------------------------------------------------------------------------------------
2.1 INSERT 插入
--------------------------------------------------------------------------------------------
void Ctable::sql_insert()
{
ADOConn m_AdoConn;
m_AdoConn.OnInitADOConn();
_bstr_t vSQL;
//将各非字符串的数据转换为字符串
CString str_vlong,str_vint,str_vfloat;
str_tjxh.Format("%ld",tjxh);
str_yetl.Format("%d",yetl);
str_jzsly.Format("%f",jzsly);
//插入信息
vSQL="INSERT INTO table(lint,llong,lfloat,lstring,lchar)VALUES ("+vint+","+vlong+","+vfloat+",'"+vstring+"','"+vchar+"')"; //attention! 字符串的书写,见后面说明
m_AdoConn.ExecuteSQL(vSQL);
m_AdoConn.ExitConnect();
MessageBox(NULL,"保存体检信息成功!" , "提示", 0);
}
--------------------------------------------------------------------------------------------
2.2 SELECT查询
--------------------------------------------------------------------------------------------
void Ctable::sql_select(CString str)
{
ADOConn m_AdoConn;
m_AdoConn.OnInitADOConn();
_bstr_t vSQL;
vSQL = "SELECT * FROM table WHERE list="+str; //不用对str加''
_RecordsetPtr m_pRecordset;
m_pRecordset=m_AdoConn.GetRecordSet(vSQL);
if(m_pRecordset->adoEOF==1)
AfxMessageBox("无法找到该数据记录!" );
else
{
vint=atoi((_bstr_t)m_pRecordset->GetCollect("lint")); //int 型读取
tjxh=atol((_bstr_t)m_pRecordset->GetCollect("tjxh")); //long 型读取
lysly=atof((_bstr_t)m_pRecordset->GetCollect("yk_lysly"));// float 型读取
ch=*(char*)((_bstr_t)m_pRecordset->GetCollect("ch")); //char 读取
str=(LPCTSTR)(_bstr_t)m_pRecordset->GetCollect("str"); //char n,varchar n,string 的读取
}
m_AdoConn.ExitConnect();
}
--------------------------------------------------------------------------------------------
2.3 UPDATE 更新
--------------------------------------------------------------------------------------------
void Ctable::sql_update()
{
ADOConn m_AdoConn;
m_AdoConn.OnInitADOConn();
_bstr_t vSQL;
//将各非字符串的数据转换为字符串
CString str_vlong,str_vint,str_vfloat;
str_vlong.Format("%ld",vlong);
str_vint.Format("%d",vint);
str_vfloat.Format("%f",vfloat);
//更新数据,注意第一个加号不可以是char
vSQL= "UPDATE table SET lstring='"+vstring+"',lchar ='" +vchar+"',lint=" +str_vint+ ","lfloat=" +str_vfloat+ "WHERE list='" +list+ "' ";
m_AdoConn.ExecuteSQL(vSQL);
m_AdoConn.ExitConnect();
MessageBox(NULL,"更新记录成功!" , "提示", 0);
}
--------------------------------------------------------------------------------------------
2.4 DELETE 删除
--------------------------------------------------------------------------------------------
void Ctable::sql_delete(CString str)
{
//连接数据库
ADOConn m_AdoConn;
m_AdoConn.OnInitADOConn();
_bstr_t vSQL;
//设置DELETE语句
vSQL = "DELETE FROM hit3D WHERE list='"+str+"' ";
//执行DELETE语句
m_AdoConn.ExecuteSQL(vSQL);
//断开与数据库的连接
m_AdoConn.ExitConnect();
}