ADO 访问数据库 存取image类型字段数据 源代码

 ADO类头文件代码:


#if !defined(AFX_ADO_ADO_H__9F3BD0B1_A877_4B35_9DCE_E73E49EFE0C5__INCLUDED_)
#define AFX_ADO_ADO_H__9F3BD0B1_A877_4B35_9DCE_E73E49EFE0C5__INCLUDED_

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

class ADO_ado 
{
public:
 _ConnectionPtr m_pConnection;//连接对象指针
 _RecordsetPtr m_pRecordset;//记录集对象指针
public:
 ADO_ado();
 virtual ~ADO_ado();
 void OnInitADOConn();//连接数据库
 _RecordsetPtr& OpenRecordset(CString sql);//打开记录集
 void CloseRecordset();//关闭记录集
 void CloseConn();//关闭数据库连接
 UINT GetRecordCount(_RecordsetPtr pRecordset);//获得记录数
};

#endif

 

ADO类函数实现文件代码:


#include "stdafx.h"
//#include "Ado.h"
#include "ADO_ado.h"

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

//
// Construction/Destruction
//

ADO_ado::ADO_ado()
{

}

ADO_ado::~ADO_ado()
{

}
void ADO_ado::OnInitADOConn()
{
 ::CoInitialize(NULL);//AfxOleInit();初始化COM库
 /*//"Provider=SQLOLEDB;Persist Security Info=False;UID=sa;PWD=;
 //Initial Catalog=text;Data Source=LENOVO/SIMPLE;"
 ----- ADO连接SQL Server的数据库连接字符串模板 ----------
[1]身份验证模式为:"sql server和windows"
 "Provider=SQLOLEDB.1;Persist Security Info=True;User ID=用户名;Password=密码;
  Initial Catalog=数据库名;Data Source=SQL服务器名"
[2]身份验证模式为:"仅windows"
 "Provider=SQLOLEDB.1;Integrated Security=SSPI;Persist Security Info=False;
  Initial Catalog=数据库名;Data Source=SQL服务器名"
 "DSN=;UID=sa;PWD=;SERVER=NTSERVER;Provider=SQLOLEDB;database=text"*/
 try
 {
  m_pConnection.CreateInstance("ADODB.Connection");//创建连接对象实例
  _bstr_t strConnect="Provider=SQLOLEDB.1;Persist Security Info=True;User ID=sa;Password= ;Initial Catalog=DSCDTSDB;Data Source=192.168.0.125";
  m_pConnection->Open(strConnect,"","",adModeUnknown);//打开数据库
 }
 catch(_com_error e)
 {
  AfxMessageBox(e.Description());//弹出错误
 }
}
_RecordsetPtr& ADO_ado::OpenRecordset(CString sql)
{
 ASSERT(!sql.IsEmpty());//sql语句不能为空
 try
 {
  m_pRecordset.CreateInstance(__uuidof(Recordset));//创建记录集对象实例
  m_pRecordset->Open(_bstr_t(sql),m_pConnection.GetInterfacePtr(),
   adOpenDynamic,adLockOptimistic,adCmdText);//执行sql得到记录集
 }
 catch(_com_error e)
 {
  AfxMessageBox(e.Description());
 }
 return m_pRecordset;//返回记录集指针
}
void ADO_ado::CloseRecordset()
{
 if(m_pRecordset->GetState()==adStateOpen)//判断当前的记录集状态
  m_pRecordset->Close();     //关闭记录集
}
void ADO_ado::CloseConn()
{
 m_pConnection->Close();//关闭数据库连接
 ::CoUninitialize();//m_pConnection->Release(); //::CoUninitialize();//释放com环境
}
UINT ADO_ado::GetRecordCount(_RecordsetPtr pRecordset)
{
 int nCount=0;//声明保存记录数的变量
 try
 {
  pRecordset->MoveFirst();//将记录集指针移动到第一条记录
 }
 catch(...)     //捕捉可能出现的错误
 {
  return 0;
 }
 if(pRecordset->adoEOF)
  return 0;
 while(!pRecordset->adoEOF)
 {
  pRecordset->MoveNext();
  nCount++;
 }
 pRecordset->MoveFirst();
 return nCount;  //返回记录数
}

 

 

 

ado类对象定义

ADO_ado m_ADO_dscdtb;

 

读取数据库代码:

m_ADO_dscdtb.OnInitADOConn();
 CTime tnow = CTime::GetCurrentTime();
 CString strCurrDay = tnow.Format("%Y-%m-%d");
 CString strSql;
 strSql.Format("select * from DSCDataTB where 存储日期='%s' order by 存储时间",strCurrDay);
 m_ADO_dscdtb.m_pRecordset=m_ADO_dscdtb.OpenRecordset(strSql);
 //char wendushuju[5120]={0};
 char *m_pBMPBuffer = NULL;
 _variant_t pvList ;
 long lDataSize;
 while(!m_ADO_dscdtb.m_pRecordset->adoEOF)
 {
  CString guangxianno = (char*)(_bstr_t)m_ADO_dscdtb.m_pRecordset->GetCollect("存储时间");
  lDataSize = m_ADO_dscdtb.m_pRecordset->GetFields()->GetItem(_variant_t("温度数据"))->ActualSize;
  if(lDataSize>0)
  {
   _variant_t varBLOB;
   varBLOB=m_ADO_dscdtb.m_pRecordset->GetFields()->GetItem(_variant_t("温度数据"))->GetChunk(lDataSize);
   if(varBLOB.vt == (VT_ARRAY | VT_UI1))   
   {
    m_pBMPBuffer = new char[lDataSize+1];
    char *pBuf = NULL;
    SafeArrayAccessData(varBLOB.parray,(void **)&pBuf);   
    memcpy(m_pBMPBuffer,pBuf,lDataSize);                  
    SafeArrayUnaccessData (varBLOB.parray);
   }
  }
  m_ADO_dscdtb.m_pRecordset->MoveNext();
 }

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值