请教ODBC API直接存二进制大文件的问题

jianhui323 jianhui323 墨衍会员 · AI 创作全网分发 墨衍智能分发 通过墨衍一键同步至各平台 可同步平台 CSDN微信公众号微博知乎掘金百家号博客园抖音小红书 你的文章也可以这样分发 墨衍会员 ¥399起/年,写一次发全网 我也要 + 加入社区
大家好,我新来的csdn。多多关照!我用ODBC无邦定的方式连接数据库,然后用ODBC API直接向access数据库里存大文件。但是怎么没存进去阿?请各位高手帮我看看代码:相片(一般1M以上)已经读入到内存了,但是数据库却没有变大,但是在数据库中的photo(OLE类型)字段已经改变了,变成了长二进制数据,如果各位做过的话,会明白我的意思。下面是代码:
CString strFilter = "JPEG文件 (*.jpg)|*.jpg|BMP文件 (*.bmp)|*.bmp|GIF文件 (*.gif)|*.gif||";
CFileDialog fileDialog(true, NULL, NULL, OFN_HIDEREADONLY|OFN_OVERWRITEPROMPT, strFilter);
CString strPathName;
CString strFileName;
if(fileDialog.DoModal() == IDOK)
{
strPathName = fileDialog.GetPathName();
strFileName = fileDialog.GetFileTitle();

CFile file;
if(!file.Open(strPathName, CFile::modeRead))
{
MessageBox("打开文件失败!", "提示");
return;
}
DWORD fileLength = file.GetLength();
HGLOBAL hMemory = NULL;
if((hMemory = ::GlobalAlloc(GMEM_MOVEABLE, fileLength)) == NULL)
{
MessageBox("创建内存失败", "提示");
return;
}

LPVOID lpBuf = ::GlobalLock(hMemory);
if(file.Read(lpBuf, fileLength) != fileLength)
{
MessageBox("读取文件失败", "提示");
return;
}
////////////////////////////////////////////
SQLHSTMT hsmt;
CDatabase db;
db.Open(this->m_strFileName);
CRecordset rs(&db);
CRecordset* pSet = &rs;
hsmt = pSet->m_hstmt;

//CString strInsert = "insert into jpg (photo) values (?) where id = 26";
CString strInsert = "update jpg set photo = ? where id = 38";//你先看一下数据库,
//把29改成31,31的photo是空的,
//然后插入,数据库变化了!但是不对
SQLPrepare(hsmt, (UCHAR*)strInsert.GetBuffer(strInsert.GetLength()), strInsert.GetLength());

SQLINTEGER cbDeptName = SQL_NTS;

SQLBindParameter(hsmt, 1, SQL_PARAM_INPUT, SQL_C_BINARY, SQL_LONGVARBINARY, 5, 0,
lpBuf, 0, &cbDeptName);

SQLPutData(hsmt, lpBuf, fileLength);
SQLExecute(hsmt);

pSet->Close();
db.Close();
::GlobalUnlock(hMemory);
::GlobalFree(hMemory);
}
else
return;

关键是这一块:
CString strInsert = "update jpg set photo = ? where id = 38";//你先看一下数据库,
//把29改成31,31的photo是空的,
//然后插入,数据库变化了!但是不对
SQLPrepare(hsmt, (UCHAR*)strInsert.GetBuffer(strInsert.GetLength()), strInsert.GetLength());

SQLINTEGER cbDeptName = SQL_NTS;

SQLBindParameter(hsmt, 1, SQL_PARAM_INPUT, SQL_C_BINARY, SQL_LONGVARBINARY, 5, 0,
lpBuf, 0, &cbDeptName);

SQLPutData(hsmt, lpBuf, fileLength);
SQLExecute(hsmt);
等待高手的解释,先谢谢阿。还有就是请不要说用别的方法实现。就题论题!
...全文

相关推荐

评论 17
收藏 已收藏
分享
返回顶部
jianhui323
资源 2,586 成员 18,437 内容