ADO+Sybase : 从数据库中存取图片,ACCESS可以Sybase不行,我这段代码那里有错?
////////////////////////////////////////
//读取图形
//////////////////////////////////////
int CDBFun::QueryPic(CString magiccard)
{
m_PicCount=0;
int ret=0;
_variant_t varBLOB;
VariantInit (&varBLOB);
CString str;
try
{
str.Format("SELECT sn,pic,patient_id FROM T_Pacs_Pic WHERE patient_id=\'%s\'",magiccard);
m_pRecordset->Open((_bstr_t)str,_variant_t((IDispatch*)m_pConnection,true),adOpenStatic,adLockOptimistic,adCmdText);
while(!m_pRecordset->adoEOF)
{
//read data
long lDataLength = m_pRecordset->Fields->GetItem("pic")->ActualSize;
varBLOB = m_pRecordset->GetFields()->GetItem("pic")->GetChunk(lDataLength);
if(varBLOB.vt == (VT_ARRAY | VT_UI1))
{
BYTE *pBuf = NULL;
SafeArrayAccessData(varBLOB.parray,(void **)&pBuf);
CString strFileName ;
strFileName.Format("%stmp%d.bmp",theApp.TEMP_PATHNAME,ret);
CFile outFile;
outFile.Open(strFileName,CFile::modeCreate|CFile::modeWrite);
outFile.Write(pBuf,lDataLength);
outFile.Close();
SafeArrayUnaccessData (varBLOB.parray);
ret++;
}
m_pRecordset->MoveNext();
}
m_pRecordset->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);
}
m_PicCount=ret;
return ret;
}
////////////////////////////////////////
//保存图形
//////////////////////////////////////
void CDBFun::AddPic(CString filename,CString magiccard)
{
CFile imagefile;
if(0 == imagefile.Open(filename,CFile::modeRead))
return;
_variant_t vID,vPatientID,vSn;
BYTE* pbuf;
long nLength = imagefile.GetLength();
pbuf = new BYTE[nLength+2];
if(pbuf == NULL)
return;
imagefile.Read(pbuf,nLength);
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, pbuf++);
VARIANT varBLOB;
varBLOB.vt = VT_ARRAY | VT_UI1;
varBLOB.parray = psa;
try
{
m_pRecordset->Open("T_Pacs_Pic",_variant_t((IDispatch *) m_pConnection,true),adOpenKeyset,adLockOptimistic,adCmdTable); //Open a Table
m_pRecordset->AddNew();
m_pRecordset->Fields->GetItem("pic")->AppendChunk(varBLOB);
vPatientID.vt=VT_BSTR;
vPatientID.bstrVal=magiccard.AllocSysString ( ) ;
vSn.vt=VT_I2;
vSn.iVal=m_PicCount+1;
m_pRecordset->PutCollect("patient_id",vPatientID);
m_pRecordset->PutCollect("sn",vSn);
m_pRecordset->Update();
m_pRecordset->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);
}
}
//////////////////////////////////////////
这段代码用于access时执行正确,连接到sybase读出来的图形数据老是4096字节,不知何故,头疼!高手搭救!!!
问题点数:100、回复次数:17Top
1 楼pinel()回复于 2002-02-04 17:27:47 得分 0
保存好像可以了,但是
long lDataLength = m_pRecordset->Fields->GetItem("pic")->ActualSize;
读出的长度为4096,为什么????Top
2 楼pinel()回复于 2002-02-05 09:23:49 得分 0
Access的字段类型是ole对象,sybase类型是image,有什么区别?
自说自话很久了,有没有人答理一下Top
3 楼xiaowu_li(lixiaowu)回复于 2002-02-05 09:50:01 得分 20
这种方法是不是只能保存bmp格式的图片?Top
4 楼pinel()回复于 2002-02-05 13:12:27 得分 0
我保存的就是bmp,但是因为保存进去的是字节,我想不一定和格式有关,不一定是图片,可以是任何大字节的东西
有没有人做过sybase指教一下Top
5 楼pinel()回复于 2002-02-05 13:58:58 得分 0
?Top
6 楼pinel()回复于 2002-02-05 17:01:19 得分 0
送送送送
送送送
送送送
送送送
送送 送送送
送送送 送送送
送送送送 送送送
送送送送 送送送送
送送送送 送送送送送
送送送送 送送送送送
送送送 送送送送送送
送送送 送送送送送送送送
送送送 送送 送送送送送送送送
送送送 送送送送送送
送送 送送送送送送 送送送送
送送送 送送送送送送送送 送送送送
送送送送 送送送
送送送送 送送送
送送送 送送送
送送送送 送送送
送送送送 送送送送
送送送 送送送
送送送送 送送送
送送送 送送 送送送送
送送送 送送送送送送
送送送 送送送送送
送送送
Top
7 楼uniware(uniware)回复于 2002-02-05 17:34:37 得分 20
有的数据源不能立即返回长数据的精确长度,
因此建议你循环取数据GetChunk(),直到取出的长度为0为止
Top
8 楼pinel()回复于 2002-02-06 09:48:45 得分 0
试试
Top
9 楼whiskers(胡子)回复于 2002-02-06 10:06:53 得分 0
可以用READTEXT
USE pubs
DECLARE @val varbinary(16)
SELECT @val = textptr(pr_info) FROM pub_info
WHERE pub_id = '0736'
READTEXT pub_info.pr_info @val 4 10
Top
10 楼pinel()回复于 2002-02-06 10:15:12 得分 0
有点门道Top
11 楼searoc(希拉克)回复于 2002-02-06 10:30:45 得分 20
请问你的PIC字段是什么类型的,我以前也出现过类似问题。
已经轻松解决,不知道你的问题和我的是否类似。
如果是的话,我把源码给你。
说说看看吧Top
12 楼pinel()回复于 2002-02-06 12:44:17 得分 0
searoc(夏雨) :谢谢
Access的字段类型是ole对象,sybase类型是image,
第一次碰到sybase,不知道是不是可以用binary类型
pinel@263.net
Top
13 楼whiskers(胡子)回复于 2002-02-07 11:11:59 得分 20
Sybase数据库的缺省值
将@@TEXTSIZE付值即可
Top
14 楼WindowsMe(美女免费)回复于 2002-02-08 17:59:34 得分 20
不可能吧
我也在sybase上用过,取actualsize是准确的
vb6+ado 2.1+sybase ole db 2.1+sybase 11.9
你用高版本ADO试试Top
15 楼pinel()回复于 2002-02-19 17:34:54 得分 0
我用15,高版本应该import什么?我没找到dll,是不是tlbTop
16 楼pinel()回复于 2002-02-19 22:49:47 得分 0
还没搞定,气晕了,
小于4096的图片是可以的,原来一次只能取出4096,怎么分段读取阿?
whiskers(胡子),你的readtext的语句通不过编译,@val varbinary(16)是不是16字节的文件指针?readtext后面的4 10什么意思?从第四个字节开始往后读10个字节?为什么这么做?
@@TEXTSIZE缺省值是32768,不是4096阿
Top
17 楼pinel()回复于 2002-02-20 09:13:04 得分 0
将@@TEXTSIZE付值语句怎么写?Top




