BUG: ADO Recordset GetString() Function Throws an Access Violation in Oleaut32.dllID: Q230276
|
Calling the GetString() function on a _RecordsetPtr object may cause the following error to occur:
Unhandled Exception in <application name> (OLEAUT32.DLL) : 0xC0000005: Access Violation
The #import-generated wrapper function GetString() passes an uninitialized BSTR pointer to the ADO raw_GetString() function as an out parameter. The raw_GetString() function incorrectly calls the SysFreeString() function on the parameter if it is not pointing to NULL.
Call the raw_GetString directly and pass a BSTR pointer that points to NULL as the output parameter, or create a wrapper function as described in the More Information section.
Microsoft has confirmed this to be a problem in the Microsoft products listed
at the beginning of this article.
#include "stdafx.h"
#include <iostream.h>
#import "C:\Program Files\Common Files\System\ado\msado15.dll" no_namespace rename( "EOF", "adoEOF" )
struct InitOle {
InitOle() { ::CoInitialize(NULL); }
~InitOle() { ::CoUninitialize(); }
} _init_InitOle_;
int main(int argc, char* argv[])
{
try {
_ConnectionPtr pCon(__uuidof(Connection));
_RecordsetPtr pRs(__uuidof(Recordset));
pCon->ConnectionString = L"Provider=SQLOLEDB.1; Server=(local);Initial Catalog=pubs; User Id=sa; Password=;";
pCon->Open(L"",L"",L"",-1);
pRs->Open(L"SELECT * FROM authors",pCon.GetInterfacePtr(),adOpenStatic,adLockOptimistic,-1);
_bstr_t btRecordset;
btRecordset = pRs->GetString(adClipString,-1,L",",L"\r\n",L"<NULL>");
cout << (char*) btRecordset << endl;
}
catch (_com_error& e)
{
cout << e.ErrorMessage() << endl;
}
return 0;
}
BSTR bstrResult = NULL;
_bstr_t btColDelim(L",");
_bstr_t btRowDelim(L"\r\n");
_bstr_t btNullExp(L"<NULL>");
HRESULT hr = pRs->raw_GetString(adClipString,-1,btColDelim,btRowDelim,btNullExp,&bstrResult);
if (FAILED(hr)) _com_issue_errorex(hr, pRs, __uuidof(pRs));
btRecordset = bstrResult;
-or-
inline _bstr_t GetString2 ( _RecordsetPtr pRs, enum StringFormatEnum StringFormat, long NumRows, _bstr_t ColumnDelimeter, _bstr_t RowDelimeter, _bstr_t NullExpr )
{
BSTR _result = NULL;
HRESULT _hr = pRs->raw_GetString(StringFormat, NumRows, ColumnDelimeter, RowDelimeter, NullExpr, &_result);
if (FAILED(_hr)) _com_issue_errorex(_hr, pRs, __uuidof(pRs));
return _bstr_t(_result, false);
}
You can call this function in the main() function as follows:
btRecordset = GetString2(pRs,adClipString,-1,L",",L"\r\n",L"<NULL>");
Additional query words: mdac
Keywords : kbADO kbDatabase kbMDAC kbGrpVCDB kbGrpMDAC
Version : WINDOWS:2.0,2.1,6.0
Platform : WINDOWS
Issue type : kbbug
Last Reviewed: May 7, 1999