如何将数据库中的图片(二进制),读出并显示在界面的Image控件[VB6.0]

如何将数据库中的图片(二进制),读出并显示在界面的Image控件[VB6.0],第1张

摘 要 本文以VB6与Access97作为开发工具,介绍了图像在数据库中的存储与显示技术。

关键词 数据库,数据控件,二进制,图像存储,图像显示,ADODB,Recordset

数据库是数据管理的最新技术,是计算机科学的重要分支,是现代计算机信息系统和计算机应用的基础和核心。在科学技术高速发展的今天,在信息资源无处不在、无处不用,已成为各部门的重要财富的时候,对于从事程序开发的人员来说显得尤为重要。

如今,对数据库的 *** 作不仅仅满足于对字符和数字的单一 *** 作,图像的存储与显示已显得尤为重要。下面作者将以VB60与Access97作为开发工具,分别介绍两种图像显示与存储的方法。

利用数据控件和数据绑定控件

利用这种方法,不写或写少量代码就可以构造简单的数据库应用程序,这种方法易于被初学者接受。在举例之前,先把数据绑定功能简要的说明一下,凡是具有DataSource属性的控件都是对数据敏感的,它们都能通过数据控件直接使用数据库里的数据。比如CheckBox Control , ComboBox Comtrol , TextBox Comtrol , PictureBox Control ,Image Comtrol … 因为这种方式涉及到的知识点比较少,也比较容易理解,不多作说明,现直接介绍编程步骤。

1、从数据库中显示所需要的

首先,添加一个Data数据控件,设置它的DatabaseName和RecordSource属性,

strPath = AppPath

If Right(strPath, 1) <> "\" Then

strPath = strPath & "\"

MyDataDatabaseName = strPath & "ExampleDBmdb" '数据库存地址

MyDataRecordSource = "Info" '表名

第二步,添加Image控件用来显示,设置它的DataSource和DataField属性。例如本例中: Image1DataSource="MyData"和Image1DataField=" MyPhoto" 。然后设置其它具有数据绑定功能的控件用来显示所要的其它内容,经过这两步的 *** 作,运行程序就可以显示你要的数据了。

2、向数据库中添加需要存储的

首先,利用数据控件所具有的AddNew属性,添加一个按钮,双击后添加如下代码MyDataRecordsetAddNew

第二步,为Image控件指定路径Image1Picture = LoadPicture("路径"),经过这两步的 *** 作,就可以向数据库中添加了。

这种方法最简单快捷,要写的代码量很少。但是这种方法在运行速度和灵活性方面有一定的限制,适合于初学者和一些简单的应用,要想灵活多变的显示图像,下面介绍的方法或许更适应您的要求。

利用编写代码实现的存储与显示

这种方法相对于方法一来说,代码量大,但是它 *** 作灵活,能够满足多样形式下的 *** 作,受到更多编程者的青睐。但是涉及到的知识面相对要多一些,不仅要掌握数据库的 *** 作方法,还要二进制文件的读写作进一步的了解。关于数据库及二进制文件的基本 *** 作很多参考书上都介绍的比较详细,需要时请查阅即可。在编程之前把本部分用到的变量说明如下:

Dim RS As New ADODBRecordset

Dim Chunk() As Byte

Const ChunkSize As Integer = 2384

Dim DataFile As Integer, Chunks, Fragment As Integer

Dim MediaTemp As String

Dim lngOffset, lngTotalSize As Long

Dim i As Integer

1、从数据库中显示所需要的

第一步首先打开数据库,看有没有要查找的内容,有则继续执行,没有就退出

RSSource = "select from Info Where Name='" & sparaName &"';"

RSActiveConnection = "UID=;PWD=;DSN=TestDB;"

RSOpen

If RSEOF Then RScCose : Exit Sub

第二步,读出长二进制数据即数据,把它转换成文件, *** 作过程如下

MediaTemp = strPath & "picturetemptmp"

DataFile = 1

Open MediaTemp For Binary Access Write As DataFile

lngTotalSize = RS!MyPhotoActualSize

Chunks = lngTotalSize \ ChunkSize

Fragment = lngTotalSize Mod ChunkSize

ReDim Chunk(Fragment)

Chunk() = RS!MyPhotoGetChunk(Fragment)

Put DataFile, , Chunk()

For i = 1 To Chunks

ReDim Chunk(ChunkSize)

Chunk() = RS!MyPhotoGetChunk(ChunkSize)

Put DataFile, , Chunk()

Next i

Close DataFile

第三步,关闭数据库,这样就可以显示所要的了。

RSClose

If MediaTemp = "" Then Exit Sub

Picture1Picture = LoadPicture(MediaTemp)

If Picture1Picture = 0 Then Exit Subj

2、向数据库中添加需要存储的

向数据库添加存储的是显示逆过程,只要掌握了显示的 *** 作,存储的 *** 作也就迎刃而解了,下面将 *** 作步骤介绍如下

第一步首先打开数据库,过程如下:

RSSource = "select from Info ;"

RSCursorType = adOpenKeyset

RSLockType = adLockOptimistic

RSActiveConnection = "UID=;PWD=;DSN=TestDB;"

RSOpen

第二步,把要存储的转换成二进制长文件存入数据库中, *** 作过程如下

RSAddNew

DataFile = 1

Open strPathPicture For Binary Access Read As DataFile

FileLen = LOF(DataFile) ' 文件中数据长度

If FileLen = 0 Then : Close DataFile : RSClose : Exit Sub

Chunks = FileLen \ ChunkSize

Fragment = FileLen Mod ChunkSize

ReDim Chunk(Fragment)

Get DataFile, , Chunk()

RS!MyPhotoAppendChunk Chunk()

ReDim Chunk(ChunkSize)

For i = 1 To Chunks

Get DataFile, , Chunk()

RS!MyPhotoAppendChunk Chunk()

Next i

Close DataFile

第三步,更新纪录后,关闭数据库,就完成了数据到数据库的存储。

RSUpdate

RSClose

Set RS = Nothing

两种方法在使用方面各有所长,读者可以针对自己的情况做出合理的选择。

方法很容易实现的.和楼上的不太一样.

mystr = AppPath & "\结果\" & "cll"

你这里要给文件起一个名称啊,哪怕是随机的名字也可以啊,比如

mystr = AppPath & "\结果\文件名字自己改cll"

或者

mystr = AppPath & "\结果\" & Int(Rnd 100000) & "cll"

//建立数据库链接

try

{

String DBpath = ServerMapPath("DataStoremdb");

if (con == null)

con = new OleDbConnection("Provider=MicrosoftJetOLEDB40;Data Source=" + DBpath);

if (conState == ConnectionStateClosed)

conOpen();

String SqlCmd = "SELECT FROM DataStore WHERE Id =@ID";

OleDbCommand cmd = new OleDbCommand(SqlCmd, con);

cmdParametersAdd("@ID", OleDbTypeInteger)Value = ID;

OleDbDataReader Reader = cmdExecuteReader();

if (ReaderRead())

{

ResponseContentType = (string)Reader["ContentType"]; //设定输出文件类型

ResponseBinaryWrite((byte[])Reader["Data"]); //输出文件二进制数制

}

else

{

ResponseWrite("reader object is null");

}

}

catch (Exception ex)

{

ResponseWrite(ex);

}

finally

{ ResponseEnd();

conClose();

}

ResponseBinaryWrite((byte[])Reader["Data"]); //输出文件二进制数制,data的数据类型为OLE对象(word),

实际的图像存储是一个byte []数组。读取流。

字节[] pics1 =(字节[])domainTdRows在一个行] [列]值是投

二进制数据,和原来的文件类型和文件名,然后扔进方法。处理!

使用SystemMedia

公共无效WRITEFILE的(byte []的,字符串文件名)

{

私人SoundPlayer的simpleSound;

的FileStream FS =新的FileStream(文件名, FileModeAppend,FileAccessWrite);

BinaryWriter的体重=新的BinaryWriter(FS);

bwWrite(PICS,picsLength,0);

bwClose();登记/> fsClose();

simpleSound =新SoundPlayer的(“Soundwav”);

simpleSoundPlay();

}

上面的数据是不使用简单的方法时,如果该数据是比较大的,可能有必要使用一个缓冲区,它!

/

Created by IntelliJ IDEA

User: ljt

Date: 2003-3-31

Time: 18:51:38

To change this template use Options | File Templates

/

import oraclejdbcdriverOraclePreparedStatement;

import oraclejdbcdriverOracleResultSet;

import javasqlConnection;

import javasqlDriverManager;

import javasqlStatement;

import javasqlClob;

public class TestOpenDoc {

public OracleResultSet ors = null; //这里rs一定要用Oracle提供的

public OraclePreparedStatement opst = null; //PreparedStatement用

public Connection conn = null;

public Statement stmt = null;

public TestOpenDoc() {

}

public boolean getConnect() {

//这是我的数据库所在

String serverName = "prosrv";

try {

ClassforName("oraclejdbcdriverOracleDriver");

String url = "jdbc:oracle:thin:@" + serverName + ":1521:BOHDATA";

conn = DriverManagergetConnection(url, "appuser", "appuser");

}

catch (Exception e) {

Systemoutprintln(e);

return false;

}

return true;

}

public static void main(String[] args) {

TestOpenDoc test = new TestOpenDoc();

if (!testgetConnect()) {

Systemoutprintln("数据库连结错误");

return ;

}

try{

testconnsetAutoCommit(false);

byte a[] = null; //将测试文件testdoc读入此字节数组

javaioFileInputStream fin = null;

javaioFileOutputStream fout = null;

//Oracle提供的

try {

javaioFile f1 = new javaioFile("c:/testdoc");

javaioFile f2 = new javaioFile("d:/testoutdoc"); //从BLOB读出的信息写

//入该文 件,和源文件对比测试用

fin = new javaioFileInputStream(f1);

fout = new javaioFileOutputStream(f2);

int flength = (int) f1length(); //读入文件的字节长度

Systemoutprintln("file length::" + flength);

a = new byte[flength];

int i = 0;

int itotal = 0;

// 将文件读入字节数组

for (; itotal < flength; itotal = i + itotal) {

i = finread(a, itotal, flength - itotal);

}

finclose();

Systemoutprintln("read itotal::" + itotal);

//注意Oracle的 BLOB一定要用EMPTY_BLOB()初始化

String mysql =

"insert into filelist (FileName,FileSize,FileBody) values (,,EMPTY_BLOB())";

OraclePreparedStatement opst = (OraclePreparedStatement) testconn

prepareStatement(mysql);

opstsetString(1, "wordtemplate2");

opstsetInt(2, flength);

opstexecuteUpdate();

opstclearParameters();

// /插入其它数据后,定位BLOB字段

mysql = "select filebody from filelist where filename=";

opst = (OraclePreparedStatement) testconnprepareStatement(mysql);

opstsetString(1, "wordtemplate2");

OracleResultSet ors = (OracleResultSet) opstexecuteQuery();

if (orsnext()) {

oraclesqlBLOB blob = orsgetBLOB(1); //得到BLOB字段

int j = blobputBytes(1, a); //将字节数组写入BLOB字段

Systemoutprintln("j:" + j);

testconncommit();

orsclose();

Clob clob;

clob = orsgetClob("");

String str;

str = clobtoString();

str = clobgetSubString(0L,(int)cloblength());

Systemoutprintln(str);

}

Systemoutprintln("insert into ok");

byte b[] = null; //保存从BLOB读出的字节

opstclearParameters();

mysql = "select filebody from filelist where filename=";

opst = (OraclePreparedStatement) testconn

prepareStatement(mysql);

opstsetString(1, "wordtemplate2");

ors = (OracleResultSet) opstexecuteQuery();

if (orsnext()) {

oraclesqlBLOB blob2 = orsgetBLOB(1);

Systemoutprintln("blob2 length:" + blob2length());

b = blob2getBytes(1, flength); //从BLOB取出字节流数据

Systemoutprintln("b length::" + blength);

testconncommit();

}

orsclose();

// 将从BLOB读出的字节写入文件

foutwrite(b, 0, blength);

foutclose();

Systemoutprintln("write itotal::" + blength);

}

catch (Exception e) {

Systemoutprintln("errror :" + etoString());

eprintStackTrace();

}

finally { //关闭所有数据联接

testconncommit();

}

}

catch(Exception e){

Systemoutprintln(e);

}

}

}

以上就是关于如何将数据库中的图片(二进制),读出并显示在界面的Image控件[VB6.0]全部的内容,包括:如何将数据库中的图片(二进制),读出并显示在界面的Image控件[VB6.0]、vb如何存取mdb数据库中的长二进制数据、如何读取access数据库里以长二进制格式存储的word文档等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/sjk/9344644.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-27
下一篇 2023-04-27

发表评论

登录后才能评论

评论列表(0条)

保存