Привет!
Помогите разобраться, пожалуйста!
При старте приложения нужно создать БД, таблицу в ней и проапдейтить записи в ней.
Вот полный минимальный код отражающий суть.
Все исполняется без ошибок, но первое поле в БД получается "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;
}