?? adocommand.cpp
字號:
/*########################################################################
Filename: ado.cpp
----------------------------------------------------
Remarks: ...
----------------------------------------------------
Author: 成真
Email: anyou@sina.com
anyou@msn.com
Created: 20/1/2003 19:19
########################################################################*/
#include "stdafx.h"
#include "resource.h"
#include "AdoCommand.h"
#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif
/*########################################################################
------------------------------------------------
CAdoCommand class
------------------------------------------------
########################################################################*/
CAdoCommand::CAdoCommand()
{
///創建 Connection 對象---------------------------
m_pCommand.CreateInstance("ADODB.Command");
#ifdef _DEBUG
if (m_pCommand == NULL)
{
AfxMessageBox("Command 對象創建失敗! 請確認是否初始化了Com環境.");
}
#endif
ASSERT(m_pCommand != NULL);
}
CAdoCommand::CAdoCommand(CAdoConnection* pAdoConnection, CString strCommandText, CommandTypeEnum CommandType)
{
///創建 Connection 對象---------------------------
m_pCommand.CreateInstance("ADODB.Command");
#ifdef _DEBUG
if (m_pCommand == NULL)
{
AfxMessageBox("Command 對象創建失敗! 請確認是否初始化了Com環境.");
}
#endif
ASSERT(m_pCommand != NULL);
ASSERT(pAdoConnection != NULL);
SetConnection(pAdoConnection);
if (strCommandText != _T(""))
{
SetCommandText(LPCTSTR(strCommandText));
}
SetCommandType(CommandType);
}
CAdoCommand::~CAdoCommand()
{
Release();
}
void CAdoCommand::Release()
{
try
{
m_pCommand.Release();
}
catch (_com_error e)
{
TRACE(_T("Warning: Release方法發生異常. 錯誤信息: %s; 文件: %s; 行: %d\n"), e.ErrorMessage(), __FILE__, __LINE__);
}
}
_RecordsetPtr CAdoCommand::Execute(long Options)
{
ASSERT(m_pCommand != NULL);
try
{
return m_pCommand->Execute(NULL, NULL, Options);
}
catch (_com_error e)
{
TRACE(_T("Warning: Execute 方法發生異常. 錯誤信息: %s; 文件: %s; 行: %d\n"), e.ErrorMessage(), __FILE__, __LINE__);
return NULL;
}
}
BOOL CAdoCommand::Cancel()
{
ASSERT(m_pCommand != NULL);
try
{
return (m_pCommand->Cancel() == S_OK);
}
catch (_com_error e)
{
TRACE(_T("Warning: Cancel 方法發生異常. 錯誤信息: %s; 文件: %s; 行: %d\n"), e.ErrorMessage(), __FILE__, __LINE__);
return FALSE;
}
}
_ParameterPtr CAdoCommand::CreateParameter(LPCTSTR lpstrName,
DataTypeEnum Type,
ParameterDirectionEnum Direction,
long Size,
_variant_t Value)
{
ASSERT(m_pCommand != NULL);
try
{
return m_pCommand->CreateParameter(_bstr_t(lpstrName), Type, Direction, Size, Value);
}
catch (_com_error e)
{
TRACE(_T("Warning: CreateParameter 方法發生異常. 錯誤信息: %s; 文件: %s; 行: %d\n"), e.ErrorMessage(), __FILE__, __LINE__);
return NULL;
}
}
BOOL CAdoCommand::SetCommandText(LPCTSTR lpstrCommand)
{
ASSERT(m_pCommand != NULL);
try
{
m_pCommand->PutCommandText(_bstr_t(lpstrCommand));
return TRUE;
}
catch (_com_error e)
{
TRACE(_T("Warning: PutCommandText 方法發生異常. 錯誤信息: %s; 文件: %s; 行: %d\n"), e.ErrorMessage(), __FILE__, __LINE__);
return FALSE;
}
}
BOOL CAdoCommand::SetConnection(CAdoConnection *pConnect)
{
ASSERT(pConnect != NULL);
ASSERT(pConnect->GetConnection() != NULL);
ASSERT(m_pCommand != NULL);
try
{
m_pCommand->PutActiveConnection(_variant_t((IDispatch*)pConnect->GetConnection(), true));
return TRUE;
}
catch (_com_error e)
{
TRACE(_T("Warning: SetConnection 方法發生異常. 錯誤信息: %s; 文件: %s; 行: %d\n"), e.ErrorMessage(), __FILE__, __LINE__);
return FALSE;
}
}
/*========================================================================
Name: 指示 Command 對象的類型。
----------------------------------------------------------
returns: 返回以下某個 CommandTypeEnum 的值.
[常量] [說明]
----------------------------------
adCmdText 指示strSQL為命令文本, 即普通的SQL語句.
adCmdTable 指示ADO生成SQL查詢返回以 strSQL 命名的表中的
所有行.
adCmdTableDirect 指示所作的更改在strSQL中命名的表中返回所有行.
adCmdStoredProc 指示strSQL為存儲過程.
adCmdUnknown 指示strSQL參數中的命令類型為未知.
adCmdFile 指示應從在strSQL中命名的文件中恢復保留(保存的)
Recordset.
adAsyncExecute 指示應異步執行strSQL.
adAsyncFetch 指示在提取 Initial Fetch Size 屬性中指定的初始
數量后, 應該異步提取所有剩余的行. 如果所需的行尚未
提取, 主要的線程將被堵塞直到行重新可用.
adAsyncFetchNonBlocking 指示主要線程在提取期間從未堵塞. 如果所請求
的行尚未提取, 當前行自動移到文件末尾.
----------------------------------------------------------
Remarks: 使用 CommandType 屬性可優化 CommandText 屬性的計算。
如果 CommandType 屬性的值等于 adCmdUnknown(默認值), 系統的性能將會
降低, 因為 ADO 必須調用提供者以確定 CommandText 屬性是 SQL 語句、還是存
儲過程或表格名稱。如果知道正在使用的命令的類型, 可通過設置 CommandType
屬性指令 ADO 直接轉到相關代碼。如果 CommandType 屬性與 CommandText 屬
性中的命令類型不匹配, 調用 Execute 方法時將產生錯誤。
==========================================================================*/
BOOL CAdoCommand::SetCommandType(CommandTypeEnum CommandType)
{
ASSERT(m_pCommand != NULL);
try
{
m_pCommand->PutCommandType(CommandType);
return TRUE;
}
catch (_com_error e)
{
TRACE(_T("Warning: PutCommandType 方法發生異常. 錯誤信息: %s; 文件: %s; 行: %d\n"), e.ErrorMessage(), __FILE__, __LINE__);
return FALSE;
}
}
long CAdoCommand::GetState()
{
ASSERT(m_pCommand != NULL);
try
{
return m_pCommand->GetState();
}
catch (_com_error e)
{
TRACE(_T("Warning: GetState 方法發生異常. 錯誤信息: %s; 文件: %s; 行: %d\n"), e.ErrorMessage(), __FILE__, __LINE__);
return -1;
}
}
BOOL CAdoCommand::SetCommandTimeOut(long lTime)
{
ASSERT(m_pCommand != NULL);
try
{
m_pCommand->PutCommandTimeout(lTime);
return TRUE;
}
catch (_com_error e)
{
TRACE(_T("Warning: SetCommandTimeOut 方法發生異常. 錯誤信息: %s; 文件: %s; 行: %d\n"), e.ErrorMessage(), __FILE__, __LINE__);
return FALSE;
}
}
ParametersPtr CAdoCommand::GetParameters()
{
ASSERT(m_pCommand != NULL);
try
{
return m_pCommand->GetParameters();
}
catch (_com_error e)
{
TRACE(_T("Warning: SetCommandTimeOut 方法發生異常. 錯誤信息: %s; 文件: %s; 行: %d\n"), e.ErrorMessage(), __FILE__, __LINE__);
return NULL;
}
}
BOOL CAdoCommand::Append(_ParameterPtr param)
{
ASSERT(m_pCommand != NULL);
try
{
return m_pCommand->GetParameters()->Append((IDispatch*)param);
}
catch (_com_error e)
{
TRACE(_T("Warning: Append 方法發生異常. 錯誤信息: %s; 文件: %s; 行: %d\n"), e.ErrorMessage(), __FILE__, __LINE__);
return FALSE;
}
}
_ParameterPtr CAdoCommand::GetParamter(LPCTSTR lpstrName)
{
ASSERT(m_pCommand != NULL);
try
{
return m_pCommand->GetParameters()->GetItem(_variant_t(lpstrName));
}
catch (_com_error e)
{
TRACE(_T("Warning: GetParamter 方法發生異常. 錯誤信息: %s; 文件: %s; 行: %d\n"), e.ErrorMessage(), __FILE__, __LINE__);
return NULL;
}
}
_ParameterPtr CAdoCommand::GetParameter(long index)
{
ASSERT(m_pCommand != NULL);
try
{
return m_pCommand->GetParameters()->GetItem(_variant_t(index));
}
catch (_com_error e)
{
TRACE(_T("Warning: GetParamter 方法發生異常. 錯誤信息: %s; 文件: %s; 行: %d\n"), e.ErrorMessage(), __FILE__, __LINE__);
return NULL;
}
}
_variant_t CAdoCommand::GetValue(long index)
{
ASSERT(m_pCommand != NULL);
try
{
return m_pCommand->GetParameters()->GetItem(_variant_t(index))->Value;
}
catch (_com_error e)
{
TRACE(_T("Warning: GetValue 方法發生異常. 錯誤信息: %s; 文件: %s; 行: %d\n"), e.ErrorMessage(), __FILE__, __LINE__);
_variant_t vt;
vt.vt = VT_NULL;
return vt;
}
}
_variant_t CAdoCommand::GetValue(LPCTSTR lpstrName)
{
ASSERT(m_pCommand != NULL);
try
{
return m_pCommand->GetParameters()->GetItem(_variant_t(lpstrName))->Value;
}
catch (_com_error e)
{
TRACE(_T("Warning: GetValue 方法發生異常. 錯誤信息: %s; 文件: %s; 行: %d\n"), e.ErrorMessage(), __FILE__, __LINE__);
_variant_t vt;
vt.vt = VT_NULL;
return vt;
}
}
_CommandPtr& CAdoCommand::GetCommand()
{
return m_pCommand;
}
CAdoParameter CAdoCommand::operator [](int index)
{
CAdoParameter pParameter;
ASSERT(m_pCommand != NULL);
try
{
pParameter = m_pCommand->GetParameters()->GetItem(_variant_t(long(index)));
}
catch (_com_error e)
{
TRACE(_T("Warning: operator [] 方法發生異常. 錯誤信息: %s; 文件: %s; 行: %d\n"), e.ErrorMessage(), __FILE__, __LINE__);
}
return pParameter;
}
CAdoParameter CAdoCommand::operator [](LPCTSTR lpszParamName)
{
CAdoParameter pParameter;
ASSERT(m_pCommand != NULL);
try
{
pParameter = m_pCommand->GetParameters()->GetItem(_variant_t(lpszParamName));
}
catch (_com_error e)
{
TRACE(_T("Warning: operator [] 方法發生異常. 錯誤信息: %s; 文件: %s; 行: %d\n"), e.ErrorMessage(), __FILE__, __LINE__);
}
return pParameter;
}
/*########################################################################
------------------------------------------------
CAdoParameter class
------------------------------------------------
########################################################################*/
CAdoParameter::CAdoParameter()
{
m_pParameter = NULL;
m_pParameter.CreateInstance("ADODB.Parameter");
#ifdef _DEBUG
if (m_pParameter == NULL)
{
AfxMessageBox("Parameter 對象創建失敗! 請確認是否初始化了Com環境.");
}
#endif
ASSERT(m_pParameter != NULL);
m_strName = _T("");
}
CAdoParameter::CAdoParameter(DataTypeEnum DataType, long lSize, ParameterDirectionEnum Direction, CString strName)
{
m_pParameter = NULL;
m_pParameter.CreateInstance("ADODB.Parameter");
#ifdef _DEBUG
if (m_pParameter == NULL)
{
AfxMessageBox("Parameter 對象創建失敗! 請確認是否初始化了Com環境.");
}
#endif
ASSERT(m_pParameter != NULL);
m_pParameter->Direction = Direction;
m_strName = strName;
m_pParameter->Name = m_strName.AllocSysString();
m_pParameter->Type = DataType;
m_pParameter->Size = lSize;
}
_ParameterPtr& CAdoParameter::operator =(_ParameterPtr& pParameter)
{
if (pParameter != NULL)
{
m_pParameter = pParameter;
}
else
{
return pParameter;
}
return m_pParameter;
}
CAdoParameter::~CAdoParameter()
{
m_pParameter.Release();
m_pParameter = NULL;
m_strName = _T("");
}
/*========================================================================
Name: 指示在 Parameter 對象中數字值或數字 Field 對象的精度。
----------------------------------------------------------
Params: 設置或返回 Byte 值,用來表示值的最大位數。該值在 Parameter
對象上為讀/寫,而在 Field 對象上為只讀。
----------------------------------------------------------
Remarks: 使用 Precision 屬性可確定表示數字 Parameter 或 Field 對象值
的最大位數
==========================================================================*/
BOOL CAdoParameter::SetPrecision(char nPrecision)
{
ASSERT(m_pParameter != NULL);
try
{
m_pParameter->PutPrecision(nPrecision);
return TRUE;
}
catch (_com_error e)
{
TRACE(_T("Warning: SetPrecision 方法發生異常. 錯誤信息: %s; 文件: %s; 行: %d\n"), e.ErrorMessage(), __FILE__, __LINE__);
return FALSE;
}
}
/*========================================================================
Name: 指出 Parameter 或 Field 對象中數字值的范圍。
----------------------------------------------------------
Params: 設置或返回字節值,指示數字值所精確到的小數點位數。
----------------------------------------------------------
Remarks: 使用 NumericScale 屬性可確定用于表明數字型 Parameter 或 Field
對象的值的小數位數。
對于 Parameter 對象,NumericScale 屬性為讀/寫。對于 Field 對象,
NumericScale 屬性為只讀。
==========================================================================*/
BOOL CAdoParameter::SetNumericScale(int nScale)
{
ASSERT(m_pParameter != NULL);
try
{
m_pParameter->PutNumericScale(nScale);
return TRUE;
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -