OLE DB посыл ошибки клиенту
От: abrec Россия  
Дата: 18.04.05 05:39
Оценка:
Здравствуйте!
Как мне кажется перерыл тонну документации — результат 0. Проблема в следующем. На стороне OLE DB Provider генерирую ошибку следующим образом:

HRESULT hr;
IClassFactory *pErrorObjectFactory = NULL;
IErrorInfo *pErrorInfo = NULL;
IErrorRecords *pErrorRecords = NULL;

GetErrorInfo(0, &pErrorInfo);
if (!pErrorInfo)
{
CoGetClassObject(CLSID_EXTENDEDERRORINFO,
CLSCTX_INPROC_SERVER,
NULL, // Reserved, must be NULL
IID_IClassFactory,
(LPVOID *)&pErrorObjectFactory);

hr = pErrorObjectFactory->CreateInstance(NULL, IID_IErrorInfo,
(void**) &pErrorInfo);
if (pErrorInfo != NULL && hr == S_OK)
{

//Query interface
hr = pErrorInfo->QueryInterface
(
IID_IErrorRecords,
(void**)&pErrorRecords
);
if (pErrorRecords != NULL && hr == S_OK)
{
ERRORINFO errorinfo;
errorinfo.clsid = CLSID_MySqlProv;
errorinfo.dispid = NULL;
errorinfo.dwMinor = dwError;//dwError приходит в функцию
errorinfo.hrError = hrError;//hrError приходит в функцию
errorinfo.iid = IID_ICommand;//приходит в функцию

// Set up a parameter to pass to the object.
VARIANTARG varg;
VariantInit (&varg);
DISPPARAMS dispparams = {&varg, NULL, 1, 0};

varg.vt = VT_BSTR;
varg.bstrVal = SysAllocString(A2WBSTR(pszText));//pszText приходит в функцию
hr = pErrorRecords->AddErrorRecord(&errorinfo, errorinfo.dwMinor, &dispparams,NULL,0);
VariantClear(&varg);
hr = SetErrorInfo(0, pErrorInfo);

}
}
}

if (pErrorRecords)
pErrorRecords->Release();
if (pErrorInfo)
pErrorInfo->Release();
if(pErrorObjectFactory)
pErrorObjectFactory->Release();

return hrError;


На стороне клиента в Басице делаю следующее:

Dim cmd As New ADODB.Command
On Error GoTo err_section
conn.CursorLocation = adUseServer
conn.Open "Provider=MySqlProvAS;Data Source=mydb;Integrated Security="""";Password=""blabla"";User ID=lama;Location=localhost;Extended Properties="""""
cmd.ActiveConnection = conn
cmd.CommandText = "select * from mytable" 'такой таблицы нет
cmd.Execute
Exit Sub
err_section:
MsgBox conn.Errors(0).Description & vbCrLf & conn.Errors(0).NativeError & vbCrLf _
& conn.Errors(0).Number & vbCrLf & conn.Errors(0).Source _
& vbCrLf & conn.Errors(0).SQLState

в итоге получаю только NativeError и Number. Description кудато замылился.
Пробовал в AddErrorRecord пихать IErrorInfo, созданный CreateErrorInfo и заполненный — все нормально, но мне туда надо ISQLErrorInfo пихать. Тогда как быть с Description. Что то я запутался. Помогите кто может. Заранее спасибо.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.