摘 要 本文以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文档等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)