?? adoconn.cpp
字號:
// ADOConn.cpp: implementation of the ADOConn class.
//
//////////////////////////////////////////////////////////////////////
#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()
{
OnInitADOConn();
}
ADOConn::~ADOConn()
{
}
// 初始化—連接數據庫
void ADOConn::OnInitADOConn()
{
// 初始化OLE/COM庫環境
::CoInitialize(NULL);
try
{
// 創建Connection對象
m_pConnection.CreateInstance("ADODB.Connection");
TCHAR szFilePath[MAX_PATH + 1];
GetModuleFileName(NULL, szFilePath, MAX_PATH);
(_tcsrchr(szFilePath, _T('\\')))[1] = 0;//刪除文件名,只獲得路徑。
CString dbpath= szFilePath;
// 設置連接字符串,必須是BSTR型或者_bstr_t類型
_bstr_t strConnect = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source="+dbpath+"data\\姚亞通訊錄.mdb";
//SQL Server:strConnect ="Provider=SQLOLEDB;Server=HAPPY-MMNL94O2E\OPENSURF;Database=HR;uid=HAPPY-MMNL94O2E\Administrator;pwd=jj";
m_pConnection->Open(strConnect,"","",adModeUnknown);
}
// 捕捉異常
catch(_com_error e)
{
// 顯示錯誤信息
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(e.Description());
}
// 返回記錄集
return m_pRecordset;
}
// 執行SQL語句,Insert Update _variant_t
BOOL ADOConn::ExecuteSQL(_bstr_t bstrSQL)
{
// _variant_t RecordsAffected;
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(e.Description());
return false;
}
}
void ADOConn::ExitConnect()
{
// 關閉記錄集和連接
if (m_pRecordset != NULL)
m_pRecordset->Close();
m_pConnection->Close();
// 釋放環境
::CoUninitialize();
}
File ADOConn::GetFile()
{
File af;
af.len=0;
af.m_pBuffer=NULL;
static char BASED_CODE szFilter[] = "BMP Files (*.bmp)|*.bmp|All Files (*.*)|*.*||";
CFileDialog dlg(TRUE,"BMP",NULL, OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT,szFilter);
if(dlg.DoModal() != IDOK)
return af;
CString pathname = dlg.GetPathName();
//從BMP文件中讀取的數據存放在此變量中
//@@@@@@@@@@ 讀取BMP文件到m_pBuffer @@@@@@@@@@
CFile file; //定義文件對象
if( !file.Open(pathname, CFile::modeRead)) //以只讀方式打開文件
{
AfxMessageBox("無法打開BMP文件");
return af;
}
DWORD m_filelen; //用于保存文件長度
m_filelen = file.GetLength(); //讀取文件長度
af.len=m_filelen;
af.m_pBuffer = new char[m_filelen + 1]; //根據文件長度分配數組空間
if(!af.m_pBuffer) //如果不空間不足則返回
{
AfxMessageBox("無法分配足夠的內存空間");
return af;
}
if(file.ReadHuge(af.m_pBuffer, m_filelen) != m_filelen) //讀取BMP文件到m_pBuffer中
{
AfxMessageBox("讀取文件時出現錯誤");
return af;
}
return af;
}
void ADOConn::CharToData(File &af,CString sql,CString Name)
{
//@@@@@@@@@@@ 將圖像數據保存到數據庫中 @@@@@@@@@@@@@
OnInitADOConn();
//連接數據庫
OnInitADOConn();
//設置SELECT語句
//執行SELETE語句
_RecordsetPtr m_pRs;
m_pRs =GetRecordSet(_bstr_t(sql));
VARIANT varBLOB;
SAFEARRAY *psa; //定義數組
SAFEARRAYBOUND rgsabound[1];
rgsabound[0].lLbound = 0;
int flen=af.len;
rgsabound[0].cElements =flen;
psa = SafeArrayCreate(VT_UI1, 1, rgsabound);//創建數組
for (long i = 0; i < (long)flen; i++) //將m_pBuffer中的圖像數據寫入數組psa
SafeArrayPutElement (psa, &i, af.m_pBuffer++);
varBLOB.vt = VT_ARRAY | VT_UI1;
varBLOB.parray = psa;
//調用AppendChunk()函數將圖像數據寫入Photo字段
m_pRs->GetFields()->GetItem((LPCSTR)Name)->AppendChunk(varBLOB);
//更新數據庫
m_pRs->Update();
//斷開與數據庫的連接
ExitConnect();
}
char* ADOConn::GetFileFromData(CString sql, CString name)
{
//執行SELETE語句
_RecordsetPtr m_pRs;
m_pRs =GetRecordSet(_bstr_t(sql));
//如果不存在此記錄,則將設置按鈕置灰并返回
if(m_pRs->adoEOF || m_pRs->adoBOF)
{
AfxMessageBox("不存在此記錄");
return FALSE;
}
//讀取圖像字段的實際大小
long lDataSize = m_pRs->GetFields()->GetItem((LPCSTR)name)->ActualSize;
char *m_pBuffer; //定義緩沖變量
if(lDataSize > 0)
{
//從圖像字段中讀取數據到varBLOB中
_variant_t varBLOB;
varBLOB = m_pRs->GetFields()->GetItem((LPCSTR)name)->GetChunk(lDataSize);
if(varBLOB.vt == (VT_ARRAY | VT_UI1))
{
if(m_pBuffer = new char[lDataSize+1]) //分配必要的存儲空間
{
char *pBuf = NULL;
SafeArrayAccessData(varBLOB.parray,(void **)&pBuf);
memcpy(m_pBuffer,pBuf,lDataSize); ///復制數據到緩沖區m_pBuffer
SafeArrayUnaccessData (varBLOB.parray);
}
}
}
return m_pBuffer;
}
HBITMAP ADOConn::CharToHbitmap(char* m_pBuffer,CWnd* pwnd)
{
LPSTR hDIB;
LPVOID lpDIBBits;
HBITMAP m_hBitmap;
BITMAPFILEHEADER bmfHeader; //用于保存BMP文件頭信息,包括類型、大小、位移量等
DWORD bmfHeaderLen; //保存文件頭的長度
bmfHeaderLen = sizeof(bmfHeader); //讀取文件頭的長度
//將m_pBuffer中文件頭復制到bmfHeader中
strncpy((LPSTR)&bmfHeader, (LPSTR)m_pBuffer, bmfHeaderLen);
if (bmfHeader.bfType != (*(WORD*)"BM")) //如果文件類型不對,則返回
{
AfxMessageBox("BMP文件格式不準確");
return NULL;
}
hDIB = m_pBuffer + bmfHeaderLen; //將指針移至文件頭后面
//讀取BMP文件的圖像數據,包括坐標及顏色格式等信息到BITMAPINFOHEADER對象
BITMAPINFOHEADER &bmiHeader = *(LPBITMAPINFOHEADER)hDIB;
//讀取BMP文件的圖像數據,包括坐標及顏色格式等信息到BITMAPINFO對象
BITMAPINFO &bmInfo = *(LPBITMAPINFO)hDIB ;
//根據bfOffBits屬性將指針移至文件頭后
lpDIBBits = (m_pBuffer) + ((BITMAPFILEHEADER *)m_pBuffer)->bfOffBits;
CClientDC dc(pwnd); //生成一個與當前窗口相關的CClientDC,用于管理輸出設置
//生成DIBitmap數據
m_hBitmap = CreateDIBitmap(dc.m_hDC,&bmiHeader,CBM_INIT,lpDIBBits,&bmInfo,DIB_RGB_COLORS);
return m_hBitmap;
}
BOOL ADOConn::IsBMPFile(char *m_pBuffer)
{
BOOL bl=TRUE;
BITMAPFILEHEADER bmfHeader; //用于保存BMP文件頭信息,包括類型、大小、位移量等
DWORD bmfHeaderLen; //保存文件頭的長度
bmfHeaderLen = sizeof(bmfHeader); //讀取文件頭的長度
//將m_pBuffer中文件頭復制到bmfHeader中
strncpy((LPSTR)&bmfHeader, (LPSTR)m_pBuffer, bmfHeaderLen);
if (bmfHeader.bfType != (*(WORD*)"BM")) //如果文件類型不對,則返回
bl=FALSE;
return bl;
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -