阅读:2487回复:2
[求助]如何用vc把遥感图象存入数据库,急,在线等回答
要用vc做一个遥感影象的调用程序,可是,我连图象怎么存,怎么读取都不会,请各位不吝赐教!在线等!谢谢大家了!
[此贴子已经被作者于2006-5-24 16:21:28编辑过]
|
|
1楼#
发布于:2006-05-30 15:50
<P>转一个别人写的文章</P>
<P>下面给出用VC,VB如何操作图像文件存取数据库的原码,帮助一些还没有掌握方法的朋友(均用ADO连接数据库)。</P> <P>一、VC把一个文件存入数据库<BR>CFile imagefile;<BR>if(0 == imagefile.Open("d:\\user\\bmp.bmp",CFile::modeRead))<BR>return;<BR>_RecordsetPtr pRs = NULL; <BR>_ConnectionPtr pConnection = NULL;<BR>_variant_t varChunk;<BR>HRESULT hr;<BR>BYTE* PBuf;<BR>long nLength = imagefile.GetLength();<BR>pbuf = new BYTE[nLength+2];<BR>if(pbuf == NULL)<BR>return; //allocate memory error;<BR>imagefile.Read(pbuf,nLength); //read the file into memory</P> <P>BYTE *pBufEx;<BR>pBufEx = pbuf;<BR>//build a SAFFERRAY<BR>SAFEARRAY* psa;<BR>SAFEARRAYBOUND rgsabound[1];<BR>rgsabound[0].lLbound = 0;<BR>rgsabound[0].cElements = nLength;<BR>psa = SafeArrayCreate(VT_UI1, 1, rgsabound);</P> <P>for (long i = 0; i < nLength; i++)<BR>SafeArrayPutElement (psa, ;i, pBufEx++);<BR>VARIANT varBLOB;<BR>varBLOB.vt = VT_ARRAY | VT_UI1;<BR>varBLOB.parray = psa;</P> <P>_bstr_t strCnn("Provider=SQLOLEDB.1;Integrated Security=SSPI;Persist Security Info=False;Initial Catalog=CUSTOM;Data Source=SERVER"); <BR>try<BR>{<BR>//Open a connection<BR>pConnection.CreateInstance(__uuidof(Connection));<BR>hr = pConnection->Open(strCnn,"","",NULL); //Connect a DataBase<BR>pRs.CreateInstance(__uuidof(Recordset));<BR>pRs->Open("CustomInfo",_variant_t((IDispatch *) pConnection,true),adOpenKeyset,adLockOptimistic,adCmdTable); //Open a Table</P> <P>// pRs->AddNew(); <BR>pRs->Fields->GetItem("Image")->AppendChunk(varBLOB); <BR>pRs->Update();<BR>pRs->Close();<BR>pConnection->Close();<BR>}<BR>catch(_com_error ;e)<BR>{<BR>// Notify the user of errors if any.<BR>_bstr_t bstrSource(e.Source());<BR>_bstr_t bstrDescription(e.Description());<BR>CString sError;<BR>sError.Format("Source : %s \n Description : %s\n",(LPCSTR)bstrSource,(LPCSTR)bstrDescription);<BR>AfxMessageBox(sError); <BR>}</P> <P> <BR>二、VC把数据库中IMAGE字段取出存为文件<BR>_RecordsetPtr pRs = NULL;<BR>_ConnectionPtr pConnection = NULL;<BR>_variant_t varChunk;<BR>HRESULT hr;<BR>VARIANT varBLOB;<BR>_bstr_t strCnn("Provider=SQLOLEDB.1;Integrated Security=SSPI;Persist Security Info=False;Initial Catalog=CUSTOM;Data Source=SERVER"); <BR>try<BR>{<BR>//Open a connection<BR>pConnection.CreateInstance(__uuidof(Connection));<BR>hr = pConnection->Open(strCnn,"","",NULL); <BR>pRs.CreateInstance(__uuidof(Recordset));<BR>pRs->Open("CustomInfo",_variant_t((IDispatch *) pConnection,true),adOpenKeyset,adLockOptimistic,adCmdTable);<BR>//read data <BR>long lDataLength = pRs->Fields->GetItem("Image")->ActualSize;<BR>varBLOB = pRs->GetFields()->GetItem("Image")->GetChunk(lDataLength);<BR>if(varBLOB.vt == (VT_ARRAY | VT_UI1)) <BR>{<BR>BYTE *pBuf = NULL; <BR>pBuf = (BYTE*)GlobalAlloc(GMEM_FIXED,lDataLength);<BR>SafeArrayAccessData(varBLOB.parray,(void **)pBuf); <BR>//Build a File in Windows Temp Directory<BR>char tmpPath[_MAX_PATH+1];<BR>GetTempPath(_MAX_PATH,tmpPath);<BR>CString strFileName = "temp.bmp";<BR>strFileName = tmpPath+strFileName;</P> <P>CFile outFile(strFileName,CFile::modeCreate|CFile::modeWrite);<BR>LPSTR buffer = (LPSTR)GlobalLock((HGLOBAL)pBuf);<BR>outFile.WriteHuge(buffer,lDataLength);<BR>GlobalUnlock((HGLOBAL)pBuf);<BR>outFile.Close(); <BR>SafeArrayUnaccessData (varBLOB.parray);<BR>}<BR>pRs->Close();<BR>pConnection->Close();<BR>}<BR>catch(_com_error ;e)<BR>{<BR>// Notify the user of errors if any.<BR>_bstr_t bstrSource(e.Source());<BR>_bstr_t bstrDescription(e.Description());<BR>CString sError;<BR>sError.Format("Source : %s \n Description : %s\n",(LPCSTR)bstrSource,(LPCSTR)bstrDescription);<BR>AfxMessageBox(sError); <BR>}</P> <P><BR>三、VB把文件存入数据库IMAGE字段<BR>Sub savepic(FileName As String, IndexNumber As Long)<BR>Dim DcnNWind As New ADODB.Connection<BR>Dim rs As ADODB.Recordset<BR>Set rs = New ADODB.Recordset<BR>DcnNWind.CursorLocation = adUseClient<BR>DcnNWind.Open "Provider=SQLOLEDB.1;Integrated Security=SSPI;Persist Security Info=False;Initial Catalog=CUSTOM;Data Source=SERVER"<BR>rs.CursorType = adOpenKeyset<BR>rs.LockType = adLockOptimistic<BR>rs.Open "CustomInfo", DcnNWind, , adCmdTable<BR>rs.Move (IndexNumber)<BR>Call FileToBlob(rs.Fields("Image"), FileName, FileLen(FileName))<BR>rs.UpdateBatch adAffectCurrent<BR>End Sub</P> <P>Private Sub FileToBlob(fld As ADODB.Field, FileName As String, Optional ChunkSize As Long )<BR>Dim fnum As Integer, bytesLeft As Long, bytes As Long<BR>Dim tmp() As Byte<BR>If (fld.Attributes And adFldLong) = 0 Then<BR>Err.Raise 1001, , "Field doesn't support the GetChunk method."<BR>End If<BR>fnum = FreeFile<BR>Open FileName For Binary As fnum<BR>bytesLeft = LOF(fnum)<BR>Do While bytesLeft<BR>bytes = bytesLeft<BR>If bytes > ChunkSize Then bytes = ChunkSize<BR>ReDim tmp(1 To bytes) As Byte<BR>Get #1, , tmp<BR>fld.AppendChunk tmp<BR>bytesLeft = bytesLeft - bytes<BR>Loop<BR>Close #fnum<BR>End Sub</P> <P><BR>四、VB把文件从IMAGE字段中读到文件中<BR>Sub loadpic(IndexNumber As Long)<BR>Dim DcnNWind As New ADODB.Connection<BR>Dim rs As ADODB.Recordset<BR>Set rs = New ADODB.Recordset<BR>DcnNWind.CursorLocation = adUseClient<BR>DcnNWind.Open "Provider=SQLOLEDB.1;Integrated Security=SSI;Persist Security Info=False;Initial Catalog=CUSTOM;Data Source=SERVER"<BR>rs.CursorType = adOpenKeyset<BR>rs.LockType = adLockOptimistic<BR>rs.Open "CustomInfo", DcnNWind, , adCmdTable<BR>rs.Move (IndexNumber)<BR>Call BlobToFile(rs.Fields("Image"), "c:\Windows\temp\tmp.bmp", rs.Fields("Image").ActualSize)<BR>End Sub</P> <P>Private Sub BlobToFile(fld As ADODB.Field, FileName As String, Optional ChunkSize As Long )<BR>Dim fnum As Integer, bytesLeft As Long, bytes As Long<BR>Dim tmp() As Byte<BR>If (fld.Attributes And adFldLong) = 0 Then<BR>Err.Raise 1001, , "Field doesn't support the GetChunk method."<BR>End If<BR>If Dir$(FileName) <> "" Then Kill FileName<BR>fnum = FreeFile<BR>Open FileName For Binary As fnum<BR>bytesLeft = fld.ActualSize<BR>Do While bytesLeft<BR>bytes = bytesLeft<BR>If bytes > ChunkSize Then bytes = ChunkSize<BR>tmp = fld.GetChunk(bytes)<BR>Put #fnum, , tmp<BR>bytesLeft = bytesLeft - bytes<BR>Loop<BR>Close #fnum<BR>End Sub</P> |
|
|
2楼#
发布于:2006-06-01 00:10
谢谢了!
|
|