От:
Sheridan
Дата: 10.07.04 07:57
Оценка:
Не могу понять, почему вылетает...
...#define _DBInitPropNum 5...
// Открывает БД
bool CJanusDB::OpenDB(std::string DBFileName)
{
std::string temp;
char Char;
for (unsigned int i=DBFileName.size();i>0;i--)
{
Char = DBFileName[i];
if (Char=='\\' )
{
temp = DBFileName.substr(0,i+1);
break ;
}
}
temp = _T("DBQ=" ) + DBFileName + _T(";DefaultDir=" ) + temp
+ _T(";Driver={Driver do Microsoft Access (*.mdb)};DriverId=25;FIL=MS Access;MaxBufferSize=2048;MaxScanRows=8;PageTimeout=5;SafeTransactions=0;Threads=3;UID=admin;UserCommitSync=Yes;" );
USES_CONVERSION;
BSTR ProviderStr = A2W(temp.c_str());
//File = A2W(DBFileName.c_str());
CoCreateInstance(CLSID_MSDASQL,NULL,CLSCTX_INPROC_SERVER,IID_IDBInitialize,(void **)&pDBInitialize);
for (int i=0;i<_DBInitPropNum;i++)
{
VariantInit(&InitProperties[i].vValue);
InitProperties[i].dwOptions = DBPROPOPTIONS_REQUIRED;
InitProperties[i].colid = DB_NULLID;
}
InitProperties[0].dwPropertyID = DBPROP_INIT_PROMPT;
InitProperties[0].vValue.vt = VT_I2;
InitProperties[0].vValue.iVal = DBPROMPT_PROMPT;
InitProperties[1].dwPropertyID = DBPROP_INIT_PROVIDERSTRING;
InitProperties[1].vValue.vt = VT_BSTR;
InitProperties[1].vValue.bstrVal = ProviderStr;
InitProperties[2].dwPropertyID = DBPROP_AUTH_USERID;
InitProperties[2].vValue.vt = VT_BSTR;
InitProperties[2].vValue.bstrVal = SysAllocString((LPOLESTR)L"" );
InitProperties[3].dwPropertyID = DBPROP_AUTH_PASSWORD;
InitProperties[3].vValue.vt = VT_BSTR;
InitProperties[3].vValue.bstrVal = SysAllocString((LPOLESTR)L"" );
InitProperties[4].dwPropertyID = DBPROP_INIT_MODE;
InitProperties[4].vValue.vt = VT_I4;
InitProperties[4].vValue.lVal = DB_MODE_READWRITE;
rgInitPropSet[0].guidPropertySet = DBPROPSET_DBINIT;
rgInitPropSet[0].cProperties = _DBInitPropNum;
rgInitPropSet[0].rgProperties = InitProperties;
HRESULT res;
pDBInitialize->QueryInterface(IID_IDBProperties,(void **)&pIDBProperties);
res = pIDBProperties->SetProperties(1,rgInitPropSet); //вылетает тут -------------------------------
pIDBProperties->Release();
res = pDBInitialize->Initialize();
switch (res)
{
case S_OK: return true ; break ;
default :
{
CloseDB();
return false ;
}
}
return true ;
}
Оле инициализируется раньше.
Именно вылетает а не подключается... Может непрально проперти вписываю?
Matrix has you...
От:
EM
Дата: 11.07.04 13:55
Оценка:
Здравствуйте, Sheridan, Вы писали:
S>Не могу понять, почему вылетает...
S>S> res = pIDBProperties->SetProperties(1,rgInitPropSet); //вылетает тут -------------------------------
S>
S>Оле инициализируется раньше.
S>Именно вылетает а не подключается... Может непрально проперти вписываю?
Проверьте rgInitPropSet — там нужно указатель на DBPROPSET передавать ...
Опыт — это такая вещь, которая появляется сразу после того, как была нужна...
От:
Sheridan
Дата: 12.07.04 03:23
Оценка:
Здравствуйте, EM, Вы писали:
EM>Проверьте rgInitPropSet — там нужно указатель на DBPROPSET передавать ...
Так есть вроде-ж...
rgInitPropSet[0].guidPropertySet = DBPROPSET_DBINIT;
rgInitPropSet[0].cProperties = _DBInitPropNum;
rgInitPropSet[0].rgProperties = InitProperties; \\<-
Matrix has you...
Здравствуйте, Sheridan, Вы писали:
S>Не могу понять, почему вылетает...
S>...
S> USES_CONVERSION;
S> BSTR ProviderStr = A2W(temp.c_str());
S>...
S> InitProperties[1].dwPropertyID = DBPROP_INIT_PROVIDERSTRING;
S> InitProperties[1].vValue.vt = VT_BSTR;
S> InitProperties[1].vValue.bstrVal = ProviderStr;
S>...
ProviderStr был создан без использования SysAllocString, а потому не является BSTR.
[MSDN]
In the macro names, the source string type is on the left (for example, A) and the destination string type is on the right (for example, W). A stands for LPSTR, OLE stands for LPOLESTR, T stands for LPTSTR, and W stands for LPWSTR.
Thus, A2W converts an LPSTR to an LPWSTR, OLE2T converts an LPOLESTR to an LPTSTR, and so on.
[/MSDN]
PS
Кстати, тебе еще нужно очистить свои Варианты, которые аллокируют память.
for (/*int*/ i=0;i<_DBInitPropNum;i++)
{
VariantClear (&InitProperties[i].vValue);
}
Vita
Выше головы не прыгнешь, ниже земли не упадешь, дальше границы не убежишь! © КВН НГУ
От:
Sheridan
Дата: 12.07.04 04:31
Оценка:
Здравствуйте, Vi2, Вы писали:
Спасибо. Ошибка пропала, теперь выдает E_FAIL... В msdn насчет этого
E_FAIL
A provider-specific error occurred.
Не подскажете куды бечь? Параметры инициализации такие:
InitProperties[0].dwPropertyID = DBPROP_INIT_PROMPT;
InitProperties[0].vValue.vt = VT_I2;
InitProperties[0].vValue.iVal = DBPROMPT_PROMPT;
InitProperties[1].dwPropertyID = DBPROP_INIT_PROVIDERSTRING;
InitProperties[1].vValue.vt = VT_BSTR;
InitProperties[1].vValue.bstrVal = ProviderStr;
InitProperties[2].dwPropertyID = DBPROP_AUTH_USERID;
InitProperties[2].vValue.vt = VT_BSTR;
InitProperties[2].vValue.bstrVal = SysAllocString((LPOLESTR)L"" );
InitProperties[3].dwPropertyID = DBPROP_AUTH_PASSWORD;
InitProperties[3].vValue.vt = VT_BSTR;
InitProperties[3].vValue.bstrVal = SysAllocString((LPOLESTR)L"" );
InitProperties[4].dwPropertyID = DBPROP_INIT_MODE;
InitProperties[4].vValue.vt = VT_I4;
InitProperties[4].vValue.lVal = DB_MODE_READWRITE;
а првайдерстринг (ProviderStr) такого вот типа
_T("DBQ=" ) + Имя_mdb_файла_с_путем + _T(";DefaultDir=" ) + путь_к_файлу_mdb + _T(";Driver={Driver do Microsoft Access (*.mdb)};DriverId=25;FIL=MS Access;MaxBufferSize=2048;MaxScanRows=8;PageTimeout=5;SafeTransactions=0;Threads=3;UID=admin;UserCommitSync=Yes;" );
Подключаюсь к access'овой базе как видно...
Matrix has you...
Здравствуйте, Sheridan, Вы писали:
S>Ошибка пропала, теперь выдает E_FAIL... В msdn насчет этого
S>E_FAIL
S>A provider-specific error occurred.
S>Не подскажете куды бечь?
Увы. Это уже не СОМ.
Vita
Выше головы не прыгнешь, ниже земли не упадешь, дальше границы не убежишь! © КВН НГУ
От:
Sheridan
Дата: 12.07.04 07:35
Оценка:
Здравствуйте, Vi2, Вы писали:
Vi2>Здравствуйте, Sheridan, Вы писали:
S>>Ошибка пропала, теперь выдает E_FAIL... В msdn насчет этого
Vi2>S>>E_FAIL
S>>A provider-specific error occurred.
S>>Не подскажете куды бечь?
Vi2>Увы. Это уже не СОМ.
И всеже? Кто подключался таким образом к mdb? Помогите пожалуйста подключится к mdb базе не через dsn а к файлу, выбранному в диалоге... Типа "Открыть базу..."
Matrix has you...
Пока на собственное сообщение не было ответов, его можно удалить.
Удалить