数据库二进制文件
‘壹’ 如何实现将文件以二进制形式存放到数据库中
这个很简单的,这要把表单
这样设置一下,表单里面的数据就是以二进制的形式传到数据库的,至于怎么传到数据库,这个就不用说吧,一个sql插入语句就行了的,。
‘贰’ 如何从SQL数据库中读取二进制数据
读出并生成图片到物理位置
public void Read()
{
byte[] MyData = new byte[0];
using (SqlConnection conn = new SqlConnection(sqlconnstr))
{
conn.Open();
SqlCommand cmd = new SqlCommand();
cmd.Connection = conn;
cmd.CommandText = "select * from T_img";
SqlDataReader sdr = cmd.ExecuteReader();
sdr.Read();
MyData = (byte[])sdr["ImgFile"];//读取第一个图片的位流
int ArraySize= MyData.GetUpperBound(0);//获得数据库中存储的位流数组的维度上限,用作读取流的上限
FileStream fs = new FileStream(@"c:\00.jpg", FileMode.OpenOrCreate, FileAccess.Write);
fs.Write(MyData, 0, ArraySize);
fs.Close(); //-- 写入到c:\00.jpg。
conn.Close();
Console.WriteLine("读取成功");//查看硬盘上的文件
}
}
‘叁’ 老师,请问如何将数据库中二进制流文件读出
context.Response.ClearContent();
context.Response.ContentType = "image/Jpeg";
context.Response.BinaryWrite(数据库读出来的byte[]);
ms.Close();
ms = null;
image.Dispose();
image = null;
‘肆’ 数据库中的二进制文件如何还原并保存
文件存库里面啊?那多占空间啊!加载是很慢的!是不是图片?
这里有个操作物理路径下载的函数:
private void FileDown(string strPath)
{
System.IO.FileInfo file = new System.IO.FileInfo(strPath);
if (file.Exists)
{
Response.Clear();
Response.AddHeader("Content-Disposition", "attachment; filename=" + HttpUtility.UrlEncode(file.FullName, System.Text.Encoding.UTF8));
Response.AddHeader("Content-Length", file.Length.ToString());
Response.ContentType = "application/octet-stream";
Response.Filter.Close();
Response.WriteFile(file.FullName);
Response.End();
}
else
{
ClientScript.RegisterStartupScript(GetType(), "", "<script language='javascript'>alert('文件不存在!');</script>");
}
}
如果是存取图片的话:
存:
FileStream fs = new FileStream(FilePath, FileMode.OpenOrCreate, FileAccess.Write);
byte[] myData = new byte[fileStream.Length];
fileStream.Read(myData, 0, System.Convert.ToInt32(fileStream.Length));//从流中读取字节块,并将数据写入到该缓冲区
fileStream.Close();
...把mydata插入到数据库就好勒!
取:
取出byte[]来,直接image.formStream(fs);
‘伍’ 只要我的数据库二进制文件打开了,任何数据都可以恢复
最好重新查查备份的控制文件是否在正常。
只有在不完整恢复后或者重建控制文件后,才必须用resetlogs打开数据库来重新初始化联机日志文件。(resetlogs指示Oracle初始化联机重做日志文件和重置日志切换序列号。)
‘陆’ 如何将二进制文件存入Oracle数据库中
先把文件读取到内存,再以二进制格式保持到数据库中的大字段中(clob或clob)。
写大对象。
Java code
public static void main(String[] args) {
// TODO Auto-generated method stub
Connection conn = null;
Statement stat = null;
ResultSet rs = null;
OutputStream os = null;
FileInputStream fis = null;
int bs = 0;
try {
Class.forName("oracle.jdbc.driver.OracleDriver");
conn = DriverManager.getConnection("jdbc:oracle:thin:@localhost:1521:oraDB","bigfou","---");
conn.setAutoCommit(false);
stat = conn.createStatement();
stat.executeUpdate("insert into t_video(id,video) values(1,empty_blob())");
rs = stat.executeQuery("select video from t_video where id = 1");
rs.next();
oracle.sql.BLOB blo = (oracle.sql.BLOB)rs.getBlob(1);
os = blo.getBinaryOutputStream();
bs = blo.getBufferSize();
fis = new FileInputStream("D:\\Temp\\MPlayer-CVS-20040808-K&K\\mplayer.exe");
byte[] buf = new byte[bs];
int length = 0;
while(true)
{
length = fis.read(buf);
if(length == -1) break;
os.write(buf,0,length);
}
os.close();
os = null;
fis.close();
fis = null;
conn.commit();
conn.setAutoCommit(true);
conn.close();
} catch(Exception ex) {
ex.printStackTrace();
}
}
读大对象
Java code
InputStream is = null;
FileOutputStream fos = null;
byte[] buf = null;
int bs = 0;
try {
Class.forName("oracle.jdbc.driver.OracleDriver");
conn = DriverManager.getConnection("jdbc:oracle:thin:@localhost:1521:oraDB","bigfou","-");
conn.setAutoCommit(false);
stat = conn.createStatement();
rs = stat.executeQuery("select video from t_video where id = 1");
rs.next();
oracle.sql.BLOB blo = (oracle.sql.BLOB)rs.getBlob(1);
bs = blo.getBufferSize();
buf = new byte[bs];
int length = 0;
is = blo.getBinaryStream();
fos = new FileOutputStream("d:\\test.exe");
while(true) {
length = is.read(buf);
if(length == -1) break;
fos.write(buf,0,length);
}
fos.close();
fos = null;
is.close();
is = null;
conn.commit();
conn.setAutoCommit(true);
conn.close();
...
‘柒’ 怎样读取数据库中存储的二进制图片文件
下面我们将示例一个图片文件读取存储至数据库并从数据库中读取图片信息并显示的案例:
1、首先读取硬盘上的某一具体图片文件,读取模式设置为readBinary方式:
<cffile
action
=
"readBinary"
file
=
"temp
directory
here#file.serverFile#"
variable
=
"test">
2、将读取出来的二进制内容存储至数据库中(注:数据库字段需设置成能存储图片类型的字段,如blob类型):
<cfquery
datasource
=
"datasource">
insert
into
imageTest
values
(<cfqueryparam
cfsqltype="cf_sql_blob"
value="#test#">)
</cfquery>
通过1、2两个步骤,我们轻松实现了读取图片文件并存储至数据库的操作过程。
3、从数据库中读取图片信息,该文件可命名为dispImage.cfm:
<!---
在此需特别注意enablecfoutputonly的压缩空白功能,如果不对该页面进行空白压缩,很可能会造成图片无法显示的问题
--->
<cfprocessingdirective
suppressWhiteSpace="yes">
<cfsetting
enablecfoutputonly="yes">
<!---
读取相应的图片信息
--->
<cfquery
datasource
=
"datasource">
select
image
from
imageTest
where
variable
here#
</cfquery>
<!---
设置浏览器输出的格式,我们将它设置为图片的JPG类型,用户可根据实际情况改动类型设置
--->
<cfcontent
type="image/jpg">
<!---
输出图片
--->
<cfoutput>#toString(imageTest.image)#</cfoutput>
</cfprocessingdirective>
<cfabort>
4、显示图片内容,调用dispImage.cfm页面:
<img
src
=
"dispImage.cfm?id=your
variable
here">
通过3、4两个步骤,我们也很容易的就完成了从数据库中读取图片信息并在页面显示的功能。
总结:实际上,除了图片文件可以如此处理,其它的文件也能通过类似方式进行处理,可将任意文件类型存储至数据库,只是文件大小的原因以及数据库存储读取速度性能限制,我们基本上还是不建议将文件存储至数据库,毕竟硬盘读取要快得多。
‘捌’ 数据库中二进制数据主要是用来存储什么数据的麻烦举例说说
很多数据库将存储二进制的字段都定义为BLOB类型,实际上它可以存储任何数据类型,比如数字型或者是字符型,当然了,数据库中已经有数字型和字符型自己的定义,所以我们一般也不会将这些数据存储在BLOB中,在BLOB中最常存储的数据是文件数据,原因是因为BLOB有个特点,那就是存入的数据长度不受什么限制,明白了吧?如果你想保存一张图片在数据库中,那么BLOB类型的字段是你唯一的选择。
‘玖’ 数据库中存储二进制文件的查询效率问题
你所谓的二进制数据文件针对的应该是大对象,一般而言,不会使用到这种存储方式。不过说查询效率,在对大对象进行查询时,像ORACLE,就是给数据文件增加了一个头,用以查询时的定位。而对于大数据的文本文件,比如CLOB,它提供了其他的方式让你来进行数据查询。而你所说的存在其他的字段,那么,如果你存储的是文本文件而非音频视频的话,建议你采用CLOB而非BLOB……另外,就查询效率而言,没有什么固定的方式是最好的,只有针对你的应用,采用最合适的数据库架构才是最优的。在查询效率这点上,建议你看看数据库的簇集,索引,分区/多文件组(oracle是分区,sql server就是多文件组了),这些如果使用恰当的话,可以提高查询效率……
‘拾’ 数据库写入磁盘的数据文件为什么用二进制文件而不用文本文件
1.
这个和计算机的存储有关系吧
2.
比如数字,在计算机的表示中,是以二进制表示的。二进制存储节省
空间和时间
。
3.
数据库本身有二进制类型的数据类型,这个以无法以文本存储。