我正在尝试将文件插入 MS Access 数据库的字段中OLE Object
类型。我在用C++
and ADO
.
目前我收到错误Invalid pointer error
.罢工>
我认为我的问题是错误处理变体,因为这是我第一次使用它们。我正在学习这段代码示例 http://msdn.microsoft.com/en-us/library/windows/desktop/ms676103%28v=vs.85%29.aspx但在理解如何将文件从磁盘插入到variant
.
他们从数据库中读取它,并将其复制到新记录中,因此我从磁盘读取文件然后将其插入变体的部分丢失了。
当选择菜单项时,我在 GUI 中触发我的代码。数据库有一张表,名为test
有字段ID
这是主键并且field
这是属于OLE Object
type.
在网上搜索后,我没有发现任何可以帮助我的东西。
这是说明问题的最小代码片段(错误检查最少):
wchar_t *bstrConnect = L"Provider=Microsoft.ACE.OLEDB.12.0; \
Data Source = C:\\Users\\Smiljkovic85\\Desktop\\OLE.accdb";
try
{
HRESULT hr = CoInitialize(NULL);
// connection
ADODB::_ConnectionPtr pConn(L"ADODB.Connection");
// recordset
ADODB::_RecordsetPtr pRS(L"ADODB.Recordset");
// connect to DB
hr = pConn->Open(bstrConnect, L"admin", L"", ADODB::adConnectUnspecified);
// open file
std::ifstream in(L"C:\\Users\\Smiljkovic85\\Desktop\\file.pdf",
std::ios::ate | std::ios::binary);
// get file size
int fileSize = in.tellg();
// here I tried to adapt code from the example linked above
pRS->Open(L"test", _variant_t((IDispatch*)pConn, true),
ADODB::adOpenKeyset, ADODB::adLockOptimistic, ADODB::adCmdTable);
// add new record
pRS->AddNew();
// copy pasted
_variant_t varChunk;
SAFEARRAY FAR *psa;
SAFEARRAYBOUND rgsabound[1];
rgsabound[0].lLbound = 0;
// modify to our file size
rgsabound[0].cElements = fileSize;
psa = SafeArrayCreate(VT_UI1, 1, rgsabound);
//=================== try to add file into variant
char *chData = (char *)psa->pvData;
chData = new char[fileSize];
in.read(chData, fileSize);
/* ============= I have even tried the following :
char *chData = new char[fileSize];
in.read(chData, fileSize);
BYTE* pData;
SafeArrayAccessData(psa, (void **)&pData);
memcpy(pData, chData, fileSize);
SafeArrayUnaccessData(psa);
===============*/
//=================================================
// Assign the Safe array to a variant.
varChunk.vt = VT_ARRAY | VT_UI1;
varChunk.parray = psa;
pRS->Fields->GetItem(L"field")->AppendChunk(varChunk);
// add this record into DB
pRS->Update();
// cleanup
delete[] chData;
in.close();
pRS->Close();
pConn->Close();
CoUninitialize();
}
catch (_com_error e)
{
MessageBox(hWnd, (LPWSTR)e.Description(), L"", 0);
}
你能帮我修改这个代码片段,以便我可以将文件插入到变体中吗?
EDIT:
我在这里搜索了帮助和两篇给了我想法的帖子。我的解决方案仍然不起作用。您可以在上面的代码片段的注释中看到它们。
我现在得到的是以下错误:a problem occurred while microsoft access was communicating with the ole server or activex control
在 MS Access 中。我在网上搜索了解决方案,但没有运气,每个链接都声称它与访问有关,而不是与代码有关。
请帮忙...