⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 adodata.cpp

📁 研华USB数据采集器4711程序.源码
💻 CPP
字号:
 // AdoData.cpp : implementation file
//

#include "stdafx.h"
#include "AdoData.h"

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

/////////////////////////////////////////////////////////////////////////////
// CAdoData

CAdoData::CAdoData()
{

	m_bDataOpened = false;//初始化为 假 表示已开始数据库没有打开
	m_nTableCnts = 0;

	m_strTableName.SetSize(Table_Counts);
	
	CREATEINSTANCE(m_piConnection, Connection);
	CREATEINSTANCE(m_piCommand, Command);
	
	for(int i=0;i<Table_Counts;i++)
	{
		m_bTableOpened[i] = false;
		m_pFieldsType[i] = NULL;
		CREATEINSTANCE(m_piRecordset[i], Recordset);	
	}
	
	CTime time =  CTime::GetCurrentTime();

	CString str;
	CString Database;

	Database = "DRIVER={Microsoft Access Driver (*.mdb)};DBQ=";
	str.Format("E:\\sstar\\%04d-%02d-%02d.mdb",time.GetYear(),time.GetMonth(),time.GetDay());//数据库生成路径

	Database+=str;
	
	OpenDatabase(Database);

}

CAdoData::~CAdoData()
{
	CloseDatabase();
}

BEGIN_MESSAGE_MAP(CAdoData, CWnd)
	//{{AFX_MSG_MAP(CAdoData)
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()

void CAdoData::ChangeVariantType(UINT& type)
{
	switch(type)
	{//转换数据类型定义
	case adVarWChar:
	case adVarChar:
	case adLongVarChar:
		type = (DataTypeEnum)VT_BSTR;
		break;
	case adDBDate:
	case adDBTime:
	case adDBTimeStamp:
		type = (DataTypeEnum)VT_DATE;
		break;
	}
}

void CAdoData::CloseDatabase()
{
	//关闭数据库连接
	if(m_bDataOpened)
	{
		m_piConnection->Close();
		m_bDataOpened = false;
	}
}

void CAdoData::CloseTable(int nTable)
{
	
	if(m_bTableOpened[nTable])
	{
		m_piRecordset[nTable]->Close();
		m_bTableOpened [nTable]= false;
	}
	
	if(m_pFieldsType[nTable])
	{
		delete [] m_pFieldsType[nTable];//删除动态数组
		m_pFieldsType[nTable] = NULL;
	}

	m_nFieldCount[nTable] = 0;
	
}


/////////////////////////////////////////////////////////////////////////////
// CAdoData message handlers

void CAdoData::OpenDatabase(CString FileName)
{
	CString Database;

	m_bDataOpened = false;
	m_nTableCnts = 0;

	Database = "DRIVER={Microsoft Access Driver (*.mdb)};DBQ=";
	Database += FileName;

	try{
		m_piConnection->ConnectionString = _bstr_t(Database);
        m_piConnection->Open( "", "", "", -1 );//change by lf 
		m_bDataOpened = true;
	}
	catch( _com_error &e){
		_bstr_t bstrSource(e.Source());
		_bstr_t bs =  _bstr_t(" Error: ") + _bstr_t(e.Error()) + _bstr_t(" Msg: ") 
			+ _bstr_t(e.ErrorMessage()) + _bstr_t(" Description: ") 
			+ _bstr_t(e.Description());
		m_bDataOpened = false;
		MessageBox(bs, bstrSource);
		return;
	}
	
	GetTablesName();
}

void CAdoData::GetTablesName()
{
	CString cName;
	_RecordsetPtr pRecordset;

	if(!m_bDataOpened)
	{
		AfxMessageBox("必须首先打开数据库文件");
		return;
	}

	pRecordset = m_piConnection->OpenSchema(adSchemaTables);

	while(!pRecordset->EndOfFile) 
	{
		cName = RsITEM_BSTR(pRecordset, "TABLE_TYPE");

		if(cName == "TABLE"){
			cName = RsITEM_BSTR(pRecordset, "TABLE_NAME");
			m_strTableName.SetAt(m_nTableCnts++,cName);
		}
		pRecordset->MoveNext();
	}

	if (m_nTableCnts > Table_Counts) 
	{
		cName.Format("不能打开那么多表,最多只能打开%d个记录集",Table_Counts);
		AfxMessageBox(cName);
		return ;
	}

	OpenTable();

}

void CAdoData::OpenTable()
{
	long lFld=0;
	CString strSelected;
	COleVariant	vNull, vValue, vValue1;

	for(int i=0;i < m_nTableCnts;i++)
	{	
		strSelected.Format("select * from %s",m_strTableName.GetAt(i));	

		try
		{	
			m_piRecordset[i]->Open(_bstr_t(strSelected),
				_variant_t((IDispatch*)m_piConnection,true),
				adOpenDynamic, adLockOptimistic, adCmdText); //打开纪录集
			m_bTableOpened[i] = true;
			m_nFieldCount[i] = m_piRecordset[i]->Fields->GetCount();//获得纪录集总列数
			m_pFieldsType[i] = new UINT[m_nFieldCount[i]];			//申请数组内存空间
			memset(m_pFieldsType[i], 0, m_nFieldCount[i] * sizeof(UINT));
			for (lFld = 0; lFld < m_nFieldCount[i]; lFld++){
				m_pFieldsType[i][lFld] = m_piRecordset[i]->Fields->Item[lFld]->Type;
				ChangeVariantType(m_pFieldsType[i][lFld]);
			}
		}
		catch( _com_error &e){
			m_bTableOpened[i] = false;
			_bstr_t bstrSource(e.Source());
			_bstr_t bs =  _bstr_t(" Error: ") + _bstr_t(e.Error()) + _bstr_t(" Msg: ") 
				+ _bstr_t(e.ErrorMessage()) + _bstr_t(" Description: ") 
				+ _bstr_t(e.Description());
			MessageBox(bs, bstrSource);
			return;
		}
	}

}

void CAdoData::Add(UINT nTable,CString *str)
{
	// TODO: Add your control notification handler code here

	long i=0,lFld=0;
	COleVariant	vValue, vValue1;	

	CFileFind myFile;
	CString FileName;
	CString Database;
	CTime time=CTime::GetCurrentTime();
	
	FileName.Format("E:\\sstar\\%d-%02d-%02d.mdb",time.GetYear(),time.GetMonth(),time.GetDay());

	if(!myFile.FindFile(FileName,0))
	{
		CopyFile("DataBaseDown.mdb",FileName,FALSE);		

		CloseDatabase();
	
		Database = "DRIVER={Microsoft Access Driver (*.mdb)};DBQ=";
		Database += FileName;

		OpenDatabase(Database);
	}

	m_piRecordset[nTable]->AddNew();

	for(i=1; i<m_nFieldCount[nTable]; i++)
	{
		vValue=str[i-1];
		if( m_pFieldsType[nTable][i] != VT_BSTR && VariantChangeType(&vValue1, &vValue, 0, m_pFieldsType[nTable][i]) == S_OK )
			m_piRecordset[nTable]->Fields->Item[i]->Value = vValue1;
		else		//如果是备注类型
			m_piRecordset[nTable]->Fields->Item[i]->Value = vValue;
	}

	try{
	  	m_piRecordset[nTable]->Update();
	}
	catch( _com_error &e){
		m_piRecordset[nTable]->CancelUpdate();
		_bstr_t bstrSource(e.Source());
		_bstr_t bs =  _bstr_t(" Error: ") + _bstr_t(e.Error()) + _bstr_t(" Msg: ") 
			+ _bstr_t(e.ErrorMessage()) + _bstr_t(" Description: ") 
			+ _bstr_t(e.Description());
		MessageBox(bs, bstrSource);
	}
	str = NULL;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -