vc鏈接mysql數據庫的方法

    前段時間項目中用的是mysql數據庫,它的鏈接方法有二種,一種是數據庫自帶的API,還有一種就用ADO鏈接了。mysql

    因爲本次項目用的mysql數據庫只是暫時的,後期可能會更改成MSSQL,因此若是用mysql自帶的API鏈接移植性很差,因此改成ADO的,到時只要修改下字符串鏈接值就好了。sql

    其實ADO鏈接的底層也是調用的ODBC驅動去鏈接,因此須要去下載個數據庫對應的ODBC驅動,別人說祕本須要對應,要否則鏈接不上,我沒有作太多測試,本身用的6.0版本,因此去官網下載了個mysql-connector-odbc-5.3.4-winx64版本的,而後對應的字符串爲:數據庫

driver={MySQL ODBC 5.3 ANSI Driver};Server=localhost;DATABASE=*;USER=*;PASSWORD=*;OPTION=3;

實測是能夠鏈接成功的。ide

下面放出本身寫的一個超級簡單的類:測試

#pragma once

#import <C:\Program Files\Common Files\System\ADO\msado15.dll> no_namespace rename("EOF", "adoEOF")
// #import "msado15.DLL"   rename_namespace("ADOWE") rename("EOF","adoEOF")  
// using namespace ADOWE;


class CAdoDatabase
{
public:
    CAdoDatabase(void);
public:
    ~CAdoDatabase(void);
public:
    //BOOL Connect(CString csConnectStr,CString csUser,CString csPasswd);
    //鏈接
    BOOL Connect(CString csConnectStr);
    //斷開鏈接
    BOOL DisConn();
    //執行語句
    BOOL Execute(CString csSQL);
    //是否鏈接
    BOOL IsConn();
    //返回結果的行數
    int  QueryDataForRecord(CString csSql,CStringArray& csa);
private:
    _ConnectionPtr m_pConn;
    _RecordsetPtr  m_pRecord;
};

實現:ui

BOOL CAdoDatabase::Connect(CString csConnectStr)
{
    HRESULT hr;
    try
    {
        hr = m_pConn.CreateInstance(__uuidof(Connection));
        //hr = m_pConn.CreateInstance("ADODB.Connection");
        //m_pConn->Open(_bstr_t(csConnectStr),"","",ADODB::adConnectUnspecified);
        m_pConn->Open(_bstr_t(csConnectStr),"","",adModeUnknown);
        return TRUE;
    }
    catch (_com_error e)
    {
        CString csErrorMsg;
        csErrorMsg.Format(_T("鏈接數據庫出錯:%s"),e.ErrorMessage());
        AfxMessageBox(csErrorMsg,MB_OK+MB_ICONERROR);
        return FALSE;
    }
}

BOOL CAdoDatabase::DisConn()
{
    if (m_pConn->State)
    {
        m_pConn->Close();
        m_pConn = NULL;
        return TRUE;
    }
    return FALSE;
}

BOOL CAdoDatabase::Execute(CString csSQL)
{
    try
    {
        _variant_t RecordsAffected;
        m_pConn->Execute((_bstr_t)csSQL,&RecordsAffected,adCmdText);
        return TRUE;
    }catch(_com_error e)
    {
        CString csMsg;
        csMsg.Format(_T("執行SQL語句出錯:%s"),e.ErrorMessage());
        AfxMessageBox(csMsg,MB_OK+MB_ICONERROR);
        return FALSE;
    }
}


int CAdoDatabase::QueryDataForRecord(CString csSql, CStringArray &csa)
{
    try
    {
        m_pRecord.CreateInstance(__uuidof(Recordset));
        //m_pRecord->Open((_bstr_t)csSql,m_pConn.GetInterfacePtr(),adOpenStatic,adLockOptimistic,adCmdText);
        m_pRecord->Open((_bstr_t)csSql,_variant_t((IDispatch *)m_pConn, true),adOpenKeyset,adLockReadOnly,adCmdText);
        int nCount;
        int nRowCount = 0;
        nCount = m_pRecord->Fields->GetCount();
        _variant_t vt;
        while (!m_pRecord->adoEOF)
        {
            for (int i=0; i<nCount; i++)
            {
                vt =m_pRecord->Fields->GetItem(long(i))->GetValue();
                if (vt.vt == VT_NULL)
                {
                    vt = _T("");
                }
                csa.Add(vt);
            }
            nRowCount++;
            m_pRecord->MoveNext();
        }
        m_pRecord->Close();
        return nRowCount;
    }catch(_com_error e)
    {
        CString csMsg;
        csMsg.Format(_T("查詢語句出錯:%s"),e.ErrorMessage());
        AfxMessageBox(csMsg,MB_OK+MB_ICONERROR);
        return -1;
    }
}


此代碼運行平臺爲WIN7,我把它放到XP上運行時,提示無效指針,網上查了下是平臺兼容性的問題,換到其它WIN7電腦上可成功運行。因此也沒管它了,有解決的小夥伴,能夠提供下方法,謝謝!
spa

相關文章
相關標籤/搜索