VC ADO操作类以及示例

//
//  MODULE:   Ado.h
//
//    AUTHOR: Carlos Antollini 
//
//    Date: 6/28/2001 
//  
//    Version 1.2
//

#ifndef _ADO_H_
#define _ADO_H_

#if _MSC_VER >= 1000
#pragma once
#endif // _MSC_VER >= 1000
#include "StdAfx.h"
#include "icrsint.h"

//#include "resource.h"
// CG : In order to use this code against a different version of ADO, the appropriate
// ADO library needs to be used in the #import statement
#import "C:Program FilesCommon FilesSystemADOmsado15.dll" rename_namespace("ADOCG") rename("EOF", "EndOfFile")
using namespace ADOCG;


struct CADOFieldInfo
{
    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;  
};

CString IntToStr(int nVal);

CString LongToStr(long lVal);

class CADODatabase
{
public:
    bool Execute(LPCTSTR lpstrExec);
    CADODatabase()
    {
        ::CoInitialize(NULL);
            
        m_pConnection = NULL;
        m_strConnection = _T("");
        m_pConnection.CreateInstance(__uuidof(Connection));
    }
    
    ~CADODatabase()
    {
        Close();
        m_pConnection.Release();
        m_pConnection = NULL;
        ::CoUninitialize();
    }
    
    bool Open(LPCTSTR lpstrConnection = _T(""));
    _ConnectionPtr GetActiveConnection() {return m_pConnection;};
    DWORD GetRecordCount(_RecordsetPtr m_pRs);
    long BeginTransaction() 
        {return m_pConnection->BeginTrans();};
    long CommitTransaction() 
        {return m_pConnection->CommitTrans();};
    long RollbackTransaction() 
        {return m_pConnection->RollbackTrans();};
    bool IsOpen();
    void Close();
    void SetConnectionString(LPCTSTR lpstrConnection)
        {m_strConnection = lpstrConnection;};
    CString GetConnectionString()
        {return m_strConnection;};
    CString GetLastError() 
        {return m_strLastError;};
protected:
    void dump_com_error(_com_error &e);

protected:
    _ConnectionPtr m_pConnection;
    CString m_strConnection;
    CString m_strLastError;
};

class CADORecordset
{
public:
    enum cadoOpenEnum
    {
        openUnknown = 0,
        openQuery = 1,
        openTable = 2,
        openStoredProc = 3
    };

    enum cadoEditEnum
    {
        dbEditNone = 0,
        dbEditNew = 1,
        dbEdit = 2
    };
    
    enum cadoPositionEnum
    {
    
        positionUnknown = -1,
        positionBOF = -2,
        positionEOF = -3
    };
    
    enum cadoSearchEnum
    {    
        searchForward = 1,
        searchBackward = -1
    };

    
    bool SetFieldValue(int nIndex, CString strValue);
    bool SetFieldValue(LPCTSTR lpFieldName, CString strValue);
    bool SetFieldValue(int nIndex, int nValue);
    bool SetFieldValue(LPCTSTR lpFieldName, int nValue);
    bool SetFieldValue(int nIndex, long lValue);
    bool SetFieldValue(LPCTSTR lpFieldName, long lValue);
    bool SetFieldValue(int nIndex, double dblValue);
    bool SetFieldValue(LPCTSTR lpFieldName, double dblValue);
    bool SetFieldValue(int nIndex, COleDateTime time);
    bool SetFieldValue(LPCTSTR lpFieldName, COleDateTime time);

    void CancelUpdate();
    bool Update();
    void Edit();
    bool AddNew();

    bool Find(LPCTSTR lpFind, int nSearchDirection = CADORecordset::searchForward);
    bool FindFirst(LPCTSTR lpFind);
    bool FindNext();

    CADORecordset()
    {
        m_pRecordset = NULL;
        m_pCmd = NULL;
        m_strQuery = _T("");
        m_pRecordset.CreateInstance(__uuidof(Recordset));
        m_pCmd.CreateInstance(__uuidof(Command));
        m_nEditStatus = CADORecordset::dbEditNone;
        m_nSearchDirection = CADORecordset::searchForward;
    }

    CADORecordset(CADODatabase* pAdoDatabase);

    ~CADORecordset()
    {
        Close();
        m_pRecordset.Release();
        m_pCmd.Release();
        m_pRecordset = NULL;
        m_pCmd = NULL;
        m_strQuery = _T("");
        m_nEditStatus = dbEditNone;
    }

    CString GetQuery() 
        {return m_strQuery;};
    void SetQuery(LPCSTR strQuery) 
        {m_strQuery = strQuery;};
    bool RecordBinding(CADORecordBinding &pAdoRecordBinding);
    DWORD GetRecordCount();
    bool IsOpen();
    void Close();
    bool Open(_ConnectionPtr mpdb, LPCTSTR lpstrExec = _T(""), int nOption = CADORecordset::openUnknown);
    bool Open(LPCTSTR lpstrExec = _T(""), int nOption = CADORecordset::openUnknown);
    bool GetFieldValue(LPCTSTR lpFieldName, double& dbValue);
    bool GetFieldValue(int nIndex, double& dbValue);
    bool GetFieldValue(LPCTSTR lpFieldName, long& lValue);
    bool GetFieldValue(int nIndex, long& lValue);
    bool GetFieldValue(LPCTSTR lpFieldName, int& nValue);
    bool GetFieldValue(int nIndex, int& nValue);
    bool GetFieldValue(LPCTSTR lpFieldName, CString& strValue);
    bool GetFieldValue(int nIndex, CString& strValue);
    bool GetFieldValue(LPCTSTR lpFieldName, COleDateTime& time);
    bool GetFieldValue(int nIndex, COleDateTime& time);
    bool IsFieldNull(LPCTSTR lpFieldName);
    bool IsFieldNull(int nIndex);
    bool IsFieldEmpty(LPCTSTR lpFieldName);
    bool IsFieldEmpty(int nIndex);    
    bool IsEof()
        {return m_pRecordset->EndOfFile == VARIANT_TRUE;};
    bool IsEOF()
        {return m_pRecordset->EndOfFile == VARIANT_TRUE;};
    bool IsBof()
        {return m_pRecordset->BOF == VARIANT_TRUE;};
    bool IsBOF()
        {return m_pRecordset->BOF == VARIANT_TRUE;};
    void MoveFirst() 
        {m_pRecordset->MoveFirst();};
    void MoveNext() 
        {m_pRecordset->MoveNext();};
    void MovePrevious() 
        {m_pRecordset->MovePrevious();};
    void MoveLast() 
        {m_pRecordset->MoveLast();};
    long GetAbsolutePage()
        {return m_pRecordset->GetAbsolutePage();};
    void SetAbsolutePage(int nPage)
        {m_pRecordset->PutAbsolutePage((enum PositionEnum)nPage);};
    long GetPageCount()
        {return m_pRecordset->GetPageCount();};
    long GetPageSize()
        {return m_pRecordset->GetPageSize();};
    void SetPageSize(int nSize)
        {m_pRecordset->PutPageSize(nSize);};
    long GetAbsolutePosition()
        {return m_pRecordset->GetAbsolutePosition();};
    void SetAbsolutePosition(int nPosition)
        {m_pRecordset->PutAbsolutePosition((enum PositionEnum)nPosition);};
    bool GetFieldInfo(LPCTSTR lpFieldName, CADOFieldInfo* fldInfo);
    bool GetFieldInfo(int nIndex, CADOFieldInfo* fldInfo);
    bool GetChunk(LPCTSTR lpFieldName, CString& strValue);
    CString GetString(LPCTSTR lpCols, LPCTSTR lpRows, LPCTSTR lpNull, long numRows = 0);
    CString GetLastError() {return m_strLastError;};
    void GetBookmark()
        {m_varBookmark = m_pRecordset->Bookmark;};
    bool SetBookmark();
    bool Delete();

protected:
    _ConnectionPtr m_pConnection;
    int m_nSearchDirection;
    CString m_strFind;
    _variant_t m_varBookFind;
    _variant_t m_varBookmark;
    int m_nEditStatus;
    CString m_strLastError;
    void dump_com_error(_com_error &e);
    _RecordsetPtr m_pRecordset;
    _CommandPtr m_pCmd;
    CString m_strQuery;
};

#endif
//
//  MODULE:   Ado.cpp
//
//    AUTHOR: Carlos Antollini 
//
//    Date: 6/18/2001
//
//    Version 1.2
// 

#include "ado.h"
#include <afxdisp.h>

DWORD CADODatabase::GetRecordCount(_RecordsetPtr m_pRs)
{
    DWORD numRows = 0;
    
    numRows = m_pRs->GetRecordCount();

    if(numRows == -1)
    {
        if(m_pRs->EndOfFile != VARIANT_TRUE)
            m_pRs->MoveFirst();

        while(m_pRs->EndOfFile != VARIANT_TRUE)
        {
            numRows++;
            m_pRs->MoveNext();
        }
        if(numRows > 0)
            m_pRs->MoveFirst();
    }
    return numRows;
}

bool CADODatabase::Open(LPCTSTR lpstrConnection)
{
    HRESULT hr = S_OK;

    if(IsOpen())
        Close();

    if(strcmp(lpstrConnection, _T("")) != 0)
        m_strConnection = lpstrConnection;

    ASSERT(!m_strConnection.IsEmpty());

    try
    {
        hr = m_pConnection->Open(_bstr_t(m_strConnection), "", "", NULL);
        return hr == S_OK;
    }
    catch(_com_error &e)
    {
        dump_com_error(e);
    }
    return false;
}

void CADODatabase::dump_com_error(_com_error &e)
{
    CString ErrorStr;
    
    
    _bstr_t bstrSource(e.Source());
    _bstr_t bstrDescription(e.Description());
    ErrorStr.Format( "CADODataBase ErrorntCode = %08lxntCode meaning = %sntSource = %sntDescription = %sn",
        e.Error(), e.ErrorMessage(), (LPCSTR)bstrSource, (LPCSTR)bstrDescription );
    m_strLastError = _T("Connection String = " + GetConnectionString() + 'n' + ErrorStr);
    #ifdef _DEBUG
        AfxMessageBox( ErrorStr, MB_OK | MB_ICONERROR );
    #endif    
}

bool CADODatabase::IsOpen()
{
    if(m_pConnection )
        return m_pConnection->GetState() != adStateClosed;
    return false;
}

void CADODatabase::Close()
{
    if(IsOpen())
        m_pConnection->Close();
}


CADORecordset::CADORecordset(CADODatabase* pAdoDatabase)
{
    m_pRecordset = NULL;
    m_pCmd = NULL;
    m_strQuery = _T("");
    m_pRecordset.CreateInstance(__uuidof(Recordset));
    m_pCmd.CreateInstance(__uuidof(Command));
    m_nEditStatus = CADORecordset::dbEditNone;
    m_nSearchDirection = CADORecordset::searchForward;

    m_pConnection = pAdoDatabase->GetActiveConnection();
}

bool CADORecordset::Open(_ConnectionPtr mpdb, LPCTSTR lpstrExec, int nOption)
{    
    Close();
    
    if(strcmp(lpstrExec, _T("")) != 0)
        m_strQuery = lpstrExec;

    ASSERT(!m_strQuery.IsEmpty());
    
    m_strQuery.TrimLeft();
    BOOL bIsSelect = m_strQuery.Mid(0, strlen("Select ")).CompareNoCase("select ") == 0;

    try
    {
        m_pRecordset->CursorLocation = adUseClient;
        if(bIsSelect || nOption == openQuery)
            m_pRecordset->Open((LPCSTR)m_strQuery, _variant_t((IDispatch*)mpdb, true), 
                            adOpenStatic, adLockOptimistic, adCmdUnknown);
        else if(nOption == openTable)
            m_pRecordset->Open((LPCSTR)m_strQuery, _variant_t((IDispatch*)mpdb, true), 
                            adOpenDynamic, adLockOptimistic, adCmdTable);
        else if(nOption == openStoredProc)
        {
            m_pCmd->ActiveConnection = mpdb;
            m_pCmd->CommandText = _bstr_t(m_strQuery);
            m_pCmd->CommandType = adCmdStoredProc;
            
            m_pRecordset = m_pCmd->Execute(NULL, NULL, adCmdText);
        }
        else
        {
            TRACE( "Unknown parameter. %d", nOption);
            return false;
        }
    }
    catch(_com_error &e)
    {
        dump_com_error(e);
        return false;
    }

    return m_pRecordset != NULL;
}

bool CADORecordset::Open(LPCTSTR lpstrExec, int nOption)
{
    ASSERT(m_pConnection != NULL);
    return Open(m_pConnection, lpstrExec, nOption);
}

bool CADORecordset::GetFieldValue(LPCTSTR lpFieldName, double& dbValue)
{    
    double val = (double)NULL;
    _variant_t vtFld;
    
    vtFld = m_pRecordset->Fields->GetItem(lpFieldName)->Value;
    if(vtFld.vt != VT_NULL)
        val = vtFld.dblVal;
    dbValue = val;
    return true;
}


bool CADORecordset::GetFieldValue(int nIndex, double& dbValue)
{    
    double val = (double)NULL;
    _variant_t vtFld;
    _variant_t vtIndex;

    vtIndex.vt = VT_I2;
    vtIndex.iVal = nIndex;
    
    vtFld = m_pRecordset->Fields->GetItem(vtIndex)->Value;
    if(vtFld.vt != VT_NULL)
        val = vtFld.dblVal;
    dbValue = val;
    return true;
}


bool CADORecordset::GetFieldValue(LPCTSTR lpFieldName, long& lValue)
{
    long val = (long)NULL;
    _variant_t vtFld;
    
    vtFld = m_pRecordset->Fields->GetItem(lpFieldName)->Value;
    if(vtFld.vt != VT_NULL)
        val = vtFld.lVal;
    lValue = val;
    return true;
}

bool CADORecordset::GetFieldValue(int nIndex, long& lValue)
{
    long val = (long)NULL;
    _variant_t vtFld;
    _variant_t vtIndex;
    
    vtIndex.vt = VT_I2;
    vtIndex.iVal = nIndex;
    vtFld = m_pRecordset->Fields->GetItem(vtIndex)->Value;
    if(vtFld.vt != VT_NULL)
        val = vtFld.lVal;
    lValue = val;
    return true;
}


bool CADORecordset::GetFieldValue(LPCTSTR lpFieldName, int& nValue)
{
    int val = NULL;
    _variant_t vtFld;
    
    vtFld = m_pRecordset->Fields->GetItem(lpFieldName)->Value;
    switch(vtFld.vt)
    {
    case VT_I2:
        val = vtFld.iVal;
        break;
    case VT_BOOL:
        val = vtFld.boolVal;
    case VT_NULL:
    case VT_EMPTY:
        break;
    default:
        nValue = 0;
        return false;
    }    
    nValue = val;
    return true;
}

bool CADORecordset::GetFieldValue(int nIndex, int& nValue)
{
    int val = (int)NULL;
    _variant_t vtFld;
    _variant_t vtIndex;
    
    vtIndex.vt = VT_I2;
    vtIndex.iVal = nIndex;
    vtFld = m_pRecordset->Fields->GetItem(vtIndex)->Value;
    switch(vtFld.vt)
    {
    case VT_I2:
        val = vtFld.iVal;
        break;
    case VT_NULL:
    case VT_EMPTY:
        val = 0;
        break;
    default:
        return false;
    }    
    nValue = val;
    return true;
}

bool CADORecordset::GetFieldValue(LPCTSTR lpFieldName, CString& strValue)
{
    CString str = _T("");
    _variant_t vtFld;
    
    vtFld = m_pRecordset->Fields->GetItem(lpFieldName)->Value;
    switch(vtFld.vt) 
    {
    case VT_BSTR:
        str = vtFld.bstrVal;
        break;
    case VT_I4:
        str = IntToStr(vtFld.iVal);
        break;
    case VT_DATE:
        {
            COleDateTime dt(vtFld);

            str = dt.Format("%Y-%m-%d %H:%M:%S");
        }
        break;
    case VT_EMPTY:
    case VT_NULL:
        break;
    default:
        strValue.Empty();
        return false;
    }
    strValue = str;
    return true;
}

bool CADORecordset::GetFieldValue(int nIndex, CString& strValue)
{
    CString str = _T("");
    _variant_t vtFld;
    _variant_t vtIndex;

    vtIndex.vt = VT_I2;
    vtIndex.iVal = nIndex;
    
    vtFld = m_pRecordset->Fields->GetItem(vtIndex)->Value;
    switch(vtFld.vt) 
    {
    case VT_BSTR:
        str = vtFld.bstrVal;
        break;
    case VT_DATE:
        {
            COleDateTime dt(vtFld);
            
            str = dt.Format("%Y-%m-%d %H:%M:%S");
        }
        break;
    case VT_EMPTY:
    case VT_NULL:
        break;
    default:
        strValue.Empty();
        return false;
    }
    strValue = str;
    return true;
}

bool CADORecordset::GetFieldValue(LPCTSTR lpFieldName, COleDateTime& time)
{
    _variant_t vtFld;
    
    vtFld = m_pRecordset->Fields->GetItem(lpFieldName)->Value;
    switch(vtFld.vt) 
    {
    case VT_DATE:
        {
            COleDateTime dt(vtFld);
            time = dt;
        }
        break;
    case VT_EMPTY:
    case VT_NULL:
        break;
    default:
        return false;
    }
    return true;
}

bool CADORecordset::GetFieldValue(int nIndex, COleDateTime& time)
{
    _variant_t vtFld;
    _variant_t vtIndex;
    
    vtIndex.vt = VT_I2;
    vtIndex.iVal = nIndex;
    
    vtFld = m_pRecordset->Fields->GetItem(vtIndex)->Value;
    switch(vtFld.vt) 
    {
    case VT_DATE:
        {
            COleDateTime dt(vtFld);
            time = dt;
        }
        break;
    case VT_EMPTY:
    case VT_NULL:
        break;
    default:
        return false;
    }
    return true;
}

bool CADORecordset::IsFieldNull(LPCTSTR lpFieldName)
{
    _variant_t vtFld;
    
    vtFld = m_pRecordset->Fields->GetItem(lpFieldName)->Value;
    return vtFld.vt == VT_NULL;
}

bool CADORecordset::IsFieldNull(int nIndex)
{
    _variant_t vtFld;
    _variant_t vtIndex;

    vtIndex.vt = VT_I2;
    vtIndex.iVal = nIndex;
    
    vtFld = m_pRecordset->Fields->GetItem(vtIndex)->Value;
    return vtFld.vt == VT_NULL;
}

bool CADORecordset::IsFieldEmpty(LPCTSTR lpFieldName)
{
    _variant_t vtFld;
    
    vtFld = m_pRecordset->Fields->GetItem(lpFieldName)->Value;
    return vtFld.vt == VT_EMPTY || vtFld.vt == VT_NULL;
}

bool CADORecordset::IsFieldEmpty(int nIndex)
{
    _variant_t vtFld;
    _variant_t vtIndex;
    
    vtIndex.vt = VT_I2;
    vtIndex.iVal = nIndex;
        
    vtFld = m_pRecordset->Fields->GetItem(vtIndex)->Value;
    return vtFld.vt == VT_EMPTY || vtFld.vt == VT_NULL;
}

DWORD CADORecordset::GetRecordCount()
{
    DWORD nRows = 0;
    
    nRows = m_pRecordset->GetRecordCount();

    if(nRows == -1)
    {
        nRows = 0;
        if(m_pRecordset->EndOfFile != VARIANT_TRUE)
            m_pRecordset->MoveFirst();
        
        while(m_pRecordset->EndOfFile != VARIANT_TRUE)
        {
            nRows++;
            m_pRecordset->MoveNext();
        }
        if(nRows > 0)
            m_pRecordset->MoveFirst();
    }
    
    return nRows;
}

bool CADORecordset::IsOpen()
{
    if(m_pRecordset)
        return m_pRecordset->GetState() != adStateClosed;
    return false;
}

void CADORecordset::Close()
{
    if(IsOpen())
        m_pRecordset->Close();
        
}


bool CADODatabase::Execute(LPCTSTR lpstrExec)
{
    ASSERT(m_pConnection != NULL);
    ASSERT(strcmp(lpstrExec, _T("")) != 0);

    try
    {
        m_pConnection->Execute(_bstr_t(lpstrExec), NULL, adExecuteNoRecords);
    }
    catch(_com_error &e)
    {
        dump_com_error(e);
    }
    return true;    
}

bool CADORecordset::RecordBinding(CADORecordBinding &pAdoRecordBinding)
{
    IADORecordBinding *picRs = NULL;
    HRESULT hr;

    //Open the binding interface.
    if(FAILED(hr = m_pRecordset->QueryInterface(__uuidof(IADORecordBinding), (LPVOID*)&picRs )))
    {
        _com_issue_error(hr);
        return false;
    }
    
    //Bind the recordset to class
    if(FAILED( hr = picRs->BindToRecordset(&pAdoRecordBinding)))
    {
        _com_issue_error(hr);
        return false;
    }
    return true;
}

void CADORecordset::dump_com_error(_com_error &e)
{
    CString ErrorStr;
    
    
    _bstr_t bstrSource(e.Source());
    _bstr_t bstrDescription(e.Description());
    ErrorStr.Format( "CADORecordset ErrorntCode = %08lxntCode meaning = %sntSource = %sntDescription = %sn",
        e.Error(), e.ErrorMessage(), (LPCSTR)bstrSource, (LPCSTR)bstrDescription );
    m_strLastError = _T("Query = " + GetQuery() + 'n' + ErrorStr);

    #ifdef _DEBUG
        AfxMessageBox( ErrorStr, MB_OK | MB_ICONERROR );
    #endif    
}

bool CADORecordset::GetFieldInfo(LPCTSTR lpFieldName, CADOFieldInfo* fldInfo)
{
    _variant_t vtFld;
    
    strcpy(fldInfo->m_strName, (LPCTSTR)m_pRecordset->Fields->GetItem(lpFieldName)->GetName());
    fldInfo->m_lSize = m_pRecordset->Fields->GetItem(lpFieldName)->GetActualSize();
    fldInfo->m_lDefinedSize = m_pRecordset->Fields->GetItem(lpFieldName)->GetDefinedSize();
    fldInfo->m_nType = m_pRecordset->Fields->GetItem(lpFieldName)->GetType();
    fldInfo->m_lAttributes = m_pRecordset->Fields->GetItem(lpFieldName)->GetAttributes();
    return true;
}

bool CADORecordset::GetFieldInfo(int nIndex, CADOFieldInfo* fldInfo)
{
    _variant_t vtFld;
    _variant_t vtIndex;
    
    vtIndex.vt = VT_I2;
    vtIndex.iVal = nIndex;
        
    strcpy(fldInfo->m_strName, (LPCTSTR)m_pRecordset->Fields->GetItem(vtIndex)->GetName());
    fldInfo->m_lSize = m_pRecordset->Fields->GetItem(vtIndex)->GetActualSize();
    fldInfo->m_lDefinedSize = m_pRecordset->Fields->GetItem(vtIndex)->GetDefinedSize();
    fldInfo->m_nType = m_pRecordset->Fields->GetItem(vtIndex)->GetType();
    fldInfo->m_lAttributes = m_pRecordset->Fields->GetItem(vtIndex)->GetAttributes();
    return true;
}


bool CADORecordset::GetChunk(LPCTSTR lpFieldName, CString& strValue)
{
    CString str = _T("");
    long lngSize, lngOffSet = 0;
    _variant_t varChunk;    
    int ChunkSize = 100;

    lngSize = m_pRecordset->Fields->GetItem(lpFieldName)->ActualSize;
    
    str.Empty();
    while(lngOffSet < lngSize)
    {
        varChunk = m_pRecordset->Fields->GetItem(lpFieldName)->GetChunk(ChunkSize);
        str += varChunk.bstrVal;
        lngOffSet += ChunkSize;
    }

    lngOffSet = 0;
    strValue = str;
    return TRUE;
}

CString CADORecordset::GetString(LPCTSTR lpCols, LPCTSTR lpRows, LPCTSTR lpNull, long numRows)
{
    _bstr_t varOutput;
    _bstr_t varNull("");
    _bstr_t varCols("t");
    _bstr_t varRows("r");

    if(strlen(lpCols) != 0)
        varCols = _bstr_t(lpCols);

    if(strlen(lpRows) != 0)
        varRows = _bstr_t(lpRows);
    
    if(numRows == 0)
        numRows =(long)GetRecordCount();            
            
    varOutput = m_pRecordset->GetString(adClipString, numRows, varCols, varRows, varNull);

    return (LPCTSTR)varOutput;
}

CString IntToStr(int nVal)
{
    CString strRet;
    char buff[10];
    
    itoa(nVal, buff, 10);
    strRet = buff;
    return strRet;
}

CString LongToStr(long lVal)
{
    CString strRet;
    char buff[20];
    
    ltoa(lVal, buff, 10);
    strRet = buff;
    return strRet;
}

void CADORecordset::Edit()
{
    m_nEditStatus = dbEdit;
}

bool CADORecordset::AddNew()
{
    m_nEditStatus = dbEditNone;
    if(m_pRecordset->AddNew() != S_OK)
        return false;

    m_nEditStatus = dbEditNew;
    return true;
}

bool CADORecordset::Update()
{
    bool bret = true;

    if(m_nEditStatus != dbEditNone)
    {
        if(m_pRecordset->Update() != S_OK)
            bret = false;
    }

    m_nEditStatus = dbEditNone;
    return bret;
}

void CADORecordset::CancelUpdate()
{
    m_pRecordset->CancelUpdate();
    m_nEditStatus = dbEditNone;
}

bool CADORecordset::SetFieldValue(int nIndex, CString strValue)
{
    _variant_t vtFld;
    vtFld.vt = VT_BSTR;
    vtFld.bstrVal = _bstr_t(strValue);

    _variant_t vtIndex;    
    vtIndex.vt = VT_I2;
    vtIndex.iVal = nIndex;
    
    m_pRecordset->Fields->GetItem(vtIndex)->Value = _bstr_t(vtFld);//_bstr_t(strValue);
    return true;

}

bool CADORecordset::SetFieldValue(LPCTSTR lpFieldName, CString strValue)
{
    _variant_t vtFld;
    vtFld.vt = VT_BSTR;
    vtFld.bstrVal = _bstr_t(strValue);
    
    m_pRecordset->Fields->GetItem(lpFieldName)->Value = _bstr_t(vtFld);//_bstr_t(strValue);
    return true;
    
}

bool CADORecordset::SetFieldValue(int nIndex, int nValue)
{
    _variant_t vtFld;
    vtFld.vt = VT_I2;
    vtFld.iVal = nValue;
    
    _variant_t vtIndex;
    
    vtIndex.vt = VT_I2;
    vtIndex.iVal = nIndex;
    
    m_pRecordset->Fields->GetItem(vtIndex)->Value = vtFld;
    return true;
    
}

bool CADORecordset::SetFieldValue(LPCTSTR lpFieldName, int nValue)
{
    _variant_t vtFld;
    vtFld.vt = VT_I2;
    vtFld.iVal = nValue;
    
    m_pRecordset->Fields->GetItem(lpFieldName)->Value = vtFld;
    return true;
    
}

bool CADORecordset::SetFieldValue(int nIndex, long lValue)
{
    _variant_t vtFld;
    vtFld.vt = VT_I4;
    vtFld.lVal = lValue;
    
    _variant_t vtIndex;
    
    vtIndex.vt = VT_I2;
    vtIndex.iVal = nIndex;
    
    m_pRecordset->Fields->GetItem(vtIndex)->Value = vtFld;
    return true;
    
}

bool CADORecordset::SetFieldValue(LPCTSTR lpFieldName, long lValue)
{
    _variant_t vtFld;
    vtFld.vt = VT_I4;
    vtFld.lVal = lValue;
    
    m_pRecordset->Fields->GetItem(lpFieldName)->Value = vtFld;
    return true;
    
}

bool CADORecordset::SetFieldValue(int nIndex, double dblValue)
{
    _variant_t vtFld;
    vtFld.vt = VT_R8;
    vtFld.dblVal = dblValue;

    _variant_t vtIndex;
    
    vtIndex.vt = VT_I2;
    vtIndex.iVal = nIndex;
    
    m_pRecordset->Fields->GetItem(vtIndex)->Value = vtFld;
    return true;
    
}

bool CADORecordset::SetFieldValue(LPCTSTR lpFieldName, double dblValue)
{
    _variant_t vtFld;
    vtFld.vt = VT_R8;
    vtFld.dblVal = dblValue;
        
    m_pRecordset->Fields->GetItem(lpFieldName)->Value = vtFld;
    return true;
    
}

bool CADORecordset::SetFieldValue(int nIndex, COleDateTime time)
{
    _variant_t vtFld;
    vtFld.vt = VT_DATE;
    vtFld.date = time;
    
    _variant_t vtIndex;
    
    vtIndex.vt = VT_I2;
    vtIndex.iVal = nIndex;
    
    m_pRecordset->Fields->GetItem(vtIndex)->Value = vtFld;
    return true;
    
}

bool CADORecordset::SetFieldValue(LPCTSTR lpFieldName, COleDateTime time)
{
    _variant_t vtFld;
    vtFld.vt = VT_DATE;
    vtFld.date = time;
    
    m_pRecordset->Fields->GetItem(lpFieldName)->Value = vtFld;
    return true;
    
}

bool CADORecordset::SetBookmark()
{
    if(m_varBookmark.vt != VT_EMPTY)
    {
        m_pRecordset->Bookmark = m_varBookmark;
        return true;
    }
    return false;
}

bool CADORecordset::Delete()
{
    if(m_pRecordset->Delete(adAffectCurrent) != S_OK)
        return false;

    if(m_pRecordset->Update() != S_OK)
        return false;

    return true;
}

bool CADORecordset::Find(LPCTSTR lpFind, int nSearchDirection)
{

    m_strFind = lpFind;
    m_nSearchDirection = nSearchDirection;

    ASSERT(!m_strFind.IsEmpty());

    if(m_nSearchDirection == searchForward)
    {
        m_pRecordset->Find(_bstr_t(m_strFind), 0, adSearchForward, "");
        if(!IsEof())
        {
            m_varBookFind = m_pRecordset->Bookmark;
            return true;
        }
    }
    else if(m_nSearchDirection == searchBackward)
    {
        m_pRecordset->Find(_bstr_t(m_strFind), 0, adSearchBackward, "");
        if(!IsBof())
        {
            m_varBookFind = m_pRecordset->Bookmark;
            return true;
        }
    }
    else
    {
        TRACE("Unknown parameter. %d", nSearchDirection);
        m_nSearchDirection = searchForward;
    }
    return false;
}

bool CADORecordset::FindFirst(LPCTSTR lpFind)
{
    m_pRecordset->MoveFirst();
    return Find(lpFind);
}

bool CADORecordset::FindNext()
{
    if(m_nSearchDirection == searchForward)
    {
        m_pRecordset->Find(_bstr_t(m_strFind), 1, adSearchForward, m_varBookFind);
        if(!IsEof())
        {
            m_varBookFind = m_pRecordset->Bookmark;
            return true;
        }
    }
    else
    {
        m_pRecordset->Find(_bstr_t(m_strFind), 1, adSearchBackward, m_varBookFind);
        if(!IsBof())
        {
            m_varBookFind = m_pRecordset->Bookmark;
            return true;
        }
    }
    return false;
}
/*
        //查询
        CADODatabase* pAdoDb = new CADODatabase();
        CString  sConnetionString = "Provider=SQLOLEDB.1;Password=evertop;Persist Security Info=True;User ID=sa;Initial Catalog=DataManage;Data Source=127.0.0.1";
        CADODatabase * pDB =new CADODatabase();//
        pDB->Open(_T(sConnetionString));
        BOOL bOpened=  pDB->IsOpen();
        CADORecordset * pdst =new CADORecordset(pDB);
        if (bOpened)
        {
            pdst->Close();
            pdst->Open(_T("SELECT *FROM [DataManage].[dbo].[NIBP]"));
            
            while(!pdst->IsEof())
            {
                CString strMsgText;
                pdst->GetFieldValue("SZY",strMsgText);
                MessageBox(strMsgText);
                
                pdst->MoveNext();
            }
        }
        delete pdst;
        delete pDB;
//-----------------------------------------------------------------------


    CString  sConnetionString = "Provider=SQLOLEDB.1;Password=evertop;Persist Security Info=True;User ID=sa;Initial Catalog=DataManage;Data Source=127.0.0.1";
    CADODatabase * pDB =new CADODatabase();//
    pDB->Open(_T(sConnetionString));

    CString strSQL = " INSERT INTO NIBP (SSY,SZY) VALUES ('80', '90')";
    pDB->BeginTransaction();
    try
    {
        pDB->Execute(strSQL);
        pDB->CommitTransaction();
    }
    catch (CMemoryException* e)
    {
        pDB->RollbackTransaction();
    }
    catch (CFileException* e)
    {
        pDB->RollbackTransaction();

    }
    catch (CException* e)
    {
        pDB->RollbackTransaction();

    }
     
    delete pDB;

 

posted @ 2016-02-25 15:51  風行  阅读(1406)  评论(0编辑  收藏  举报