需要将语音文件保存到数据库、从数据库读取并播放,或保存为另外一个语音文件。多谢啦!
解决方案 »
- 各位帮忙顶一下,我好结帖。。。建议CSDN改进
- 关于字体的缩放!
- mfc classwizard里找不到我新建的类
- 处理一个比较大的文本文件(5M左右),其中有很多重复的行,要去掉这些重复行,有没有什么好的算法?
- 请教OnInitDialog与DoModal()的关系~
- 如何理解IE中的一些设置(cookie、ActiveX控件等)?
- ######如何用vc偷偷调用OUTLOOK对外发送邮件啊?马上给分!谢谢先!!!!
- 那里有VC++的入门教程下载?
- directshow中,能设置avi文件的桢数吗?
- 想问下mfc中绘图到底有什么用。用来做什么?做界面么?
- 新手求助:为什么会弹出对话框“记录集是只读”
- 请问:无效的游标状态,什么原因?
if(0 == imagefile.Open("d:\\user\\bmp.bmp",CFile::modeRead))
return;
_RecordsetPtr pRs = NULL;
_ConnectionPtr pConnection = NULL;
_variant_t varChunk;
HRESULT hr;
BYTE* pbuf;
long nLength = imagefile.GetLength();
pbuf = new BYTE[nLength+2];
if(pbuf == NULL)
return; //allocate memory error;
imagefile.Read(pbuf,nLength); //read the file into memory BYTE *pBufEx;
pBufEx = pbuf;
//build a SAFFERRAY
SAFEARRAY* psa;
SAFEARRAYBOUND rgsabound[1];
rgsabound[0].lLbound = 0;
rgsabound[0].cElements = nLength;
psa = SafeArrayCreate(VT_UI1, 1, rgsabound); for (long i = 0; i < nLength; i++)
SafeArrayPutElement (psa, &i, pBufEx++);
VARIANT varBLOB;
varBLOB.vt = VT_ARRAY | VT_UI1;
varBLOB.parray = psa; _bstr_t strCnn("Provider=SQLOLEDB.1;Integrated Security=SSPI;Persist Security Info=False;Initial Catalog=CUSTOM;Data Source=SERVER");
try
{
//Open a connection
pConnection.CreateInstance(__uuidof(Connection));
hr = pConnection->Open(strCnn,"","",NULL); //Connect a DataBase
pRs.CreateInstance(__uuidof(Recordset));
pRs->Open("CustomInfo",_variant_t((IDispatch *) pConnection,true),adOpenKeyset,adLockOptimistic,adCmdTable); //Open a Table
// pRs->AddNew();
pRs->Fields->GetItem("Image")->AppendChunk(varBLOB);
pRs->Update();
pRs->Close();
pConnection->Close();
}
catch(_com_error &e)
{
// Notify the user of errors if any.
_bstr_t bstrSource(e.Source());
_bstr_t bstrDescription(e.Description());
CString sError;
sError.Format("Source : %s \n Description : %s\n",(LPCSTR)bstrSource,(LPCSTR)bstrDescription);
AfxMessageBox(sError);
}2. VC把数据库中IMAGE字段取出存为文件 _RecordsetPtr pRs = NULL;
_ConnectionPtr pConnection = NULL;
_variant_t varChunk;
HRESULT hr;
VARIANT varBLOB;
_bstr_t strCnn("Provider=SQLOLEDB.1;Integrated Security=SSPI;Persist Security Info=False;Initial Catalog=CUSTOM;Data Source=SERVER");
try
{
//Open a connection
pConnection.CreateInstance(__uuidof(Connection));
hr = pConnection->Open(strCnn,"","",NULL);
pRs.CreateInstance(__uuidof(Recordset));
pRs->Open("CustomInfo",_variant_t((IDispatch *) pConnection,true),adOpenKeyset,adLockOptimistic,adCmdTable);
//read data
long lDataLength = pRs->Fields->GetItem("Image")->ActualSize;
varBLOB = pRs->GetFields()->GetItem("Image")->GetChunk(lDataLength);
if(varBLOB.vt == (VT_ARRAY | VT_UI1))
{
BYTE *pBuf = NULL;
pBuf = (BYTE*)GlobalAlloc(GMEM_FIXED,lDataLength);
SafeArrayAccessData(varBLOB.parray,(void **)pBuf);
//Build a File in Windows Temp Directory
char tmpPath[_MAX_PATH+1];
GetTempPath(_MAX_PATH,tmpPath);
CString strFileName = "temp.bmp";
strFileName = tmpPath+strFileName;
CFile outFile(strFileName,CFile::modeCreate|CFile::modeWrite);
LPSTR buffer = (LPSTR)GlobalLock((HGLOBAL)pBuf);
outFile.WriteHuge(buffer,lDataLength);
GlobalUnlock((HGLOBAL)pBuf);
outFile.Close();
SafeArrayUnaccessData (varBLOB.parray);
} pRs->Close();
pConnection->Close();
}
catch(_com_error &e)
{
// Notify the user of errors if any.
_bstr_t bstrSource(e.Source());
_bstr_t bstrDescription(e.Description());
CString sError;
sError.Format("Source : %s \n Description : %s\n",(LPCSTR)bstrSource,(LPCSTR)bstrDescription);
AfxMessageBox(sError);
}
_variant_t v;
int nSize;
v.Clear();
SAFEARRAY *pArray = NULL;
pArray = SafeArrayCreateVector(VT_UI1,0,nSize);
if(!pArray) return false; BYTE *pArrayBuf = NULL;
if(FAILED(SafeArrayAccessData(pArray, (void**)&pArrayBuf))){
SafeArrayDestroy(pArray);
return false;
}
memcpy(pArrayBuf, pBuf, nSize);
SafeArrayUnaccessData(pArray); v.vt = VT_ARRAY | VT_UI1;
v.parray = pArray; pRecordset->addnew();
pRecordset->Fields->GetItem(nIndex)->PutValue(v);
up
Blob 数据的存储问题,http://www.vckbase.com/上有一个存图像的例子,没有什么区别
不一样大,那么取出来得数据是错误的吗?
如果你要分几次进行存储的话,注意最后的那一部分的处理,appendchunk()存的是整个_variant_t变量