代码改变世界

miniado用法 数据库连接

2015-12-18 22:12  佛皮  阅读(164)  评论(0)    收藏  举报

 

使用ado连接各种不同的数据库

//----------------------------.h ----------------------------------
#pragma once   
  
#include "math.h"   
  
#import "MSADO15.DLL"   rename_namespace("ADOWE") rename("EOF","EndOfFile")   
using namespace ADOWE;  
  



struct  CADOFieldInfo//AFX_EXT_CLASS
{
    char m_strName[30];    //字段名
    short m_nType;            //类型
    long m_lSize; //长度大小
    long m_lDefinedSize;
    long m_lAttributes;
    short m_nOrdinalPosition;
    BOOL m_bRequired;   
    BOOL m_bAllowZeroLength; 
    long m_lCollatingOrder;  
};



class CDBAdo  
{  
public:  
    _CommandPtr     m_ptrCommand;       //命令对象 ,是要提交的sql查询字符串  
    _ConnectionPtr  m_ptrConnection;    //数据库对象   
    _RecordsetPtr   m_ptrRecordset;     //记录集对象   
  
    CString         m_strConnect,       //连接字符串   
                    m_strErrorMsg;      //错误信息   
  
    int m_nAdoType;    //数据库类型0:mdb, 1:其他
public:  
    CDBAdo(void);  
    ~CDBAdo(void);  
  
    void    DetectResult(HRESULT hResult);  
    void    RecordErrorMsg(_com_error comError);  
    CString GetLastError(){return m_strErrorMsg;}  
  
    bool    CreateInstance(); 
    // ADO连接测试,返回连接指针
    _ConnectionPtr ADOLink(CString strDatabaseType,CString strServer,CString strPortNo,CString strDatabaseName,CString strUser,CString strPWD);
    bool    SetConnectionString(CString strDriver, CString strIP, WORD wPort, CString strCatalog, CString strUserID, CString strPassword);  
    bool    SetConnectionString(CString strDriver, CString strDataSrc, CString strPassword);  
    bool    OpenConnection();  
    bool    CloseConnection();  
    bool    IsConnecting();  
  
    void    ClearAllParameters();  
    void    AddParamter(LPCTSTR lpcsrName, ADOWE::ParameterDirectionEnum Direction, ADOWE::DataTypeEnum Type, long lSize, _variant_t & vtValue);  
    void    SetSPName(LPCTSTR lpcsrSPName);  
    bool    ExecuteCommand(bool bIsRecordset);  
    bool    Execute(LPCTSTR lpcsrCommand);  
    long    GetReturnValue();  
  
    bool    OpenRecordset(char* szSQL);  
    bool    CloseRecordset();  
    bool    IsRecordsetOpened();  
    bool    IsEndRecordset();  
    void    MoveToNext();  
    void    MoveToFirst();  
    void    MoveToLast();  
    long    RollbackTrans();
    long    GetRecordCount();  


    int        GetFieldCount();
    BOOL    GetFieldInfo(int nIndex,CADOFieldInfo &fldInfo);
    BOOL    GetFieldInfo(LPCTSTR lpFieldName, CADOFieldInfo& fldInfo);
    
    WORD        GetFieldValueWord(LPCTSTR lpcsrFieldName);
    CString        GetFieldValueStr(LPCTSTR lpcsrFieldName);  
    int            GetFieldValueInt(LPCTSTR lpcsrFieldName);  
    BYTE        GetFieldValueByte(LPCTSTR lpcsrFieldName);  
    long        GetFieldValueLong(LPCTSTR lpcsrFieldName);  
    DWORD        GetFieldValueDword(LPCTSTR lpcsrFieldName);  
    UINT        GetFieldValueUint(LPCTSTR lpcsrFieldName);  
    double        GetFieldValueDbl(LPCTSTR lpcsrFieldName);  
    __int64        GetFieldValueInt64(LPCTSTR lpcsrFieldName);  
    bool        GetFieldValueBool(LPCTSTR lpcsrFieldName); 
    COleDateTime    GetFieldValueTime(LPCTSTR lpcsrFieldName);  
  
    /*bool    GetFieldValue(LPCTSTR lpcsrFieldName, WORD& wValue);  
    bool    GetFieldValue(LPCTSTR lpcsrFieldName, CString& strValue);  
    bool    GetFieldValue(LPCTSTR lpcsrFieldName, INT& nValue);  
    bool    GetFieldValue(LPCTSTR lpcsrFieldName, BYTE& bValue);  
    bool    GetFieldValue(LPCTSTR lpcsrFieldName, LONG& lValue);  
    bool    GetFieldValue(LPCTSTR lpcsrFieldName, DWORD& dwValue);  
    bool    GetFieldValue(LPCTSTR lpcsrFieldName, UINT& ulValue);  
    bool    GetFieldValue(LPCTSTR lpcsrFieldName, DOUBLE& dbValue);  
    bool    GetFieldValue(LPCTSTR lpcsrFieldName, __int64& llValue);  
    bool    GetFieldValue(LPCTSTR lpcsrFieldName, COleDateTime& Time);  
    bool    GetFieldValue(LPCTSTR lpcsrFieldName, bool& bValue);  */
};  


//---------------------------- .cpp ----------------------------------------
#include "StdAfx.h"   
#include "DBAdo.h"
#include "string.h"
  
CDBAdo::CDBAdo(void)  
{  
    m_strConnect    = _T("");  
    m_strErrorMsg   = _T("");  
    m_nAdoType = 0;
    //初始化 COM   
    CoInitialize(NULL);  
}  
  
CDBAdo::~CDBAdo(void)  
{  
    //关闭连接   
    CloseConnection();  
  
    //释放对象   
    if(m_ptrCommand!=NULL)  
        m_ptrCommand.Release();  
    if(m_ptrRecordset!=NULL)  
        m_ptrRecordset.Release();  
    if(m_ptrConnection!=NULL)  
        m_ptrConnection.Release();  
}  
  
bool CDBAdo::CreateInstance()  
{  
    //创建对象   
    m_ptrCommand.CreateInstance(__uuidof(Command));  
    m_ptrRecordset.CreateInstance(__uuidof(Recordset));  
    m_ptrConnection.CreateInstance(__uuidof(Connection));  
  
    if(m_ptrCommand==NULL)  
    {  
        m_strErrorMsg   = _T("数据库命令对象创建失败");  
        return  false;  
    }  
    if(m_ptrRecordset==NULL)  
    {  
        m_strErrorMsg   = _T("数据库记录集对象创建失败");  
        return  false;  
    }  
    if(m_ptrConnection==NULL)  
    {  
        m_strErrorMsg   = _T("数据库连接对象创建失败");  
        return  false;  
    }  
  
    //设置变量   
    m_ptrCommand->CommandType    = adCmdStoredProc;  
    return  true;  
}
  
void CDBAdo::DetectResult(HRESULT hResult)  
{  
    if(FAILED(hResult))  
        _com_issue_error(hResult);  
}  
  
void CDBAdo::RecordErrorMsg(_com_error comError)  
{  
    _bstr_t bstrDescribe(comError.Description());  
  
    m_strErrorMsg.Format(TEXT("ADO 错误:0x%8x,%s"), comError.Error(), (LPCTSTR)bstrDescribe);
    AfxMessageBox(m_strErrorMsg);
}  
  



_ConnectionPtr CDBAdo::ADOLink(CString strDatabaseType,CString strServer,CString strPortNo,CString strDatabaseName,CString strUser,CString strPWD)// ADO连接测试,返回连接指针
{
    strDatabaseType.MakeUpper();
    if ( !(strDatabaseType==_T("SQLSERVER") || strDatabaseType==_T("DB2") || strDatabaseType==_T("ORACLE") || strDatabaseType==_T("ACCESS")) ) 
    {
        ASSERT(FALSE);
        return FALSE;
    }

    HRESULT hr = S_FALSE;
    VARIANT_BOOL bOK = VARIANT_FALSE;
    _ConnectionPtr pConnADO = NULL;
    hr = pConnADO.CreateInstance(__uuidof(Connection));
    ASSERT(SUCCEEDED(hr) && pConnADO!=NULL);
    CString strConnect(_T(""));
    m_nAdoType = 1;
    if (0 == strDatabaseType.Find(_T("SQLSERVER"))) 
    {
        //strConnect = _T("Provider=sqloledb;Data Source=MyServerName;Initial Catalog=MyDatabaseName;User Id=MyUsername;Password=MyPassword;");
        strConnect.Format(_T("Provider=sqloledb;Data Source=%s;Initial Catalog=%s;User Id=%s;Password=%s;"),strServer,strDatabaseName,strUser,strPWD);
    }
    else if (0 == strDatabaseType.Find(_T("DB2"))) 
    {
        //"Provider=IBMDADB2; Database=sample; HOSTNAME=db2host; PROTOCOL=TCPIP; PORT=50000; uid=myUserName; pwd=myPwd;"
        strConnect.Format(_T("Provider=IBMDADB2; Database=%s; HOSTNAME=%s; PROTOCOL=TCPIP; PORT=%s; uid=%s; pwd=%s;"),strDatabaseName,strServer,strPortNo,strUser,strPWD);
    }
    else if (0 == strDatabaseType.Find(_T("ORACLE"))) 
    {
        //strConnect = _T("Provider=OraOLEDB.Oracle;Data Source=MyOracleDB;User Id=myUsername;Password=myPassword;");
        strConnect.Format(_T("Provider=OraOLEDB.Oracle;Data Source=%s;User Id=%s;Password=%s;"),strDatabaseName,strUser,strPWD);
    }
    else if (0 == strDatabaseType.Find(_T("ACCESS")))
    {
        m_nAdoType = 0;
        //strConnect = _T("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\\DatabasePath\\MmDatabase.mdb;User Id=admin;Password=;");
        strConnect.Format(_T("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=%s;User Id=admin;Password=;"),strServer);
    }
    else
    {
        ASSERT(FALSE);
        return NULL;
    }

    try
    {
        hr = pConnADO->put_ConnectionString(CComBSTR(strConnect));
        hr = pConnADO->raw_Open(CComBSTR(strConnect),CComBSTR(L""),CComBSTR(L""),adOpenUnspecified);
        if (hr != S_OK) 
        {
            return NULL;
        }
    }
    catch (_com_error e) 
    {
        CString errormessage;
        errormessage.Format("Warning:连接数据库时发生未知错误,错误信息:%s\n",e.ErrorMessage());
        ::MessageBox(NULL,errormessage,_T("提示"),MB_OK|MB_ICONINFORMATION);
        return FALSE;
        return NULL;
    }

    return pConnADO;
}



/*参数1:数据库类型的搜索引擎
2:服务器地址   数据库所在电脑的IP
3:数据库单口号
4:数据库名
5:用户名
6:用户密码

该函数  可以连接远程和非远程的数据库
*/
bool CDBAdo::SetConnectionString(CString strDriver, CString strIP, WORD wPort, CString strCatalog, CString strUserID, CString strPassword)  
{  
    CString strProvider, strPWD, strUID, strData, strDataSrc;  
  
    //strProvider.Format(_T("Provider=%s;"), strProvider);  
    strProvider.Format(_T("Provider=%s;"), strDriver);  
    strPWD.Format(_T("Password=%s;"), strPassword);  
    strUID.Format(_T("User ID=%s;"), strUserID);  
    strData.Format(_T("Initial Catalog=%s;"), strCatalog);  
    //strDataSrc.Format(_T("Data Source=%s,%ld;"), strIP, wPort);  
    strDataSrc.Format(_T("Data Source=%s;"), strIP);   //SQL SERVER连接
    //构造连接字符串   
   // m_strConnect    = strProvider+strPWD+_T("Persist Security Info=True;")+strUID+strData+strDataSrc;  
    m_strConnect    = strProvider+strDataSrc+strData+strUID+strPWD;  

    m_nAdoType = 1;
    return true;  
}  
  
//默认的ACESS  的连接方法
bool CDBAdo::SetConnectionString(CString strDriver, CString strDataSrc, CString strPassword)  
{  
    CString strProvider, strDataSource, strPWD;  
  
    strProvider.Format(_T("Provider=%s;"), strDriver);  
    strDataSource.Format(_T("Data Source=%s;"), strDataSrc);  
    strPWD.Format(_T("Jet OLEDB:DataBase Password=%s;"), strPassword);  
  
    //构造连接字符串   
    m_strConnect    = strProvider+_T("User ID=Admin;")+strDataSource+strPWD;  
  
    m_nAdoType = 0;
    return true;  
}  
  
bool CDBAdo::OpenConnection()  
{  
    try  
    {  
        //关闭连接   
        CloseConnection();  
  
        //连接数据库   
        DetectResult(m_ptrConnection->Open(_bstr_t(m_strConnect), "", "", adModeUnknown));  
        m_ptrConnection->CursorLocation  = adUseClient;  
        m_ptrCommand->ActiveConnection   = m_ptrConnection;  
  
        return true;  
    }  
    catch(_com_error& comError)   
    {  
        RecordErrorMsg(comError);  
    }  
  
    return false;  
}  
  
bool CDBAdo::CloseConnection()  
{  
    try  
    {  
        CloseRecordset();  
        if((m_ptrConnection!=NULL)&&(m_ptrConnection->GetState()!=adStateClosed))  
            DetectResult(m_ptrConnection->Close());  
  
        return true;  
    }  
    catch(_com_error& comError)  
    {  
        RecordErrorMsg(comError);  
    }  
  
    return false;  
}  
  
//判断是否连接上
bool CDBAdo::IsConnecting()  
{  
    try   
    {  
        //状态判断   
        if(m_ptrConnection==NULL)  
            return  false;  
        if(m_ptrConnection->GetState()==adStateClosed)  
            return  false;  
  
        //参数判断   
        long    lErrorCount = m_ptrConnection->Errors->Count;  
        if(lErrorCount>0L)  
        {  
            ErrorPtr    pError   = NULL;  
            for(long i=0; i<lErrorCount; i++)  
            {  
                pError  = m_ptrConnection->Errors->GetItem(i);  
                if(pError->Number==0x80004005)  
                    return  false;  
            }  
        }  
  
        return true;  
    }  
    catch(_com_error& comError)  
    {  
        RecordErrorMsg(comError);  
    }  
  
    return false;  
}  

 //打开记录集 
bool CDBAdo::OpenRecordset(char* szSQL)  
{  
    try  
    {  
        //关闭记录集   
        CloseRecordset();  
  
        m_ptrRecordset->Open(szSQL, m_ptrConnection.GetInterfacePtr(), adOpenDynamic, adLockOptimistic, adCmdText);  
  
        return true;  
    }  
    catch(_com_error& comError)  
    {  
        RecordErrorMsg(comError);  
    }  
  
    return  false;  
}  
  
//关闭记录集
bool CDBAdo::CloseRecordset()  
{  
    try  
    {  
        if(IsRecordsetOpened())  
            DetectResult(m_ptrRecordset->Close());  
        return true;  
    }  
    catch(_com_error& comError)  
    {  
        RecordErrorMsg(comError);  
    }  
  
    return false;  
}  
  
//判断记录集是否打开
bool CDBAdo::IsRecordsetOpened()  
{  
    if(m_ptrRecordset==NULL)  
        return  false;  
    if(m_ptrRecordset->GetState()==adStateClosed)  
        return  false;  
  
    return true;  
}  
  
//判断记录集为最后一条记录
bool CDBAdo::IsEndRecordset()  
{  
    try   
    {  
        return (m_ptrRecordset->EndOfFile==VARIANT_TRUE);  
    }  
    catch(_com_error& comError)  
    {  
        RecordErrorMsg(comError);  
    }  
  
    return true;  
}  
 
//移动到下一条记录
void CDBAdo::MoveToNext()  
{  
    try   
    {   
        m_ptrRecordset->MoveNext();   
    }  
    catch(_com_error& comError)  
    {  
        RecordErrorMsg(comError);  
    }  
}  
 //移动到第一条记录 
void CDBAdo::MoveToFirst()  
{  
    try   
    {   
        m_ptrRecordset->MoveFirst();   
    }  
    catch(_com_error& comError)  
    {  
        RecordErrorMsg(comError);  
    }  
}  
  
//移动到最后记录
void CDBAdo::MoveToLast()  
{  
    try   
    {   
        m_ptrRecordset->MoveLast();   
    }  
    catch(_com_error& comError)  
    {  
        RecordErrorMsg(comError);  
    }  
} 

//回滚到上条记录
long CDBAdo::RollbackTrans()
{
    return m_ptrConnection->RollbackTrans ( );
}
  
//获取记录集的总数
long CDBAdo::GetRecordCount()  
{  
    try  
    {  
        if(m_ptrRecordset==NULL)  
            return  0;  
        return  m_ptrRecordset->GetRecordCount();  
    }  
    catch(_com_error& comError)  
    {  
        RecordErrorMsg(comError);  
    }  
  
    return 0;  
}  
  
//清空所有当前记录集数据
void CDBAdo::ClearAllParameters()  
{  
    try   
    {  
        long    lParamCount = m_ptrCommand->Parameters->Count;  
        if(lParamCount>0L)  
        {  
            for(long i=lParamCount; i>0; i--)  
            {  
                _variant_t  vtIndex;  
  
                vtIndex.intVal  = i-1;  
                m_ptrCommand->Parameters->Delete(vtIndex);  
            }  
        }  
    }  
    catch(_com_error& comError)  
    {  
        RecordErrorMsg(comError);  
    }  
}  
  

void CDBAdo::AddParamter(LPCTSTR lpcsrName, ADOWE::ParameterDirectionEnum Direction, ADOWE::DataTypeEnum Type, long lSize, _variant_t & vtValue)  
{  
    ASSERT(lpcsrName!=NULL);  
    try   
    {  
        _ParameterPtr   Parameter   = m_ptrCommand->CreateParameter(lpcsrName, Type, Direction, lSize, vtValue);  
        m_ptrCommand->Parameters->Append(Parameter);  
    }  
    catch(_com_error& comError)  
    {  
        RecordErrorMsg(comError);  
    }  
}  
  
void CDBAdo::SetSPName(LPCTSTR lpcsrSPName)  
{  
    try   
    {   
        m_ptrCommand->CommandText    = lpcsrSPName;   
    }  
    catch(_com_error& comError)  
    {  
        RecordErrorMsg(comError);  
    }  
}  
  
//
bool CDBAdo::ExecuteCommand(bool bIsRecordset)  
{  
    try   
    {  
        //关闭记录集   
        CloseRecordset();  
        //执行命令   
        if(bIsRecordset)  
        {  
            m_ptrRecordset->PutRefSource(m_ptrCommand);  
            m_ptrRecordset->CursorLocation   = adUseClient;  
            DetectResult(m_ptrRecordset->Open((IDispatch*)m_ptrCommand, vtMissing, adOpenForwardOnly, adLockReadOnly, adOptionUnspecified));  
        }else   
        {  
            m_ptrConnection->CursorLocation  = adUseClient;  
            DetectResult(m_ptrCommand->Execute(NULL, NULL, adExecuteNoRecords));  
        }  
        return  true;  
    }  
    catch(_com_error& comError)  
    {  
        RecordErrorMsg(comError);  
    }  
  
    return  false;  
}  

//执行SQL语句
bool CDBAdo::Execute(LPCTSTR lpcsrCommand)  
{  
    try  
    {  
        m_ptrConnection->CursorLocation  = adUseClient;  
        m_ptrConnection->Execute(lpcsrCommand, NULL, adExecuteNoRecords);  
        return  true;  
    }  
    catch(_com_error& comError)  
    {  
        RecordErrorMsg(comError);  
    }  
  
    return  false;  
}  
  
long CDBAdo::GetReturnValue()  
{  
    try   
    {  
        _ParameterPtr   ptrParam;  
        long            lParameterCount = m_ptrCommand->Parameters->Count;  
        for(long i=0; i<lParameterCount; i++)  
        {  
            ptrParam    = m_ptrCommand->Parameters->Item[i];  
            if(ptrParam->Direction==adParamReturnValue)  
                return  ptrParam->Value.lVal;  
        }  
    }  
    catch(_com_error& comError)  
    {  
        RecordErrorMsg(comError);  
    }  
  
    return  0;  
}  


int CDBAdo::GetFieldCount()
{
    return m_ptrRecordset->Fields->GetCount();
}

//根据字段名称获取字段信息
BOOL CDBAdo::GetFieldInfo(LPCTSTR lpFieldName, CADOFieldInfo& fldInfo)
{
    FieldPtr pField = m_ptrRecordset->Fields->GetItem(lpFieldName);
    memset(&fldInfo, 0, sizeof(CADOFieldInfo));

    strcpy(fldInfo.m_strName, (LPCTSTR)pField->GetName());
    fldInfo.m_lDefinedSize = pField->GetDefinedSize();
    fldInfo.m_nType = pField->GetType();
    fldInfo.m_lAttributes = pField->GetAttributes();
    if(!IsEndRecordset())
        fldInfo.m_lSize = pField->GetActualSize();
    return TRUE;
}

//根据字段序号来获取字段信息    数据表默认的字段顺序
BOOL CDBAdo::GetFieldInfo(int nIndex,CADOFieldInfo &fldInfo)
{
    _variant_t vtIndex;

    vtIndex.vt = VT_I2;
    vtIndex.iVal = nIndex;

    FieldPtr pField = m_ptrRecordset->Fields->GetItem(vtIndex);
    memset(&fldInfo, 0, sizeof(CADOFieldInfo));

    strcpy(fldInfo.m_strName, (LPCTSTR)pField->GetName());
    fldInfo.m_lDefinedSize = pField->GetDefinedSize();
    fldInfo.m_nType = pField->GetType();
    fldInfo.m_lAttributes = pField->GetAttributes();
    if(!IsEndRecordset())
        fldInfo.m_lSize = pField->GetActualSize();
    return TRUE;
}
  
//获取字段值
WORD CDBAdo::GetFieldValueWord(LPCTSTR lpcsrFieldName)  
{  
    WORD wValue  = 0L;  
    try  
    {  
        _variant_t  vtFld   = m_ptrRecordset->Fields->GetItem(lpcsrFieldName)->Value;  
        if((vtFld.vt!=VT_NULL)&&(vtFld.vt!=VT_EMPTY))  
            wValue  = (WORD)vtFld.ulVal;
        return wValue;  
    }  
    catch(_com_error& comError)  
    {  
        RecordErrorMsg(comError);  
    }  
  
    return wValue;  
}  
  
CString CDBAdo::GetFieldValueStr(LPCTSTR lpcsrFieldName)  
{  
    CString strValue=_T("");
    try  
    {  
        _variant_t vtFld    = m_ptrRecordset->Fields->GetItem(lpcsrFieldName)->Value;  
        if(vtFld.vt==VT_BSTR)  
        {  
            strValue    = (char*)_bstr_t(vtFld);  
            strValue.TrimLeft();  
        }  
       return  strValue;  
    }  
    catch(_com_error& comError)  
    {  
        RecordErrorMsg(comError);  
    }  
    return strValue;  
}  
  
int CDBAdo::GetFieldValueInt(LPCTSTR lpcsrFieldName)  
{  
    int nValue  = 0;  
    try  
    {  
        _variant_t vtFld = m_ptrRecordset->Fields->GetItem(lpcsrFieldName)->Value;  
        switch(vtFld.vt)  
        {  
        case VT_BOOL:  
            {  
                nValue  = vtFld.boolVal;  
                break;  
            }  
        case VT_I2:  
        case VT_UI1:  
            {  
                nValue  = vtFld.iVal;  
                break;  
            }  
        case VT_NULL:  
        case VT_EMPTY:  
            {  
                nValue  = 0;  
                break;  
            }  
        default: nValue = vtFld.iVal;  
        }     
        return nValue;  
    }  
    catch(_com_error& comError)  
    {  
        RecordErrorMsg(comError);  
    }  
  
    return nValue; 
}  
  
//无符号的char型
BYTE CDBAdo::GetFieldValueByte(LPCTSTR lpcsrFieldName)  
{  
    BYTE bValue  = 0;  
    try  
    {  
        _variant_t vtFld    = m_ptrRecordset->Fields->GetItem(lpcsrFieldName)->Value;  
        switch(vtFld.vt)  
        {  
        case VT_BOOL:  
            {  
                bValue  = (vtFld.boolVal!=0)?1:0;  
                break;  
            }  
        case VT_I2:  
        case VT_UI1:  
            {  
                bValue  = (vtFld.iVal>0)?1:0;  
                break;  
            }  
        case VT_NULL:  
        case VT_EMPTY:  
            {  
                bValue  = 0;  
                break;  
            }  
        default: bValue = (BYTE)vtFld.iVal;  
        }     
        return bValue;  
    }  
    catch(_com_error& comError)  
    {  
        RecordErrorMsg(comError);  
    }  
  
    return bValue;  
}  

//无符号整形
UINT CDBAdo::GetFieldValueUint(LPCTSTR lpcsrFieldName)  
{  
    UINT ulValue = 0L;  
    try  
    {  
        _variant_t  vtFld   = m_ptrRecordset->Fields->GetItem(lpcsrFieldName)->Value;  
        if((vtFld.vt!=VT_NULL)&&(vtFld.vt!=VT_EMPTY))  
            ulValue = vtFld.lVal; 
            return ulValue;
    }  
    catch(_com_error& comError)  
    {  
        RecordErrorMsg(comError);  
    }  
    return  ulValue;  
}  

double CDBAdo::GetFieldValueDbl(LPCTSTR lpcsrFieldName)  
{  
    double dbValue=0.0000000000000000;  
    try  
    {  
        _variant_t  vtFld   = m_ptrRecordset->Fields->GetItem(lpcsrFieldName)->Value;  
        switch(vtFld.vt)  
        {  
        case VT_R4:dbValue  = vtFld.fltVal;break;  
        case VT_R8:dbValue  = vtFld.dblVal;break;  
        case VT_DECIMAL:  
            {  
                dbValue  = vtFld.decVal.Lo32;  
                dbValue *= (vtFld.decVal.sign==128)?-1:1;  
                dbValue /= pow((float)10,vtFld.decVal.scale);  
            }  
            break;  
        case VT_UI1:dbValue = vtFld.iVal;break;  
        case VT_I2:  
        case VT_I4:dbValue  = vtFld.lVal;break;  
        case VT_NULL:  
        case VT_EMPTY:dbValue   = 0.0L;break;  
        default:dbValue = vtFld.dblVal;  
        }  
        return dbValue;  
    }  
    catch(_com_error& comError)  
    {  
        RecordErrorMsg(comError);  
    }  
  
    return  dbValue;  
} 

long CDBAdo::GetFieldValueLong(LPCTSTR lpcsrFieldName)  
{  
    long lValue  = 0L;  
    try  
    {  
        _variant_t  vtFld   = m_ptrRecordset->Fields->GetItem(lpcsrFieldName)->Value;  
        if((vtFld.vt!=VT_NULL)&&(vtFld.vt!=VT_EMPTY))  
            lValue  = vtFld.lVal;  
        return  lValue;  
    }  
    catch(_com_error& comError)  
    {  
        RecordErrorMsg(comError);  
    }  
  
    return  lValue;  
}  

//无符号长整形
DWORD CDBAdo::GetFieldValueDword(LPCTSTR lpcsrFieldName)  
{  
    DWORD dwValue = 0L;  
    try  
    {  
        _variant_t  vtFld   = m_ptrRecordset->Fields->GetItem(lpcsrFieldName)->Value;  
        if((vtFld.vt!=VT_NULL)&&(vtFld.vt!=VT_EMPTY))  
            dwValue = vtFld.ulVal;  
        return  dwValue;  
    }  
    catch(_com_error& comError)  
    {  
        RecordErrorMsg(comError);  
    }  
  
    return  dwValue;  
}

__int64 CDBAdo::GetFieldValueInt64(LPCTSTR lpcsrFieldName)  
{  
    __int64 llValue = 0L;  
    try  
    {  
        _variant_t  vtFld   = m_ptrRecordset->Fields->GetItem(lpcsrFieldName)->Value;  
        if((vtFld.vt!=VT_NULL)&&(vtFld.vt!=VT_EMPTY))  
            llValue=vtFld.lVal;  
  
        return  llValue;  
    }  
    catch(_com_error& comError)  
    {  
        RecordErrorMsg(comError);  
    }  
  
    return  llValue;  
}  


COleDateTime CDBAdo::GetFieldValueTime(LPCTSTR lpcsrFieldName)  
{  
    COleDateTime Time;
    Time.SetStatus(COleDateTime::null);
    try  
    {  
        _variant_t  vtFld   = m_ptrRecordset->Fields->GetItem(lpcsrFieldName)->Value;  
        switch(vtFld.vt)   
        {  
        case VT_DATE:  
            {  
                COleDateTime    TempTime(vtFld);  
                Time    = TempTime;  
            }break;  
        case VT_EMPTY:  
        case VT_NULL:Time.SetStatus(COleDateTime::null);break;  
        default: return Time;  
        }  
        return  Time;  
    }  
    catch(_com_error& comError)  
    {  
        RecordErrorMsg(comError);  
    }  
  
    return  Time;  
}  
  

bool CDBAdo::GetFieldValueBool(LPCTSTR lpcsrFieldName)  
{  
    bool bValue=false;
    try  
    {  
        _variant_t  vtFld   = m_ptrRecordset->Fields->GetItem(lpcsrFieldName)->Value;  
        switch(vtFld.vt)   
        {  
        case VT_BOOL:bValue=(vtFld.boolVal==0)?false:true;break;  
        case VT_EMPTY:  
        case VT_NULL:bValue = false;break;  
        default:return bValue;  
        }  
  
        return  bValue;  
    }  
    catch(_com_error& comError)  
    {  
        RecordErrorMsg(comError);  
    }  
  
    return  bValue;  
} 

 

_ConnectionPtr CDBAdo::ADOLink(CString strDatabaseType,CString strServer,CString strPortNo,CString strDatabaseName,CString strUser,CString strPWD)// ADO连接测试,返回连接指针
{
strDatabaseType.MakeUpper();
if ( !(strDatabaseType==_T("SQLSERVER") || strDatabaseType==_T("DB2") || strDatabaseType==_T("ORACLE") || strDatabaseType==_T("ACCESS")) )
{
ASSERT(FALSE);
return FALSE;
}

HRESULT hr = S_FALSE;
VARIANT_BOOL bOK = VARIANT_FALSE;
_ConnectionPtr pConnADO = NULL;
hr = pConnADO.CreateInstance(__uuidof(Connection));
ASSERT(SUCCEEDED(hr) && pConnADO!=NULL);
CString strConnect(_T(""));
m_nAdoType = 1;
if (0 == strDatabaseType.Find(_T("SQLSERVER")))
{
//strConnect = _T("Provider=sqloledb;Data Source=MyServerName;Initial Catalog=MyDatabaseName;User Id=MyUsername;Password=MyPassword;");
strConnect.Format(_T("Provider=sqloledb;Data Source=%s;Initial Catalog=%s;User Id=%s;Password=%s;"),strServer,strDatabaseName,strUser,strPWD);
}
else if (0 == strDatabaseType.Find(_T("DB2")))
{
//"Provider=IBMDADB2; Database=sample; HOSTNAME=db2host; PROTOCOL=TCPIP; PORT=50000; uid=myUserName; pwd=myPwd;"
strConnect.Format(_T("Provider=IBMDADB2; Database=%s; HOSTNAME=%s; PROTOCOL=TCPIP; PORT=%s; uid=%s; pwd=%s;"),strDatabaseName,strServer,strPortNo,strUser,strPWD);
}
else if (0 == strDatabaseType.Find(_T("ORACLE")))
{
//strConnect = _T("Provider=OraOLEDB.Oracle;Data Source=MyOracleDB;User Id=myUsername;Password=myPassword;");
strConnect.Format(_T("Provider=OraOLEDB.Oracle;Data Source=%s;User Id=%s;Password=%s;"),strDatabaseName,strUser,strPWD);
}
else if (0 == strDatabaseType.Find(_T("ACCESS")))
{
m_nAdoType = 0;
//strConnect = _T("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\\DatabasePath\\MmDatabase.mdb;User Id=admin;Password=;");
strConnect.Format(_T("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=%s;User Id=admin;Password=;"),strServer);
}
else
{
ASSERT(FALSE);
return NULL;
}

try
{
hr = pConnADO->put_ConnectionString(CComBSTR(strConnect));
hr = pConnADO->raw_Open(CComBSTR(strConnect),CComBSTR(L""),CComBSTR(L""),adOpenUnspecified);
if (hr != S_OK)
{
return NULL;
}
}
catch (_com_error e)
{
CString errormessage;
errormessage.Format("Warning:连接数据库时发生未知错误,错误信息:%s\n",e.ErrorMessage());
::MessageBox(NULL,errormessage,_T("提示"),MB_OK|MB_ICONINFORMATION);
return FALSE;
return NULL;
}

return pConnADO;
}