读取数据库二进制数据
读出并生成图片到物理位置
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("读取成功");//查看硬盘上的文件
}
}
2. VB读取二进制数据
left(str,x) '从左读取x位
right(str,x) '从右读取x位
mid(str,x,y) '从x位数的地方开始向后读取y位
InStr(x, str1, str2) '在str1中从x位数开始查找str2的位置
Split(str, ",") '将str中的字符串以逗号“,”为界分开到数组
。。。。。。等等都是提取字符串的各种各样的函数或方法
具体用什么方法在指定位置取数字,那要根据你的数据结构来
分析选择最恰当的方法。
但一般都会把数据先装进一个变量、然后根据数据结构分别选
择合适的方法从这个变量中提取。
“数据结构”即将要接受分析的数据集的分布样式即特点等(这是人
为排列的,不会是杂乱无序的、即一定是有其特征点的)。
也就是说:你“想知道从指定位置取这种数据”,就必须把
“这种数据”的样本粘贴上来,大家才会有针对的给你解决的代码,
否则就像我上面给你解释的那样:是灵活多样的。
3. 读取数据库长二进制数据
用ADO连接到ACCESS
再定义一个变量为不定型
4. 怎样读取数据库中存储的二进制图片文件
下面我们将示例一个图片文件读取存储至数据库并从数据库中读取图片信息并显示的案例:
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两个步骤,我们也很容易的就完成了从数据库中读取图片信息并在页面显示的功能。
总结:实际上,除了图片文件可以如此处理,其它的文件也能通过类似方式进行处理,可将任意文件类型存储至数据库,只是文件大小的原因以及数据库存储读取速度性能限制,我们基本上还是不建议将文件存储至数据库,毕竟硬盘读取要快得多。
5. c# 如何读取mysql blob 类型的二进制数据
写:
说明:QueryFile字段为blod类型
private bool SaveQuery(String content)
{
byte[] byts = new System.Text.UnicodeEncoding().GetBytes(content);
assistant ast = new assistant();
MySqlParameter[] param = new MySqlParameter[5];
TimeSpan nowtimespan = new TimeSpan(DateTime.Now.Ticks);
param[0] = new MySqlParameter("@CQID", nowtimespan);
param[1] = new MySqlParameter("@userID", Session["OfficerID"].ToString());
param[2] = new MySqlParameter("@QueryFile", byts);
param[3] = new MySqlParameter("@filename", filename.Text);
param[4] = new MySqlParameter("@fcomment", Comment.Text);
ast.insertCQ(param);
return true;
}
读:
说明:2为blod数据类型的索引
protected void setSelect(String uderid)
{
String sqlcommand = String.Format("select * from CustomQuery where CQID='{0}'", uderid);
MySqlDataReader msr = dh. getReader(sqlcommand,null);
msr.Read();
Byte[] blob = new Byte[(msr.GetBytes(2, 0, null, 0, int.MaxValue))];
msr.GetBytes(2, 0, blob, 0, blob.Length);
msr.Close();
msr.Dispose();
String xmlStr = Encoding.Unicode.GetString(blob);
query.LoadFromString(xmlStr);
}
最简单就是:选出blob数据到DataTable强制类型转化为Byte[]再用 Encoding.Unicode.GetString(Byte[],)转化。
6. .net如何从数据库取出二进制数据转化为rtf文件
Oracle的Blob字段比较特殊,他比long字段的性能要好很多,可以用来保存例如图片之类的二进制数据。
写入Blob字段和写入其它类型字段的方式非常不同,因为Blob自身有一个cursor,你必须使用cursor对blob进行操作,因而你在写入Blob之前,必须获得cursor才能进行写入,那么如何获得Blob的cursor呢?
这需要你先插入一个empty的blob,这将创建一个blob的cursor,然后你再把这个empty的blob的cursor用select查询出来,这样通过两步操作,你就获得了blob的cursor,可以真正的写入blob数据了。
举例如下:
Oracle系列:LOB大对象处理
主要是用来存储大量数据的数据库字段,最大可以存储4G字节的非结构化数据。
主要介绍字符类型和二进制文件类型LOB数据的存储,单独介绍二进制类型LOB数据的存储。
一,Oracle中的LOB数据类型分类
1,按存储数据的类型分:
①字符类型:
CLOB:存储大量 单字节 字符数据。
NLOB:存储定宽 多字节 字符数据。
②二进制类型:
BLOB:存储较大无结构的二进制数据。
③二进制文件类型:
BFILE:将二进制文件存储在数据库外部的操作系统文件中。存放文件路径。
2,按存储方式分:
①存储在内部表空间:
CLOB,NLOB和BLOB
②指向外部操作系统文件:
BFILE
二,大对象数据的录入
1,声明LOB类型列
/*
conn scott/tiger;
Create TableSpace ts5_21
DataFile 'E:\Oracle\ts5_21.dbf'
Size 5m;
*/
Create Table tLob (
no Number(4),
name VarChar2(10),
resume CLob,
photo BLob,
record BFile
)
Lob (resume,photo)Store As (
Tablespace ts5_21 --指定存储的表空间
Chunk 6k --指定数据块大小
Disable Storage In Row
);
2,插入大对象列
①先插入普通列数据
②遇到大对象列时,插入空白构造函数。
字符型:empty_clob(),empty_nclob()
二进制型:empty_blob()
二进制文件类型:BFileName函数指向外部文件。
BFileName函数:
BFileName(‘逻辑目录名’,‘文件名’);
逻辑目录名只能大写,因为数据词典是以大写方式存储。Oracle是区分大小写的。
在创建时,无需将BFileName函数逻辑目录指向物理路径,使用时才做检查二者是否关联。
例子:
Insert Into tLob Values(1,'Gene',empty_clob(),empty_blob(),bfilename('MYDIR','IMG_0210.JPG'));
③将逻辑目录和物理目录关联。(如果是二进制文件类型)
授予 CREATE ANY DIRECTORY 权限
Grant CREATE ANY DIRECTORY TO 用户名 WITH ADMIN OPTION;
关联逻辑目录和物理目录
本地
Create Directory 逻辑目录名 As ‘文件的物理目录’;
网络:
Create Directory 逻辑目录名 As ‘\\主机名(IP)\共享目录’;
例子:
Create Directory MYDIR As 'E:\Oracle';
插入例子:
insert into tlob values(1,'Gene','CLOB大对象列',empty_blob(),bfilename('MYDIR','IMG_0210.JPG'));
三,大对象数据的读取和操作:DBMS_LOB包
DBMS_LOB包:包含处理大对象的过程和函数
/*
insert into tlob values(1,'Gene','CLOB大对象列',empty_blob(),bfilename('MYDIR','IMG_0210.JPG'));
insert into tlob values(2,'Jack','CLOB大对象列',empty_blob(),bfilename('MYDIR','IMG_0210.JPG'));
insert into tlob values(3,'Mary','大对象列CLOB',empty_blob(),bfilename('MYDIR','IMG_0210.JPG'));
*/
1,读取大对象数据的过程和函数
①:DBMS_LOB.Read():从LOB数据中读取指定长度数据到缓冲区的过程。
DBMS_LOB.Read(LOB数据,指定长度,起始位置,存储返回LOB类型值变量);
例子:
Declare
varC clob;
vRStr varchar2(1000);
ln number(4);
Strt number(4);
Begin
select resume into varC from tlob where no = 1;
ln := DBMS_LOB.GetLength(varC);
Strt := 1;
DBMS_LOB.Read(varC, ln, Strt, vRStr);
DBMS_output.put_line('Return: '||vRStr);
End;
②:DBMS_LOB.SubStr():从LOB数据中提取子字符串的函数。
DBMS_LOB.SubStr(LOB数据,指定提取长度,提取起始位置):
例子:
Declare
varC clob;
vRStr varchar2(1000);
ln number(4);
Strt number(4);
Begin
select resume into varC from tlob where no = 1;
ln := 4;
Strt := 1;
vRStr := DBMS_LOB.SubStr(varC, ln, Strt);
DBMS_output.put_line('结果为: '||vRStr);
End;
③:DBMS_LOB.InStr():从LOB数据中查找子字符串位置的函数。
DBMS_LOB.InStr(LOB数据, 子字符串);
例子:
Declare
varC clob;
vSubStr varchar2(1000);
vRStr varchar2(1000);
ln number(4);
Begin
select resume into varC from tlob where no = 1;
vSubStr := '大对象';
ln := DBMS_LOB.InStr(varC,vSubStr);
DBMS_output.put_line('位置为: '||ln);
vRStr := DBMS_LOB.SubStr(varC, Length(vSubStr), ln);
DBMS_output.put_line('位置为'||ln||'长度为'||Length(vSubStr)||'的子字符串为:'||vRStr);
End;
④:DBMS_LOB.GetLength():返回指定LOB数据的长度的函数。
DBMS_LOB.GetLength(LOB数据);
⑤:DBMS_LOB.Compare():比较二个大对象是否相等。返回数值0为相等,-1为不相等。
DBMS_LOB.Compare(LOB数据,LOB数据);
例子:
Declare
varC1 clob;
varC2 clob;
varC3 clob;
ln number(4);
Begin
select resume into varC1 from tlob where no = 1;
select resume into varC2 from tlob where no = 2;
select resume into varC3 from tlob where no = 3;
ln := DBMS_LOB.Compare(varC1,varC1);
DBMS_output.put_line('比较的结果为: '||ln);
ln := DBMS_LOB.Compare(varC2,varC3);
DBMS_output.put_line('比较的结果为: '||ln);
End;
2,操作大对象数据的过程
操作会改变数据库中原有数据,需要加上Updata锁锁上指定数据列,修改完后提交事务。
①:DBMS_LOB.Write():将指定数量的数据写入LOB的过程。
DBMS_LOB.Write(被写入LOB, 写入长度(指写入LOB数据),写入起始位置(指被写入LOB),写入LOB数据);
例子:
Declare
varC clob;
vWStr varchar2(1000);
vStrt number(4);
ln number(4);
Begin
vWStr := 'CLOB';
ln := Length(vWStr);
vStrt := 5;
select resume into varC from tlob where no = 1 FOR UPDATE;
DBMS_LOB.Write(varC, ln, vStrt, vWStr);
DBMS_output.put_line('改写结果为: '||varC);
Commit;
End;
②:DBMS_LOB.Append():将指定的LOB数据追加到指定的LOB数据后的过程。
DBMS_LOB.Append(LOB数据,LOB数据);
例子:
Declare
varC clob;
vAStr varchar2(1000);
Begin
vAStr := ',这是大对象列';
select resume into varC from tlob where no = 1 FOR UPDATE;
DBMS_LOB.Append(varC, vAStr);
commit;
DBMS_output.put_line('追加结果为: '||varC);
End;
③:DBMS_LOB.Erase():删除LOB数据中指定位置的部分数据的过程;
DBMS_LOB.Erase(LOB数据,指定删除长度, 开始删除位置);
例子:
Declare
varC clob;
ln number(4);
strt number(4);
Begin
ln := 1;
strt := 5;
select resume into varC from tlob where no = 1 FOR UPDATE;
DBMS_LOB.Erase(varC, ln, strt);
commit;
DBMS_output.put_line('擦除结果为: '||varC);
End;
④:DBMS_LOB.Trim():截断LOB数据中从第一位置开始指定长度的部分数据的过程;
DBMS_LOB.Trim(LOB数据,截断长度);
例子:
Declare
varC clob;
ln number(4);
Begin
ln := 4;
select resume into varC from tlob where no = 1 FOR UPDATE;
DBMS_LOB.Trim(varC, ln);
COMMIT;
DBMS_output.put_line('截断结果为: '||varC);
End;
⑤:DBMS_LOB.Copy():从指定位置开始将源LOB复制到目标LOB;
DBMS_LOB.Copy(源LOB,目标LOB,复制源LOB长度,复制到目标LOB开始位置,复制源LOB开始位置)
例子:
Declare
vDEST_LOB clob;
vSRC_LOB clob;
AMOUNT number;
DEST_OFFSET number;
SRC_OFFSET number;
Begin
select resume into vDEST_LOB from tlob where no = 1 FOR UPDATE;
select resume into vSRC_LOB from tlob where no = 2 ;
AMOUNT := DBMS_LOB.GetLength(vSRC_LOB);
DEST_OFFSET := DBMS_LOB.GetLength(vDEST_LOB)+1;
SRC_OFFSET := 1;
DBMS_LOB.Copy(vDEST_LOB, vSRC_LOB, AMOUNT, DEST_OFFSET, SRC_OFFSET);
DBMS_output.put_line('拷贝结果为: '||vDEST_LOB);
End;
关于使用LOB数据类型的性能问题:
Clob/blob实现是比较复杂的,这里只提提几个和性能相关的点,当然能不用lob尽量不用:
a、 一个lob字段包括lobindex和lobsegment
b、 Lob缺省可以存放在表中(表字段),条件是:
1.它的大小小于4kb
2.并且在定义的时候没有使用(disable storage inrow)字句(缺省是enable)
当lob大于4kb的时候它会被存放到lobsegment中
c、 当lob存放在表中的时候,它可以被缓存,对于它的操作效率远远高于存储在lobsegment中的lob(不用lobindex)
d、 存储在lobsegment中的lob缺省不在缓冲区缓存,对于lob的读写都是物理IO,代价非常高,所以对于大于4kb的lob字段千万不要频繁更新,效率非常低
e、 存储在lobsegment中的lob可以在定义的时候指定使用cache(默认是nocache),这对于中等大小的lob(比如几k~几十k)很有效果,减少物理IO
使用其他数据类型需要考虑的性能问题:
1、 Char
定长格式字符串,在数据库中存储时不足位数填补空格,不建议使用,会带来不必要的麻烦
a、 字符串比较的时候,如果不注意(char不足位补空格)会带来错误
b、 字符串比较的时候,如果用trim函数,这样该字段上的索引就失效(有时候会带来严重性能问题)
c、 浪费存储空间
2、 Varchar2/Varchar
不定长格式字符串,对于4000字节以内的字符串,建议都用该类型
a、 网上有说char比varchar2性能好,但是如果你有兴趣做测试的话,会发现没有区别(如果发生行迁移,可以通过pctfree来调整)
b、 充分利用存储空间
3、 Long/long raw
Oracle已经废弃,只是为了向下兼容保留着,应该全部升级到lob
Long类型有很多限制
a、 表中只能有一列long类型
b、 Long类型不支持分布式事务
c、 太多的查询不能在long上使用了
4、 Number
定义Number的方法:Number(p,s)
其中p,s都是可选的:
a、 p代表精度,默认为38
b、 s代表小数位数,取值范围-84~127,默认取值要看是否指定了p,如果制定了p,默认s为0,如果没有指定p,默认取最大值。
几个例子:
a、 Number(5,0)=Number(5) 取值范围99999~-99999
b、 Number(5,2) 取值范围999.99~-999.99
注意:其中的整数位数只有3位,小数位数有2位,按照如下方法计算:
整数位数<=p-s
小数位数<=s
如果插入123.555存储在数据库中变成123.56 (在小数的第三位上四舍五入),如果插入999.999,数据库就要抛错。
c、 Number(5,-2) 取值范围9999900~-9999900 (整数位数<=p-s,没有小数位数)
如果插入9999949存储在数据库中变成9999900(在整数的第二位上四舍五入),如果插入9999950,数据库就要抛错。
其他的数值类型都是number的衍生,底层都是number,比如integer/int完全映射到number(38)
性能相关:number是一种软实现的类型,如果需要对number做复杂的运算,建议先用cast内置函数转换number为浮点数类型
另外需要注意的一点是:number是变长类型,在计算表存储空间的时候要切记
5、 Date
Date类型是一个7字节的定长数据类型,没啥好说的,一个例子:性能a>b>c
a、Where date_colum>=to_date(’01-jan-2007’,’dd-mon-yyyy’)
and date_colum< DIV>
b、Where trunc(date_colum,’y’)=to_date(’01-jan-2007’,’dd-mon-yyyy’)
c、Where to_char(date_colum,’yyyy’)=’2007’
7. 如何读取access中长二进制数据,长二进制数据数据格式为PDF格式。急急急
以下为C#读取一条带二进制数据记录的例子
可以这样处理,建一个名为Attachdownload.ashx的事件处理程序,
调用方法为 Attachdownload.ashx?AID=记录号;
后台代码(数据为LINQ TO SQL方式读取)
public class Attachdownload : IHttpHandler
{
public void ProcessRequest(HttpContext context)
{
// Set up the response settings
context.Response.Cache.SetCacheability(HttpCacheability.Public);
context.Response.BufferOutput = false;
if (!string.IsNullOrEmpty(context.Request.QueryString["AID"]))
{
//取页面传来的参数
Guid AID = new Guid(context.Request.QueryString["AID"]);
//取公告附件记录
SI_Affiche Affiche = Whiteboard.GetItemByID(AID);
//取记录中的文件名
string filename = context.Server.UrlEncode(Affiche.AttachTitle);
//取记录中的文件类型
string filetype = Affiche.AttachType;
{
//输出数据
if (Affiche.Attach.Length > 0)
{
context.Response.Clear();
context.Response.Buffer = true;
context.Response.Charset = "utf-8";
context.Response.AppendHeader("Content-Disposition", "attachment;filename=" + filename); //把 attachment 改为 online 则在线打开
context.Response.ContentEncoding = System.Text.Encoding.GetEncoding("utf-8");
context.Response.ContentType = filetype;
context.Response.BinaryWrite(Affiche.Attach.ToArray());
}
}
}
}
public bool IsReusable
{
get
{
return false;
}
}
}
8. Delphi如何读取Access数据库长二进制字段
标准方法是使用TBlobStream来访问Blob字段,如果你感觉繁琐的话,也可以hacking一下:
type
TFloat2 = record
case integer of
0: (LargeInt: Int64);
1: (Float1, Float2: single);
end;
var
F2: TFloat2;
使用:
F2.LargeInt := TBlobField(xxx.FieldByName('...')).AsLargeInt;
然后就可以使用F2.Float1、F2.Float2了。
不过这种方法不保证对所有数据库兼容。
9. java语言如何提取数据库的二进制字段的数据
你只是打开了一个输入流,还没有把输入流的数据读出来,你应该申请一个二进制缓冲区,然后把数据读出来
byte[] buffer = new byte[4096];
while (in.read(buffer) != -1){
//do something to buffer
}
10. C#从数据库读取二进制到结构体
你这个问题问的太强大了,让人无法回答,我这么回答,希望能给你一点启发。
string connectionString = @"Data Source=数据库服务器地址;Initial Catalog=数据库名字;Persist Security Info=True;User ID=用户名;Password='密码'";
SqlConnection conn = new SqlConnection(connectionString);
string sqlstr = "你的查询语句";
SqlCommand com = new SqlCommand(sqlstr, conn);
conn.Open();
//执行查询,并返回查询所返回的结果集中第一行的第一列。忽略其他列或行
byte[] result = (byte[])com.ExecuteScalar();
//两种方法转换
//1.根据你的存储方法,将这个二进制数组解析你的结构
//2.如果这个二进制数组是通过将一个结构对象序列化得到的,那么反序列化就行了
System.Runtime.Serialization.Formatters.Binary.BinaryFormatter bin = new System.Runtime.Serialization.Formatters.Binary.BinaryFormatter();
你的结构 o = (你的结构)bin.Deserialize(new System.IO.MemoryStream(result));