我以前用vb+dao做过,access的字段类型先要定义为ole类型的,其实也就是长二进制文件 Option Explicit '******************************************************** '名称:clsBinaryFile(二进制文件类) '参数:无 '返回:无 '功能:用于处理二进制文件存储到数据库 '说明:需要有DAO引用 '日期:2003-3-12 '程序员: '******************************************************** Private mstrFileName As String '文件名称(含路径) ''文件名称属性(含路径) Public Property Get FileName() As String FileName = mstrFileName End Property Public Property Let FileName(ByVal strNewFileName As String) mstrFileName = strNewFileName End Property '******************************************************** '名称:SaveToField '参数:fldTarget:要存储的字段名称 '返回: '功能:把二进制文件写到字段中 '说明: '日期:2003-2-13 '程序员: '******************************************************** Public Sub SaveToField(fldTarget As Field) Dim intFileNumber As Integer '文件号 Dim lngFileLength As Long '文件的长度 Dim bytBuffer() As Byte '文件的内容
'得到一个可用的文件号 intFileNumber = FreeFile() '打开文件读出内容 Open mstrFileName For Binary Access Read As #intFileNumber lngFileLength = LOF(intFileNumber) ReDim bytBuffer(lngFileLength - 1) Get #intFileNumber, 1, bytBuffer() Close #intFileNumber '写到目标字段 fldTarget.AppendChunk bytBuffer()
End Sub
'******************************************************** '名称:SaveFromField '参数:fldSource:要读出的字段名称 '返回: '功能:把二进制文件写到字段中 '说明: '日期:2003-2-13 '程序员: '******************************************************** Public Sub SaveFromField(fldSource As Field) Dim intFileNumber As Integer '文件号 Dim lngFileLength As Long '文件的长度 Dim bytBuffer() As Byte '文件的内容
'读出字段中的数据 '也可用此语句替换下两行bytbuffer=fldSource lngFileLength = fldSource.FieldSize bytBuffer() = fldSource.GetChunk(0, lngFileLength) '得到一个可用的文件号 intFileNumber = FreeFile() '写到文件中 Open mstrFileName For Binary Access Write As #intFileNumber Put #intFileNumber, 1, bytBuffer() Close #intFileNumber End Sub另外帮你找了个例子,不知道你是否可以用上1. VC把一个文件存入数据库 CFile imagefile; 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
我以前用vb+dao做过,access的字段类型先要定义为ole类型的,其实也就是长二进制文件
Option Explicit
'********************************************************
'名称:clsBinaryFile(二进制文件类)
'参数:无
'返回:无
'功能:用于处理二进制文件存储到数据库
'说明:需要有DAO引用
'日期:2003-3-12
'程序员:
'********************************************************
Private mstrFileName As String '文件名称(含路径)
''文件名称属性(含路径)
Public Property Get FileName() As String
FileName = mstrFileName
End Property
Public Property Let FileName(ByVal strNewFileName As String)
mstrFileName = strNewFileName
End Property
'********************************************************
'名称:SaveToField
'参数:fldTarget:要存储的字段名称
'返回:
'功能:把二进制文件写到字段中
'说明:
'日期:2003-2-13
'程序员:
'********************************************************
Public Sub SaveToField(fldTarget As Field)
Dim intFileNumber As Integer '文件号
Dim lngFileLength As Long '文件的长度
Dim bytBuffer() As Byte '文件的内容
'得到一个可用的文件号
intFileNumber = FreeFile()
'打开文件读出内容
Open mstrFileName For Binary Access Read As #intFileNumber
lngFileLength = LOF(intFileNumber)
ReDim bytBuffer(lngFileLength - 1)
Get #intFileNumber, 1, bytBuffer()
Close #intFileNumber
'写到目标字段
fldTarget.AppendChunk bytBuffer()
End Sub
'********************************************************
'名称:SaveFromField
'参数:fldSource:要读出的字段名称
'返回:
'功能:把二进制文件写到字段中
'说明:
'日期:2003-2-13
'程序员:
'********************************************************
Public Sub SaveFromField(fldSource As Field)
Dim intFileNumber As Integer '文件号
Dim lngFileLength As Long '文件的长度
Dim bytBuffer() As Byte '文件的内容
'读出字段中的数据
'也可用此语句替换下两行bytbuffer=fldSource
lngFileLength = fldSource.FieldSize
bytBuffer() = fldSource.GetChunk(0, lngFileLength)
'得到一个可用的文件号
intFileNumber = FreeFile()
'写到文件中
Open mstrFileName For Binary Access Write As #intFileNumber
Put #intFileNumber, 1, bytBuffer()
Close #intFileNumber
End Sub另外帮你找了个例子,不知道你是否可以用上1. VC把一个文件存入数据库 CFile imagefile;
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);
}