前一阵由于工作中需要,从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);
}
分享到:
相关推荐
分析了Access数据库OLE 对象的特点,并给 出了在 Delphi环境下实际实现OLE对 象的保存\打 开与显示的处理方法(A ccess 数 据库 中 O LE 对象 的读 写操 作 许 俊 论文)
汽车产业链平台的开发使用的开发工具为VS.NET,使用的语言是C#,在开发的过程中发现使用Microsoft.Jet.OLEDB.4.0读取数据会出现当某一字段内分别含有文本和数字的混合数据时,某一类型的数据会产生丢失。本文就对此...
在利用VC 进行数据库编程时,经常需要处理数据库中的图像数据,将该图像从数据库中读取出来并显示,图像数据与文本字段不同,它是作为OLE 字段在数据库中存储,通过数据集对象的成员变量自动交换得到的图像数据,...
应用Visual Basic为平台进行数据库的开发,主要针对Microsoft Access中“OLE对象”字段类型的数据进行显示和输出的控制,利用OLE自动化技术实现了在VB环境中直接调用Microsoft Word应用程序对试卷信息的自动化排版。
在用Visual C++编写应用程序时,...VC存取这些大对象数据有众多方法,如OLE、ActiveX等,事实上VC的MFC提供了一个很方便的实现方法,即利用MFC提供的CLongBinary类可以方便地实现存取BLOB字段。下面笔者将举例说明。
Provider=Microsoft.Jet.OleDb.4.0;"; //数据库连接字符串 OleDbConnection conn = new OleDbConnection(connStr); 连接Oracle数据库 //数据库和客户端在同一台机器上 using System.Data.OracleClient; string ...
一般DotNet实用Oledb读取Excel的时候,经常出现数据类型错误,导致无效结果。比如Excel中编码列,编码:00001225 读取到Datagridview中可能变成 1224数字类型了,此Excel类不会出现,能正常读取全部数据。 本Excel...
里面已经打包好Sql数据库操作类,和Oledb的操作类,只需要引用这个dll后,在webconfig(或appconfig)的connectionstrings字段或者appsetting字段里配置一个名为ConnString的节点,dll就会自动读取,或者在global的...
C#在 ACCESS 表中自动编号复位及获取当前最大值SQL命令,适于C#. 文本源码,其中执行命令的函数用伪语言表示
里面已经打包好Sql数据库操作类,和Oledb的操作类,只需要引用这个dll后,在webconfig(或appconfig)的connectionstrings字段或者appsetting字段里配置一个名为ConnString的节点,dll就会自动读取,或者在global的...
NetAccData控件系使用VB6开发,主要原理为Winsock...与其他同类型控件相比较,该控件功能更加丰富实用,除具备对MDB数据库的OLE对象字段(如照片等长二进制数据)的读写功能之外,还支持向服务器端直接上传文件等操作。
这是一个使用C#开发的Sqlite数据库创建、操作的源码工程,关于Sqlite的所有...⑦还包含了关于sqlite内存数据库的帮助类和完整数据库、表创建、数据的增、删、查、改、获取数据库所有表和表包含的所有字段的使用示例。
//使用时通过Link类引用连接lib.dll(如果设置了密码读取时先Link.DataLink.PassWord="密码"),通过封装的方法或直接读字段FileData读出。 //直接当数据库连接,"Provider=Microsoft.Jet.OleDb.4.0;Data Source=" + ...
1、SQL Server:针对SQL Server的数据反射,该方式可以读取数据库内表(字段)的描述,如果你用的是SQL Server建议采用该方式 2、OLE DB: 支持OLE DB方式连接大部份数据库 注意:1、请先解压缩后运行,否则可能出错 2...
在SQL Server中该字段的数据类型是Image,在Access中该字段的数据类型是OLE对象。 代码如下://保存文件到SQL Server数据库中 FileInfo fi=new FileInfo(fileName); FileStream fs=fi.OpenRead(); byte[] bytes=new ...
OLE 控制对象,通过它可以将指定的文件内容显示成相应的对象(如 BMP 图片),双击它就可以激活相应的 OLE 服务器应用程序,来编辑修改对象的内容,同时也可以读取对象的数据内容(利用 OLE 控件的 ObjectData 属性...
这里使用 Microsoft.Jet.OLEDB.4.0 作为 Provider,Data Source 指定了 Access 数据库的路径。 二、执行 SQL 查询 在连接到 Access 数据库后,需要执行 SQL 查询来获取最大编号。例如: ```vbnet Dim querystring ...
大家可以看到我们首先是连接数据库然后打开,对于select的命令,我们申明一个OleDbCommand来执行之,然后再申明一个OleDbDataReader,来读取数据,用的是ExecuteReader(),objDataReader.Read()就开始读取了,在输出...
这是一个用于读取数据库表结构然后生成代码的工具。 <br/>具有以下特点: 1,基于模版生成代码。支持循环模版、条件模版,模版标签丰富而不复杂,使用者可轻易写出自己的模版。 2,理论上支持任意数据库,...
// 读取数据表 while(!rst->rsEOF) { ((CListBox*)GetDlgItem(IDC_LIST1))->AddString((_bstr_t)rst->GetCollect("姓名")); // 查询"姓名"字段 rst->MoveNext(); } } catch(_com_error e) { CString ...