ADO Record Add сразу после создания БД Access и таблицы
От: kosa2000  
Дата: 09.01.08 23:02
Оценка:
Привет!

Помогите разобраться, пожалуйста!
При старте приложения нужно создать БД, таблицу в ней и проапдейтить записи в ней.
Вот полный минимальный код отражающий суть.

Все исполняется без ошибок, но первое поле в БД получается "0".
Если в запросе для RecordSet'a поменять порядок полей, то второе поле будет "0".
То же самое если БД уже есть, но нет таблицы.
Если БД и таблица существуют то все в порядке.


#include "stdafx.h"

#include "comutil.h"

// ADO
#import "c:\Program Files\Common Files\system\ado\msadox.dll"
#import "c:\Program Files\Common Files\System\ADO\msado15.dll" no_namespace rename("EOF", "EndOfFile")


#define DB_E_DUPLICATEDATASOURCE         ((HRESULT)0x80040E17L)

HRESULT CreateAccessDatabase(LPCTSTR lpszFileName);

HRESULT CreateTable(LPCTSTR lpszFileName);
HRESULT UpdateTable(LPCTSTR lpszFileName);


int main(int argc, char* argv[])
{
    if (FAILED(::CoInitialize(NULL)))
        return -1;
    
    LPCTSTR lpszConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\\test.mdb;";
    
    if (CreateAccessDatabase(lpszConnectionString) == S_OK)
    {
        if (CreateTable(lpszConnectionString) == S_OK)
        {
            UpdateTable(lpszConnectionString);
        }
    }
    
    ::CoUninitialize();
    
    return 0;
}

HRESULT CreateAccessDatabase(LPCTSTR lpszConnectionString)
{
    HRESULT hr = E_FAIL;

    ADOX::_CatalogPtr DB = NULL;

    try
    {
        DB.CreateInstance(__uuidof (ADOX::Catalog));

        //This line creates a Jet database, and throws an exception if it already exists.
        DB->Create((_bstr_t)lpszConnectionString);

        hr = S_OK;
    }
    catch(_com_error &e)
    {
        if (e.Error() == DB_E_DUPLICATEDATASOURCE)
            hr = S_OK;
    }

    return hr;
}



HRESULT CreateTable(LPCTSTR lpszConnectionString)
{
    HRESULT hr = E_FAIL;

    try
    {
        _ConnectionPtr pConn;
        _CommandPtr pCmd;
        
        pConn.CreateInstance(__uuidof(Connection));
        pCmd.CreateInstance(__uuidof(Command));

        if (pConn->Open((_bstr_t)lpszConnectionString,"", "", adConnectUnspecified) == S_OK)
        {
            pCmd->ActiveConnection = pConn;
            pCmd->CommandType = adCmdText;
            pCmd->CommandText = (_bstr_t)("CREATE TABLE Customers (cCompanyName TEXT(50),cCustomerId TEXT(20))");

            try
            {
                pCmd->Execute(&vtMissing,&vtMissing,adCmdText);
                hr = S_OK;
            }
            catch(_com_error &e)
            {
                hr = e.Error();
                if (hr == 0x80040E14) // already exist
                    hr = S_OK;
            }

            pConn->Close();
        }
    }
    catch(_com_error &e)
    {
        hr = e.Error();
    }

    return hr;
}

HRESULT UpdateTable(LPCTSTR lpszConnectionString)
{
    HRESULT hr = E_FAIL;

    try
    {
        _ConnectionPtr pConn;
        _RecordsetPtr pRst;
        
        pConn.CreateInstance(__uuidof(Connection));
        pRst.CreateInstance(__uuidof(Recordset));

        if (pConn->Open((_bstr_t)lpszConnectionString,"", "", adConnectUnspecified) == S_OK)
        {
            LPCTSTR lpszQuery = "Select cCompanyName, cCustomerId From Customers";

            if (pRst->Open((_bstr_t)lpszQuery,variant_t((IDispatch *)pConn,true), adOpenStatic, adLockOptimistic, adCmdText) == S_OK)
            {    
                if (pRst->AddNew() == S_OK)
                {
                    pRst->Fields->GetItem("cCompanyName")->PutValue("Some Name");
                    pRst->Fields->GetItem("cCustomerId")->PutValue("Some ID");
                    hr = pRst->Update();
                }

                pRst->Close();
            }

            pConn->Close();
        }
    } 
    catch(_com_error &e)
    {
        hr = e.Error();
    }

    return hr;
}
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.