前一阵由于工作中需要,从ORACLE数据库中读取包含ole信息的字段。
在access中我们存储图片信息所用到的类型是OLE.要显示图片我们需要使用stream,这就需要知道唯一标识图像的文件头.
所有的图片文件(格式)都有用来唯一的标识图像的文件头。JPG图片文件以所谓的SOI标记开始,该标记的十六进制值是$FFD8。
MS Access把连接的OLE对象的路径作为对象定义的一部分存储在OLE对象字段中。因为OLE对象的存储定义没有被文档化(!?这直接来自于MS),所以没有办法知道真正的图像数据被写之前能得到什么。
分两个部分考虑这个问题。第一:我们需要找到'FFD8'并从那儿开始读取图像。第二:'FFD8'不可能总在文件的同一个位置。结论:我们需要一个函数,返回Access数据库中存储为OLE对象的JPG文件的SOI标记的位置。<o:p></o:p>
<o:p> </o:p>
Private Sub Command2_Click()
Dim conn As New ADODB.Connection
Dim rs As New ADODB.Recordset
conn.ConnectionString = "DSN=photo;uid=sa;pwd=;"
conn.ConnectionTimeout = 30
conn.Open
rs.Open "select * from t_Photo order by pid", conn, adOpenStatic, adLockReadOnly, adCmdText
Dim index As String
For t = 0 To Val(rs.RecordCount) - 1
If (t > 2) Then
index = Trim(rs.Fields("pid").Value)
Dim size, i, j
'要输出字段的总字节数
size = rs("Picture1").ActualSize
'循环找到 SOI marker 的位置
For i = 1 To size
If AscB(MidB(rs("Picture1"), i, 1)) = &HFF And AscB(MidB(rs("Picture1"), i + 1, 1)) = &HD8 Then
Exit For
End If
Next
Debug.Print "i==========" & i
Dim picsize As Long
picsize = rs("Picture1").ActualSize
Dim iStm As New ADODB.Stream
Set iStm = New ADODB.Stream
With iStm
.Mode = adModeReadWrite
.Type = adTypeBinary
.Open
rs("Picture1").GetChunk (i - 1)
.Write rs("Picture1").GetChunk(picsize - i + 1)
End With
iStm.SaveToFile App.Path & "/cc" & t & ".jpg"
Picture1.Picture = LoadPicture(App.Path & "/cc" & t & ".jpg")
End If
rs.MoveNext
Combo1.AddItem index
Next t
rs.Close
<o:p> </o:p>
End Sub
<o:p> 上面是段vb程序,我已经使用过是正确的。可以获取图片ole标记位的地址。然后在java里直接指定到该处进行获取就可以取出图片了。</o:p>
try{
Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
Connection con = DriverManager.getConnection("jdbc:odbc:photo","sa","");
Statement sql = con.createStatement(); //创建Statement对象
ResultSet rs = sql.executeQuery("select * from t_photo");
while (rs.next()) //输出被查询的情况
{
String pid = rs.getString("pid");
byte[] pic = rs.getBytes("picture1");
FileOutputStream fo = new FileOutputStream("c:\\2.bmp");
//FileInputStream fi = rs.getCharacterStream("picture1");
int start = 166;
for(int i=start; i
fo.write(pic[i]);
}
fo.close();
System.out.println(pid);
}
}catch(Exception e){
System.out.println(e);
}
分享到:
相关推荐
读取OLE字段数据的关键在于正确处理数据流。以下函数`AccessFieldToOLE`展示了如何从Access数据库中的OLE字段读取数据,并将其加载到VB控件中。 ```vb Function AccessFieldToOLE(oleObject As Control, fdObject ...
本实例“OLD-DB.rar_Access OLE Object_vc读取ole对象”聚焦于如何利用VC++6.0这一经典开发环境,通过ActiveX Data Objects (ADO)来操作Access数据库中的OLE对象。下面我们将深入探讨相关的知识点。 1. **OLE对象**...
代码涉及到ADO组件的配置、流的操作方法以及如何将图像文件存储到数据库中或从数据库中读取图像。 8. 安全性和管理问题:文章提到原有管理系统的考生肖像信息存在安全隐患,新的设计利用数据库存取OLE对象技术,更...
- 数据库设计时,需要创建适合存储OLE对象的字段,通常是BLOB类型,如VARBINARY(MAX)在SQL Server中。 - 表现层的编程可能涉及到控件如水晶报表(Crystal Reports)或其他报表工具,它们支持显示和编辑OLE对象。 总...
汽车产业链平台的开发使用的开发工具为VS.NET,使用的语言是C#,在开发的过程中发现使用Microsoft.Jet.OLEDB.4.0读取数据会出现当某一字段内分别含有文本和数字的混合数据时,某一类型的数据会产生丢失。本文就对此...
VB 读取 ACCESS 数据库中所有表名及指定表的字段名 VB 是一款功能强大的编程语言,可以用于读取 ACCESS 数据库中的所有表名和指定表的字段名。下面将详细介绍如何使用 VB 读取 ACCESS 数据库中的所有表名和指定表的...
本文针对C#程序连接不同类型的数据库(Access、Oracle和SQL Server),总结了连接数据库和读取数据库字段的简单方法。 首先,让我们来了解如何连接Access数据库。在C#中,连接Access数据库通常使用OleDb技术。要...
3. **读取BLOB字段** - 对于DBExpress,可以使用TOracleQuery组件的SQL属性执行查询,然后在OnBeforeOpen事件中处理BLOB字段,通过TOracleBlobField对象访问BLOB数据。 - 对于ADO,使用TADODBCommand对象的Execute...
5. **读取图片**:读取OLE对象数据通常涉及打开包含图片的记录,然后显示或处理"ImageField"的内容。在VBA中,你可以使用`OLEFormat.Object`属性来访问图片对象,然后将其显示在窗体或报表上,或者保存到磁盘。 6. ...
1. 当你需要在报表或窗体中显示图片时,可以创建一个绑定到“OLE对象”字段的对象控件,如“图像”控件。 2. 在控件的属性窗口中,设置“绑定源”为对应的“ImageField”,Access将自动从数据库中加载图片。 3. 如果...
在C#编程环境中,操作MDB(Access数据库)字段是一项常见的任务,这主要涉及到ADO.NET库的使用,它为开发者提供了连接、查询和操作数据库的强大工具。以下是对标题和描述中涉及知识点的详细说明: 1. **打开本地mdb...
当需要将图像数据写回数据库时,应用程序需要从Picture控件中获取图像数据,转换为合适的格式,然后使用`PutChunk`方法将其写回到数据库的OLE字段中。这个过程同样需要确保数据的完整性和安全性。 ### 结论 使用...
这通常涉及到读取文件内容并解析为字段,然后用这些字段填充Recordset。 3. **读取TXT文件**:使用TStringList或其他方法读取TXT文件的每一行,然后根据分隔符将每行拆分为字段数组。 4. **将数据加载到Recordset*...
定义一个函数`GetImageData`,用于从数据库读取的OLE字段数据生成可显示的图像。此函数需要接收一个`CByteArray`类型的参数,该参数包含从数据库中读取的图像数据。 ```cpp BOOL CImageDlg::GetImageData...
读取数据库中的图片则需要使用OleDbDataReader,当读取到OLE对象字段时,可以将其转换回Byte数组,然后写入到本地文件或直接显示在界面上。 ```csharp OleDbCommand cmd = new OleDbCommand("SELECT ImageField ...
总的来说,Access数据库不仅可以存储BMP图片,还能通过OLE对象字段类型方便地管理和读取这些图片。配合ADO技术,我们能够编写程序进行更复杂的数据操作,实现与数据库的高效交互。在实际应用中,理解并熟练掌握这些...
### 在VC6中使用ADO读取Oracle中的BLOB字段 #### 概述 在软件开发过程中,经常需要处理数据库中的二进制大对象(BLOB)字段,如图像、音频或视频文件等。本文将详细介绍如何在Visual C++ 6.0(VC6)环境下使用...
在SAP编程中,ABAP-OLE(Object Linking and Embedding)是一种技术,它允许SAP应用程序与外部非SAP系统进行交互,例如创建、读取、更新和删除Excel电子表格。在上述代码中,我们看到了一个名为`ZWM_015`的报告,它...
描述中提到的“之前用ado.net没有成功读取”,这可能是因为ADO.NET通常用于连接SQL Server、Oracle等现代数据库系统,对DBF的支持可能不那么直接或需要特定的OleDb驱动。而“试了这个,虽然没有解决我的问题,但是...
此外,还包括代表查询结果的“MapInfo.Query”对象、代表表的“MapInfo.Table”对象以及代表表中行和字段的“MapInfo.Row”和“MapInfo.Field”对象。 MapInfo.Application对象提供了多种常用的方法,如“Execute...