Ole DB
От: 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;
}

Оле инициализируется раньше.
Именно вылетает а не подключается... Может непрально проперти вписываю?
-= ICQ:1887019 =--= http://djhacker.boom.ru/ =--= -=...avanced lamer...=- =-
Matrix has you...
Re: Ole DB
От: EM Великобритания  
Дата: 11.07.04 13:55
Оценка:
Здравствуйте, Sheridan, Вы писали:

S>Не могу понять, почему вылетает...

S>
S> res = pIDBProperties->SetProperties(1,rgInitPropSet); //вылетает тут -------------------------------
S>

S>Оле инициализируется раньше.
S>Именно вылетает а не подключается... Может непрально проперти вписываю?


Проверьте rgInitPropSet — там нужно указатель на DBPROPSET передавать ...
Опыт — это такая вещь, которая появляется сразу после того, как была нужна...
Re[2]: Ole DB
От: Sheridan Россия  
Дата: 12.07.04 03:23
Оценка:
Здравствуйте, EM, Вы писали:
EM>Проверьте rgInitPropSet — там нужно указатель на DBPROPSET передавать ...
Так есть вроде-ж...
 rgInitPropSet[0].guidPropertySet = DBPROPSET_DBINIT;
 rgInitPropSet[0].cProperties = _DBInitPropNum;
 rgInitPropSet[0].rgProperties = InitProperties; \\<-
-= ICQ:1887019 =--= http://djhacker.boom.ru/ =--= Believe in the Matrix... =- [...и Winamp молчит...]
Matrix has you...
Re: Ole DB
От: Vi2 Удмуртия http://www.adem.ru
Дата: 12.07.04 03:58
Оценка: 3 (1)
Здравствуйте, 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
Выше головы не прыгнешь, ниже земли не упадешь, дальше границы не убежишь! © КВН НГУ
Re[2]: Ole DB
От: 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'овой базе как видно...
-= ICQ:1887019 =--= http://djhacker.boom.ru/ =--= ...и больше века длится такт... =--=[Технология — Там]=-
Matrix has you...
Re[3]: Ole DB
От: Vi2 Удмуртия http://www.adem.ru
Дата: 12.07.04 06:56
Оценка:
Здравствуйте, Sheridan, Вы писали:

S>Ошибка пропала, теперь выдает E_FAIL... В msdn насчет этого

S>E_FAIL
S>A provider-specific error occurred.

S>Не подскажете куды бечь?

Увы. Это уже не СОМ.
Vita
Выше головы не прыгнешь, ниже земли не упадешь, дальше границы не убежишь! © КВН НГУ
Re[4]: Ole DB
От: 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 а к файлу, выбранному в диалоге... Типа "Открыть базу..."
-= ICQ:1887019 =--= http://djhacker.boom.ru/ =--= Believe in the Matrix... =--=[...и Winamp молчит...]=-
Matrix has you...
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.