请教ODBC API直接存二进制大文件的问题
大家好,我新来的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);
等待高手的解释,先谢谢阿。还有就是请不要说用别的方法实现。就题论题!