?? ado.cpp
字號:
?
+
/*########################################################################
Filename: ado.cpp
----------------------------------------------------
Remarks: ...
----------------------------------------------------
Author: 成真
Email: anyou@sina.com
anyou@msn.com
Created: 20/1/2003 19:19
########################################################################*/
#include "stdafx.h"
#include "ADO.h"
#include <math.h>
#include "StdioFileEx.h"
#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif
/*########################################################################
------------------------------------------------
數值類型轉換
------------------------------------------------
########################################################################*/
COleDateTime vartodate(const _variant_t& var)
{
COleDateTime value;
switch (var.vt)
{
case VT_DATE:
{
value = var.date;
}
break;
case VT_EMPTY:
case VT_NULL:
value.SetStatus(COleDateTime::null);
break;
default:
value.SetStatus(COleDateTime::null);
TRACE(_T("Warning: 未處理的 _variant_t 類型值; 文件: %s; 行: %d\n"), __FILE__, __LINE__);
}
return value;
}
COleCurrency vartocy(const _variant_t& var)
{
COleCurrency value;
switch (var.vt)
{
case VT_CY:
value = (CURRENCY)var.cyVal;
break;
case VT_EMPTY:
case VT_NULL:
value.m_status = COleCurrency::null;
break;
default:
value.m_status = COleCurrency::null;
TRACE(_T("Warning: 未處理的 _variant_t 類型值; 文件: %s; 行: %d\n"), __FILE__, __LINE__);
}
return value;
}
bool vartobool(const _variant_t& var)
{
bool value = false;
switch (var.vt)
{
case VT_BOOL:
value = var.boolVal ? true : false;
case VT_EMPTY:
case VT_NULL:
break;
default:
TRACE(_T("Warning: 未處理的 _variant_t 類型值; 文件: %s; 行: %d\n"), __FILE__, __LINE__);
}
return value;
}
BYTE vartoby(const _variant_t& var)
{
BYTE value = 0;
switch (var.vt)
{
case VT_I1:
case VT_UI1:
value = var.bVal;
break;
case VT_NULL:
case VT_EMPTY:
value = 0;
break;
default:
TRACE(_T("Warning: 未處理的 _variant_t 類型值; 文件: %s; 行: %d\n"), __FILE__, __LINE__);
}
return value;
}
short vartoi(const _variant_t& var)
{
short value = 0;
switch (var.vt)
{
case VT_BOOL:
value = var.boolVal;
break;
case VT_UI1:
case VT_I1:
value = var.bVal;
break;
case VT_I2:
case VT_UI2:
value = var.iVal;
break;
case VT_NULL:
case VT_EMPTY:
value = 0;
break;
default:
TRACE(_T("Warning: 未處理的 _variant_t 類型值; 文件: %s; 行: %d\n"), __FILE__, __LINE__);
}
return value;
}
long vartol(const _variant_t& var)
{
long value = 0;
switch (var.vt)
{
case VT_BOOL:
value = var.boolVal;
break;
case VT_UI1:
case VT_I1:
value = var.bVal;
break;
case VT_UI2:
case VT_I2:
value = var.iVal;
break;
case VT_I4:
case VT_UI4:
value = var.lVal;
break;
case VT_INT:
value = var.intVal;
break;
case VT_R4:
value = (long)(var.fltVal + 0.5);
break;
case VT_R8:
value = (long)(var.dblVal + 0.5);
break;
case VT_DECIMAL:
value = (long)var;
break;
case VT_CY:
value = (long)var;
break;
case VT_BSTR://字符串
case VT_LPSTR://字符串
case VT_LPWSTR://字符串
value = atol((LPCTSTR)(_bstr_t)var);
break;
case VT_NULL:
case VT_EMPTY:
value = 0;
break;
default:
TRACE(_T("Warning: 未處理的 _variant_t 類型值; 文件: %s; 行: %d\n"), __FILE__, __LINE__);
}
return value;
}
double vartof(const _variant_t& var)
{
double value = 0;
switch (var.vt)
{
case VT_R4:
value = var.fltVal;
break;
case VT_R8:
value = var.dblVal;
break;
case VT_DECIMAL:
value = (double)var;
break;
case VT_CY:
value = (double)var;
break;
case VT_BOOL:
value = var.boolVal;
break;
case VT_UI1:
case VT_I1:
value = var.bVal;
break;
case VT_UI2:
case VT_I2:
value = var.iVal;
break;
case VT_UI4:
case VT_I4:
value = var.lVal;
break;
case VT_INT:
value = var.intVal;
break;
case VT_BSTR://字符串
case VT_LPSTR://字符串
case VT_LPWSTR://字符串
value = atof((LPCTSTR)(_bstr_t)var);
break;
case VT_NULL:
case VT_EMPTY:
value = 0;
break;
default:
value = 0;
TRACE(_T("Warning: 未處理的 _variant_t 類型值; 文件: %s; 行: %d\n"), __FILE__, __LINE__);
}
return value;
}
CString vartostr(const _variant_t &var)
{
CString strValue;
switch (var.vt)
{
case VT_BSTR://字符串
case VT_LPSTR://字符串
case VT_LPWSTR://字符串
strValue = (LPCTSTR)(_bstr_t)var;
break;
case VT_I1:
case VT_UI1:
strValue.Format("%d", var.bVal);
break;
case VT_I2://短整型
strValue.Format("%d", var.iVal);
break;
case VT_UI2://無符號短整型
strValue.Format("%d", var.uiVal);
break;
case VT_INT://整型
strValue.Format("%d", var.intVal);
break;
case VT_I4: //整型
strValue.Format("%d", var.lVal);
break;
case VT_I8: //長整型
strValue.Format("%d", var.lVal);
break;
case VT_UINT://無符號整型
strValue.Format("%d", var.uintVal);
break;
case VT_UI4: //無符號整型
strValue.Format("%d", var.ulVal);
break;
case VT_UI8: //無符號長整型
strValue.Format("%d", var.ulVal);
break;
case VT_VOID:
strValue.Format("%8x", var.byref);
break;
case VT_R4://浮點型
strValue.Format("%.4f", var.fltVal);
break;
case VT_R8://雙精度型
strValue.Format("%.8f", var.dblVal);
break;
case VT_DECIMAL: //小數
strValue.Format("%.8f", (double)var);
break;
case VT_CY:
{
COleCurrency cy = var.cyVal;
strValue = cy.Format();
}
break;
case VT_BLOB:
case VT_BLOB_OBJECT:
case 0x2011:
strValue = "[BLOB]";
break;
case VT_BOOL://布爾型
strValue = var.boolVal ? "TRUE" : "FALSE";
break;
case VT_DATE: //日期型
{
DATE dt = var.date;
COleDateTime da = COleDateTime(dt);
strValue = da.Format("%Y-%m-%d %H:%M:%S");
}
break;
case VT_NULL://NULL值
strValue = "";
break;
case VT_EMPTY://空
strValue = "";
break;
case VT_UNKNOWN://未知類型
default:
strValue = "UN_KNOW";
break;
}
return strValue;
}
/*########################################################################
------------------------------------------------
CAdoConnection class 構造/析構函數
------------------------------------------------
########################################################################*/
CAdoConnection::CAdoConnection()
{
//創建 Connection 對象---------------------------
m_pConnection.CreateInstance("ADODB.Connection");
#ifdef _DEBUG
if (m_pConnection == NULL)
{
AfxMessageBox("Connection 對象創建失敗! 請確認是否初始化了COM環境\r\n");
}
#endif
ASSERT(m_pConnection != NULL);
}
CAdoConnection::~CAdoConnection()
{
if (m_pConnection != NULL)
{
Release();
}
}
/*========================================================================
Name: 連接到數據源.
-----------------------------------------------------
Params: [lpszConnect]: 連接字符串, 包含連接信息.
[lOptions]: 可選. 決定該方法是以同步還是異步的方式連接數據
源. 可以是如下某個常量:
[常量] [說明]
----------------------------------
adConnectUnspecified (默認)同步方式打開連接.
adAsyncConnect 異步方式打開連接. Ado用 ConnectComplete 事
件來通知已經完成連接.
==========================================================================*/
BOOL CAdoConnection::Open(LPCTSTR lpszConnect, long lOptions)
{
ASSERT(m_pConnection != NULL);
ASSERT(AfxIsValidString(lpszConnect));
if (strcmp(lpszConnect, _T("")) != 0)
{
m_strConnect = lpszConnect;
}
if (m_strConnect.IsEmpty())
{
ASSERT(FALSE);
return FALSE;
}
if (IsOpen()) Close();
try
{
// 連接數據庫 ---------------------------------------------
return (m_pConnection->Open(_bstr_t(LPCTSTR(m_strConnect)), "", "", lOptions) == S_OK);
}
catch (_com_error e)
{
TRACE(_T("Warning: 連接數據庫發生異常. 錯誤信息: %s; 文件: %s; 行: %d\n"), e.ErrorMessage(), __FILE__, __LINE__);
TRACE(_T("%s\r\n"), GetLastErrorText());
return FALSE;
}
catch (...)
{
TRACE(_T("Warning: 連接數據庫時發生未知錯誤:"));
}
return FALSE;
}
/*========================================================================
Name: 連接 SQL SERVER 數據庫.
-----------------------------------------------------
Params: [dbsrc]: SQL SERVER 服務器名.
[dbname]: 默認的數據庫名.
[user]: 用戶名.
[pass]: 密碼.
==========================================================================*/
BOOL CAdoConnection::ConnectSQLServer(CString dbsrc, CString dbname, CString user, CString pass, long lOptions)
{
CString strConnect = _T("Provider=SQLOLEDB.1; Data Source=") + dbsrc +
_T("; Initial Catalog=") + dbname +
_T("; User ID=") + user +
_T("; PWD=") + pass;
return Open(LPCTSTR(strConnect), lOptions);
}
/*========================================================================
Name: 連接 ACCESS 數據庫.
-----------------------------------------------------
Params: [dbpath]: MDB 數據庫文件路徑名.
[pass]: 訪問密碼.
===========================================================================*/
BOOL CAdoConnection::ConnectAccess(CString dbpath, CString pass, long lOptions)
{
CString strConnect = _T("Provider=Microsoft.Jet.OLEDB.4.0; Data Source=") + dbpath;
if (pass != _T(""))
{
strConnect += _T(";Jet OLEDB:Database Password=") + pass + _T(";");
}
return Open(LPCTSTR(strConnect), lOptions);
}
/*========================================================================
Name: 通過 udl 文件連接數據庫.
-----------------------------------------------------
Params: [strFileName]: UDL 數據庫連接文件路徑名.
==========================================================================*/
BOOL CAdoConnection::OpenUDLFile(LPCTSTR strFileName, long lOptions)
{
CString strConnect = _T("File Name=");
strConnect += strFileName;
return Open(LPCTSTR(strConnect), lOptions);
}
/*========================================================================
Name: 關閉與數據源的連接.
-----------------------------------------------------
Remarks: 使用 Close 方法可關閉 Connection 對象以便釋放所有關聯的系統資源.
==========================================================================*/
void CAdoConnection::Close()
{
try
{
if (m_pConnection != NULL && IsOpen())
{
m_pConnection->Close();
}
}
catch (_com_error e)
{
TRACE(_T("Warning: 關閉數據庫發生異常. 錯誤信息: %s; 文件: %s; 行: %d\n"), e.ErrorMessage(), __FILE__, __LINE__);
}
}
/*========================================================================
Name: 關閉連接并釋放對象.
-----------------------------------------------------
Remarks: 關閉連接并釋放connection對象.
==========================================================================*/
void CAdoConnection::Release()
{
if (IsOpen()) Close();
m_pConnection.Release();
}
/*========================================================================
Name: 執行指定的查詢、SQL 語句、存儲過程等.
----------------------------------------------------------
Remarks: 請參考 CAdoRecordSet 類的Open方法. 返回的 Recordset 對象始
終為只讀、僅向前的游標.
==========================================================================*/
_RecordsetPtr CAdoConnection::Execute(LPCTSTR lpszSQL, long lOptions)
{
ASSERT(m_pConnection != NULL);
ASSERT(AfxIsValidString(lpszSQL));
try
{
return m_pConnection->Execute(_bstr_t(lpszSQL), NULL, lOptions);
}
catch (_com_error e)
{
TRACE(_T("Warning: Execute 方法發生異常. 錯誤信息: %s; 文件: %s; 行: %d\n"), e.ErrorMessage(), __FILE__, __LINE__);
return FALSE;
}
return FALSE;
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -