blob

阅读 / 问答 / 标签

如何把ORACLE数据从CLOB类型转化为BLOB类型

先删除后建立。前提:我的report_data 字段类型是CLOBalterer table REC_DOWNLOAD_LIST drop column report_data ;alterer table REC_DOWNLOAD_LIST add report_data BLOB;

如何使用 Blob 存储

BLOB的存储和读取 创建测试表SQL> create table alice.user_stats( 2 id number primary key, 3 username varchar2(4000), 4 app blob) 5 partition by range(id) 6 (partition part01 values less than(50), 7 partition part02 values less than(maxvalue)) 8 /创建directorySQL> create directory bfile as "/oracle";Directory created.SQL> grant read,write on directory bfile to alice;Grant succeeded.存储blobSQL> declare sfile bfile:=bfilename("BFILE","dotnetfx.exe"); 2 length_file int :=dbms_lob.getlength(sfile); --得到文件长度 3 dfile blob; blob指针 4 begin 5 insert into alice.user_stats(id,app) values(10,empty_blob()); 6 select app into dfile from alice.user_stats; --记录blob指针 7 dbms_lob.fileopen(sfile,dbms_lob.file_readonly); --以只读方式打开bfile模式的文件 8 dbms_lob.loadfromfile(dfile,sfile,length_file); --开始加载指定长度的文件到指针位置 9 dbms_lob.fileclose(sfile); --关闭 10 commit; 11 end; 12 /读取blobSQL> declare l_file utl_file.file_type; 2 l_buffer raw(32767); 3 l_amount binary_integer :=32767; 4 l_pos int :=1; 5 l_blob blob; 6 l_blob_length int; 7 begin 8 select app into l_blob from alice.user_stats where id=10; 9 l_blob_length:=dbms_lob.getlength(l_blob); 10 l_file :=utl_file.fopen("BFILE","dot.exe","wb",32767); --创建文件 11 while l_pos<l_blob_length loop 12 dbms_lob.read(l_blob,l_amount,l_pos,l_buffer); --循环读取blob到buffer 13 14 utl_file.put_raw(l_file,l_buffer,true); --刷新缓存到文件 15 l_pos:=l_pos+l_amount; 16 end loop; 17 utl_file.fclose(l_file); --关闭文件 18 end;

ae用了 s_wipeblobs为什么有很多黄色的线?

插件格式: 请看AE蓝宝石插件Genarts sapphire中英文对照: 1.Sapphire Adjusts S_ClampChroma(色度和亮度的钳位调整) S_DuoTone(双色调渐变的色彩替换) S_Gamma(RGB反差系数调整,不错) S_Hotspots(可控高亮区域的调整,不错) S_HueSatBright(一个HSL色彩空间调色器) S_Monochrome(灰度化,不错) S_Threshold(针对各色彩通道的对比度强化) S_Tint(双色调的着色器) 2.SapphireBlur+Sharpenf S_Blur(多种方式的模糊,不错) S_BlurChannels(多种方式的通道模糊) S_BlurChroma(少见的色度模糊,不错) S_BlurMoCurves(带有变形效果的运动模糊) S_BlurMotion(区域运动模糊效果,不错) S_DefocusPrism(带有色散的虚焦模糊) S_EdgeBlur(边缘模糊,用于字幕的效果不错) S_GrainRemove(降噪,速度较快) S_RackDefocus(可调项较多的虚焦模糊) S_RackDfComp(双层的虚焦模糊合成) S_Sharpen(简单的锐化) S_SoftFocus(柔焦效果) S_ZDepthCueBlur(模拟变焦模糊,不错) 3.SapphireComposite S_EdgeFlash(加光的层叠加效果) S_Layer(多种混合方式的层叠加效果) S_MathOps(多种数学运算方式的层混合效果) S_MatteOps(通道边缘噪声处理,多用于抠像) S_MatteOpsComp(处理通道噪声并进行层叠加) S_ZComp(Z方向的层叠加效果) 4.SapphireDistort S_Distort(自定义镜头变形效果,不错) S_DistortBlur(带有模糊的自定义镜头变形效果) S_DistortChroma(带有色散的自定义镜头变形效果) S_DistortRGB(带RGB通道分离的自定义镜头变形效果,好) S_Shake(镜头震动效果) S_WarpBubble(噪波变形效果) S_WarpBubble2(双重的噪波变形效果) S_WarpChroma(连续的色相扭曲,可以模仿某些空间观测的色散效果,好) S_WarpDrops(自定义的水波纹效果,不错) S_WarpFishEye(鱼眼镜头效果) S_WarpPerspective(平面图像的透视叠放,好) S_WarpPolar(圆盘状扭曲) S_WarpPuddle(较简单的水波纹效果) S_WarpPuff(以自身为镜头层的液化变形) S_WarpRepeat(复制自身并进行平均化,不错) S_WarpTransform(多种线性变形效果的综合) S_WarpVortex(漩涡变形,好) S_WarpWaves(波动变形) S_WarpWaves2(双重的波动变形) 5.SapphireLighting S_DropShadow(简单的阴影) S_EdgeRays(边缘光效果) S_Glare(虹状眩光效果) S_Glint(光斑效果) S_GlintRainbow(虹色星光效果) S_Glow(光晕效果) S_GlowAura(条纹光斑效果) S_GlowDarks(暗区加光效果) S_GlowDist(透射加光效果) S_GlowEdges(边缘加光效果) S_GlowNoise(加光噪波效果) S_GlowOrthicon(超正析摄象管效果,增强了边缘对比并降低亮度) S_GlowRainbow(多层色散透射效果) S_GlowRings(彩色光环效果,不错) S_LensFlare(镜头眩光效果) S_LensFlareAutoTrack(仿真镜头眩光效果,不错) S_Rays(光芒放射效果) S_SpotLight(聚光灯效果) S_Streaks(胶片曝光效果,类似加光的运动模糊) 6.SapphireRender S_Clouds(简单的云状噪波) S_CloudColorSmooth(杂色噪波) S_CloudsMultColor(彩色云状噪波) S_CloudsPerspective(有景深的云状噪波) S_CloudsPsyko(色散噪波效果) S_CloudsVortex(漩涡状噪波) S_Gradient(简单的线性渐变色填充) S_GradientRadial(环形渐变色填充) S_Grid(网格效果) S_Sparkles(星光镜效果) S_TextureCells(细胞噪波效果) S_TextureChromaSpiral(带有色散的螺旋状噪波效果) S_TextureFolded(褶皱噪波效果) S_TextureMoire(摩尔纹效果) S_TextureNoiseEmboss(水面反射效果) S_TextureNoisePaint(水彩笔触噪波,不错) S_TexturePlasma(电离噪波效果) S_TextureSpots(点状噪波,不错) S_TextureWeave(编织物效果) S_Zap(闪电效果) S_ZapFrom(放射闪电效果) S_ZapTo(闪电充填效果) 7.SapphireStylize S_AutoPaint(油漆效果) S_BandPass(放射线余辉效果) S_Diffuse(弥散效果) S_EdgeColorize(边缘加色效果) S_EdgeDetect(突出边缘效果) S_EdgeDetectDouble(双重的突出边缘效果) S_EdgesInDirection(方向性的突出边缘效果) S_Emboss(浮雕效果) S_EmbossDistort(变形浮雕效果) S_EmbossGlass(带有色散的变形浮雕效果) S_EmbossShiny(加光的浮雕效果) S_Etching(雕版印刷效果) S_FilmEffect(模仿胶片效果,有少量模板) S_FlysEyeCircles(圆形复眼效果) S_FlysEyeHex(六角形复眼效果) S_FlysEyeRect(矩形复眼效果) S_Grain(噪点效果) S_GrainStatic(随机噪点效果) S_HalfTone(双色点阵效果) S_HalfToneColor(彩色点阵效果) S_HalfToneRings(双色环形纹理效果) S_JpegDamage(模仿JPEG压缩造成的图像损失) S_Kaleido(多边形万花筒效果) S_KaleidoPolar(圆形万花筒效果) S_Mosaic(可调项较多的马赛克效果) S_PseudoColor(热成像效果) S_PsykoBlobs(水面油渍效果) S_PsykoStripes(条纹油渍效果) S_ScanLines(模仿电视效果) S_ScanLinesMono(模仿黑白电视效果) S_Sketch(手绘效果) S_Solarize(负片效果) S_Zebrafy(扭曲的单色底片效果) S_ZebrafyColor(带有色彩漂移和扭曲的底片效果) S_ZFogExponential(指数增长的蒙雾效果) S_ZFogLinear(线性增长的蒙雾效果) 8.SapphireTime S_Feedback(延迟视频回馈效果) S_FeedbackBubble(带有变形的延迟视频回馈效果) S_FieldRemove(去场工具) S_Flicker(随机闪烁效果) S_FlickerMatch(同步闪烁效果) S_FlickerMatchMatte(指定区域的同步闪烁效果) S_FlickerMatchColor(对色彩通道的同步闪烁效果) S_FlickerMchMatteColor(同时带有变色和蒙板的同步闪烁效果) S_FlickerRemove(去除闪烁) S_FlickerRemoveMatte(指定区域的消除闪烁) S_FlickerRemoveColor(去除色彩闪烁) S_FlickerRmMatteColor(去除指定区域的色彩闪烁) S_FreezeFrame(跳帧效果,不错) S_GetFrame(静帧效果) S_JitterFrames(随机抽帧效果) S_MotionDetect(帧变化检测,好) S_NearestColor(检测指定的色彩部分) S_RandomEdits(帧乱序播放,好) S_ReverseClip(帧反序播放) S_ReverseEdits(指定区段帧的反序播放,不错) S_TimeAverage(指定帧平均合成,类似于追迹效果) S_TimeDisplace(动态贴图替换) S_TimeSlice(参数与时间有关的帧切分效果) S_TimeWarpRGB(色偏移效果) S_Trails(追迹效果) S_TrailsDiffuse(带有像素扩散的追迹效果) 9.Sapphire Transitions S_DissolveBlur(模糊过渡,不错) S_DissolveBubble(液化过渡,不错) S_DissolveDiffuse(像素扩散过渡) S_DissolveLuma(各种亮度过渡) S_DissolvePuddle(水波纹过渡,不错) S_DissolveSpeckle(可控斑点过渡) S_DissolveStatic(随机像素过渡) S_DissolveVortex(漩涡过渡) S_DissolveWaves(波浪过渡) S_WipeBlobs(气泡转场,不错) S_WipeBubble(液化划像,不错) S_WipeCells(细胞结构过渡) S_WipeChecker(网格划像) S_WipeCircle(圆形划像) S_WipeClock(扇形划像) S_WipeClouds(云雾转场,少见) S_WipeDiffuse(像素扩散划像) S_WipeDots(点阵划像) S_WipeDoubleWedge(双楔形划像) S_WipeFourWedges(四楔形划像) S_WipeLine(线性划像) S_WipePixelate(随机像素块划像) S_WipeRectangle(矩形划像) S_WipeRings(多重环形划像) S_WipeStar(星形划像) S_WipeStripes(条纹划像) S_WipeTiles(多边形划像) S_WipeWedge(楔形划像)

mysql LONGBLOB是什么意思

mysql中text,longtext,mediumtext字段类型的意思,以及区别 MySQL支持大量的列类型,它可以被分为3类:数字类型、日期和时间类型以及字符串(字符)类型。本节首先给出可用类型的一个概述,并且总结每个列类型的存储需求,然后提供每个类中的类型性质的更详细的描述。概述有意简化,更详细的说明应该考虑到有关特定列类型的附加信息,例如你能为其指定值的允许格式。 由MySQL支持的列类型列在下面。下列代码字母用于描述中: M 指出最大的显示尺寸。最大的合法的显示尺寸是 255 。 D 适用于浮点类型并且指出跟随在十进制小数点后的数码的数量。最大可能的值是30,但是应该不大于M-2。 方括号(逗[地和逗]地)指出可选的类型修饰符的部分。 注意,如果你指定一个了为ZEROFILL,MySQL将为该列自动地增加UNSIGNED属性。 TINYINT[(M)] [UNSIGNED] [ZEROFILL] 一个很小的整数。有符号的范围是-128到127,无符号的范围是0到255。 SMALLINT[(M)] [UNSIGNED] [ZEROFILL] 一个小整数。有符号的范围是-32768到32767,无符号的范围是0到65535。 MEDIUMINT[(M)] [UNSIGNED] [ZEROFILL] 一个中等大小整数。有符号的范围是-8388608到8388607,无符号的范围是0到16777215。 INT[(M)] [UNSIGNED] [ZEROFILL] 一个正常大小整数。有符号的范围是-2147483648到2147483647,无符号的范围是0到4294967295。 INTEGER[(M)] [UNSIGNED] [ZEROFILL] 这是INT的一个同义词。 BIGINT[(M)] [UNSIGNED] [ZEROFILL] 一个大整数。有符号的范围是-9223372036854775808到9223372036854775807,无符号的范围是0到 18446744073709551615。注意,所有算术运算用有符号的BIGINT或DOUBLE值完成,因此你不应该使用大于9223372036854775807(63位)的有符号大整数,除了位函数!注意,当两个参数是INTEGER值时,-、+和*将使用BIGINT运算!这意味着如果你乘2个大整数(或来自于返回整数的函数),如果结果大于9223372036854775807,你可以得到意外的结果。一个浮点数字,不能是无符号的,对一个单精度浮点数,其精度可以是<=24,对一个双精度浮点数,是在25 和53之间,这些类型如FLOAT和DOUBLE类型马上在下面描述。FLOAT(X)有对应的FLOAT和DOUBLE相同的范围,但是显示尺寸和小数位数是未定义的。在MySQL3.23中,这是一个真正的浮点值。在更早的MySQL版本中,FLOAT(precision)总是有2位小数。该句法为了ODBC兼容性而提供。 FLOAT[(M,D)] [ZEROFILL] 一个小(单精密)浮点数字。不能无符号。允许的值是-3.402823466E+38到-1.175494351E-38,0 和1.175494351E-38到3.402823466E+38。M是显示宽度而D是小数的位数。没有参数的FLOAT或有<24 的一个参数表示一个单精密浮点数字。 DOUBLE[(M,D)] [ZEROFILL] 一个正常大小(双精密)浮点数字。不能无符号。允许的值是-1.7976931348623157E+308到-2.2250738585072014E-308、 0和2.2250738585072014E-308到1.7976931348623157E+308。M是显示宽度而D是小数位数。没有一个参数的DOUBLE或FLOAT(X)(25 < = X < = 53)代表一个双精密浮点数字。 DOUBLE PRECISION[(M,D)] [ZEROFILL] REAL[(M,D)] [ZEROFILL] 这些是DOUBLE同义词。 DECIMAL[(M[,D])] [ZEROFILL] 一个未压缩(unpack)的浮点数字。不能无符号。行为如同一个CHAR列:逗未压缩地意味着数字作为一个字符串被存储,值的每一位使用一个字符。小数点,并且对于负数,逗-地符号不在M中计算。如果D是0,值将没有小数点或小数部分。DECIMAL值的最大范围与DOUBLE相同,但是对一个给定的DECIMAL列,实际的范围可以通过M和D的选择被限制。如果D被省略,它被设置为0。如果M被省掉,它被设置为10。注意,在MySQL3.22里,M参数包括符号和小数点。 NUMERIC(M,D) [ZEROFILL] 这是DECIMAL的一个同义词。 DATE 一个日期。支持的范围是"1000-01-01"到"9999-12-31"。MySQL以"-MM-DD"格式来显示DATE值,但是允许你使用字符串或数字把值赋给DATE列。 DATETIME 一个日期和时间组合。支持的范围是"1000-01-01 00:00:00"到"9999-12-31 23:59:59"。MySQL以"-MM-DD HH:MM:SS"格式来显示DATETIME值,但是允许你使用字符串或数字把值赋给DATETIME的列。 TIMESTAMP[(M)] 一个时间戳记。范围是"1970-01-01 00:00:00"到2037年的某时。MySQL以MMDDHHMMSS、MMDDHHMMSS、MMDD或MMDD格式来显示TIMESTAMP值,取决于是否M是14(或省略)、12、8或6,但是允许你使用字符串或数字把值赋给TIMESTAMP列。一个TIMESTAMP列对于记录一个INSERT或UPDATE操作的日期和时间是有用的,因为如果你不自己给它赋值,它自动地被设置为最近操作的日期和时间。你以可以通过赋给它一个NULL值设置它为当前的日期和时间。 TIME 一个时间。范围是"-838:59:59"到"838:59:59"。MySQL以"HH:MM:SS"格式来显示TIME值,但是允许你使用字符串或数字把值赋给TIME列。 YEAR[(2|4)] 一个2或4位数字格式的年(缺省是4位)。允许的值是1901到2155,和0000(4位年格式),如果你使用2位,1970-2069( 70-69)。MySQL以格式来显示YEAR值,但是允许你把使用字符串或数字值赋给YEAR列。(YEAR类型在MySQL3.22中是新类型。) CHAR(M) [BINARY] 一个定长字符串,当存储时,总是是用空格填满右边到指定的长度。M的范围是1 ~ 255个字符。当值被检索时,空格尾部被删除。CHAR值根据缺省字符集以大小写不区分的方式排序和比较,除非给出BINARY关键词。NATIONAL CHAR(短形式NCHAR)是ANSI SQL的方式来定义CHAR列应该使用缺省字符集。这是MySQL的缺省。CHAR是CHARACTER的一个缩写。 [NATIONAL] VARCHAR(M) [BINARY] 一个变长字符串。注意:当值被存储时,尾部的空格被删除(这不同于ANSI SQL规范)。M的范围是1 ~ 255个字符。 VARCHAR值根据缺省字符集以大小写不区分的方式排序和比较,除非给出BINARY关键词值。 VARCHAR是CHARACTER VARYING一个缩写。 TINYBLOB TINYTEXT 一个BLOB或TEXT列,最大长度为255(2^8-1)个字符。 BLOB TEXT 一个BLOB或TEXT列,最大长度为65535(2^16-1)个字符。 MEDIUMBLOB MEDIUMTEXT 一个BLOB或TEXT列,最大长度为16777215(2^24-1)个字符。 LONGBLOB LONGTEXT 一个BLOB或TEXT列,最大长度为4294967295(2^32-1)个字符。 ENUM("value1","value2",...) 枚举。一个仅有一个值的字符串对象,这个值式选自与值列表"value1"、"value2", ...,或NULL。一个ENUM最多能有65535不同的值。 SET("value1","value2",...) 一个集合。能有零个或多个值的一个字符串对象,其中每一个必须从值列表"value1", "value2", ...选出。一个SET最多能有64个成员。

高手在那里啊!! hibernate读MSQ的blob图片出错误?

读MSQ的blob图片出错误是经常的事啊!

在c#中如何把图片上传到oralce的blob字段?

这是我自己写的一个ORACLE的图片上传,这里用到了一个apache的一个组件,fileupload,你自己在网上下载吧,很方便用的。import java.io.InputStream;import java.io.OutputStream;import java.sql.Connection;import java.sql.ResultSet;import java.sql.Statement;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;import javax.sql.DataSource;import oracle.sql.BLOB;import org.apache.struts.upload.FormFile;import org.apache.struts.upload.MultipartRequestHandler;import org.apache.struts.action.Action;import org.apache.struts.action.ActionForm;import org.apache.struts.action.ActionForward;import org.apache.struts.action.ActionMapping;/** * @author Lenovo-User * */public class UploadFileAction extends Action { /* (non-Javadoc) * @see org.apache.struts.action.Action#execute(org.apache.struts.action.ActionMapping, org.apache.struts.action.ActionForm, javax.servlet.http.HttpServletRequest, javax.servlet.http.HttpServletResponse) */ @SuppressWarnings("deprecation") @Override public ActionForward execute(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception { // TODO Auto-generated method stub UploadFileForm fForm = (UploadFileForm)form; DataSource ds = this.getDataSource(request); Connection conn = ds.getConnection(); Statement stmt = conn.createStatement(); //PersonBean pb = (PersonBean)request.getSession().getAttribute(Constants.PERSON_KEY); String strId = request.getParameter("id"); int id = 0; if(strId != null) id = Integer.parseInt(strId); ResultSet rs = stmt.executeQuery("select * from user_account where id=" + id + " for update"); rs.next(); oracle.sql.BLOB blob = (BLOB) rs.getBlob(4); OutputStream out = blob.getBinaryOutputStream(); int bufferSize = blob.getBufferSize(); InputStream in = fForm.getMyFile().getInputStream(); byte bytes[] = new byte[bufferSize]; while(in.read(bytes) != -1 ) { out.write(bytes, 0, bufferSize); } in.close(); out.flush();//后来添加的 out.close(); rs.close(); stmt.close(); conn.commit();//后来添加的!必须要提交,不管是不是数据库是不是自动 提交 conn.close(); return mapping.findForward("success"); }}不懂的可以问我

mybatis generator为什么会生成withblobs

你好关于mybatis generator为什么会生成withblobs:1.设置mapper文件重复生成时覆盖旧的文件将GeneratedXmlFile中isMergeable设置为false,实现方式:修改IntrospectedTableMyBatis3Impl.getGeneratedXmlFiles方法构造xml文件时传入参数false。GeneratedXmlFile gxf = new GeneratedXmlFile(document,getMyBatis3XmlMapperFileName(), getMyBatis3XmlMapperPackage(),context.getSqlMapGeneratorConfiguration().getTargetProject(),false, context.getXmlFormatter());2.oracle主键生成方式直接将sql写在generatedKey的statement中。3.控制是否生成PrimaryKeyClassIntrospectedTable中的rules属性(接口Rules)中有三个方法:generatePrimaryKeyClass()、generateBaseRecordClass()、generateRecordWithBLOBsClass()控制是否生成三种Model文件。mybatis提供了三种ModelType: HIERARCHICAL("hierarchical")、FLAT("flat"),CONDITIONAL("conditional");对应三种modelRule:HierarchicalModelRules、FlatModelRules、ConditionalModelRules。通过在mybatis generator配置文件增加属性defaultModelType=“hierarchical”可以控制不生成PrimarykeyClass。这种配置会导致只包含联合主键的表不能生成Model,可以通过修改HierarchicalModelRules方法中的generateBaseRecordClass()改为返回true,则可生成对应Model。希望对你有帮助

在PB中用OLE存取blob类型数据(三)

   源程序建立    )首先在数据库中建立如下结构的表blobsave    字段名称ue5e5  数据类型ue5e5ue5e5  备注    idue5e5ue5e5ue5e5ue5e5  char( )ue5e5  primairy key index    s_pathue5e5ue5e5  char( )    picue5e5ue5e5ue5e5   binary ( )    )在PB建立PBl库blobsave PBl    )在PBl库blobsave PBl中建立应用blobsave   在应用的open事件中设置数据库连接程序(本程序中采用的是odbc方式连接数据库 读者可根据自己所建立的数据库的不同选用不同的连接方式 以下连接数据库的代码也有所改动 至于连接不同的数据库的方法 请参考有关资料 本文不做详细介绍)   SQLCA DBMS = ODBC   SQLCA AutoCommit = False   SQLCA DBParm = Connectstring= DSN=blob   connect   open(w_main)   其中命令按钮cb_path的clicked中的代码格式如下 open(w_path)   其中命令按钮cb_dbblob的clicked中的代码格式如下 open(w_dbblob)   其中命令按钮cb_OLEblob的clicked中的代码格式如下 open(w_OLEblob)    ) 建立数据窗口dw_blobsave   按照上文中建立数?荽翱诘腷lob列的方法建立数据窗口dw_blobsave如图所示   其中 add del save cancel retrieve等分别为数据窗口dw_blobsave的append row delete row update retrieve动作按钮 首先创建实例变量 OLEstorage stor   然后如图建立窗口w_path 其中数据窗口控件dw_ 的rowfocuschanged中的代码如下   long row_num   row_num=dw_ getrow()   if row_num > then   ole_ insertfile(dw_ object s_path[row_num])   end if   其中数据窗口dw_ 的buttonclicked中的代码如下   if dwo name= cbselect then   long row_num   row_num=dw_ getrow()   string filepath filename   getfileopenname( 请选择备注文件 filepath filename)   dw_ object s_path[row_num]=filepath   ole_ insertfile(filepath)   end if   保存窗口w_path    )建立窗口w_dbblob   打开w_path 把其另存为w_dbblob 改变数据窗口dw_ 的rowfocuschanged中的代码如下   blob text   long row_num   row_num=dw_ getrow()   if row_num> then   string id   id = dw_ object id[row_num]   sqlca automit=true   selectblob pic into :text from blobsave where id = :id   ole_ objectdata=text   sqlca automit=false   end if   改变数据窗口dw_ 的buttonclicked中的代码如下   long row_num   if dwo name= cbselect then   row_num=dw_ getrow()   string filepath filename   getfileopenname( 请选择备注文件 filepath filename)   dw_ object s_path[row_num]=filepath   ole_ insertfile(filepath)   end if   if dwo name= cbsave then   string id   sqlca automit = true   blob text   text = ole_ objectdata   dw_ update()   mit   row_num=dw_ getrow()   id=dw_ object id[row_num]   updateblob blobsave   set pic = :text   where id = :id   mit   sqlca automit = FALSE   dw_ retrieve()   dw_ scrolltorow(row_num)   end if   保存窗口w_dbblob    )建立窗口w_OLEblob   打开w_path 把其另存为w_OLEblob 在窗口w_OLEblob的open事件中写入以下代码   stor = create olestorage   stor open( c:p ole ) //打开或创建ole文件   在窗口w_OLEblob的close事件中写入以下代码   destroy stor   改变数据窗口dw_ 的rowfocuschanged中的代码如下   blob text   long row_num   row_num=dw_ getrow()   if row_num> then   string id   id = dw_ object id[row_num]   ole_ open(stor w +id)   end if   改变数据窗口dw_ 的buttonclicked中的代码如下   long row_num   if dwo name= cbselect then   row_num=dw_ getrow()   string filepath filename   getfileopenname( 请选择备注文件 filepath filename)   dw_ object s_path[row_num]=filepath   ole_ insertfile(filepath)   end if   if dwo name= cbsave then   string id   row_num=dw_ getrow()   id=dw_ object id[row_num]   ole_ saveas(stor w +id)   stor save()   end if   保存窗口w_OLEblob 运行应用程序即可    三种方法的优缺点   方法一 文件保存在固定的路径下 数据库中存取文件路径和名称可以节省数据空间 避免了数据库过分膨胀 但备注文件必须在一定的目录下 不能丢失 且同一目录下文件不能重名 对文件的管理造成一定的困难 另外 在OLE控件中浏览显示备注文件时 由于每次都要调用服务器程序 所以速度较慢   方法二 在数据库中用blob类型或者varbinary类型字段存储备注文件 当文件存储在数据库中以后 就可以删除硬盘上原来的临时文件 不需要复杂的二进制文件管理 且数据库可以存储在网络服务器上 对数据的共享非常方便 lishixinzhi/Article/program/SQL/201311/16227

java 存储数据到blob

将字符串转换成byte数组String.getBytes(),然后放进一个ByteArrayInputStream输入流中即可存入BLOB字段中PreparedStatement.setBlob(int parameterIndex, InputStream inputStream)

怎样将保存在数据库中BLOB类型的图片输出到浏览器上?

怎样将保存在数据库中BLOB类型的图片输出到浏览器上?可以的

在PB中用OLE存取blob类型数据(一)

   前言    在数据库的开发过程中 经常需要在数据库中存储一些备注信息 而这些备注信息的内容一般较大 格式多样 如有可能是语音文件 视频文件 图片文件 文本文件等 怎样在PB中实现这些格式不同的备注文件的存取及预览 一直是PB开发人员比较关心的一个问题 本文系统的介绍了三种存取备注二进制信息的方法   对备注二进制信息的存储可以采用以下三种方式   方法一 文件保存在固定的路径下 数据库中存取文件路径和名称   方法二 数据库中用blob类型或者varbinary类型字段存储备注文件   方法三 在本地用OLE存储结构存储备注文件    OLE的基本概念   ue5e5ue5e5OLE是Object Linking Embedding(对象链结与嵌入)的缩写 它可以使windows应用程序共享数据和程序    OLE控件   在PB中OLE控件是一个OLE对象的包容器 可以使用服务器应用程序提供的功能和命令来编辑对象 也可以使用自动化OLE交互 在程序中激活对象和向服务器应用程序发送命令 在PB 的window画板中的OLE控件允许用户从多个应用程序嵌入和链结组件    建立和设置OLE控件   从window画板中选择OLE控件插入window   当建立一个OLE控件并且插入一个对象时 PB将激活服务器应用程序以允许对对象进行编辑和修改 在使OLE中的对象称为非活动状态后 可以使用控件属性选项卡来设置控件的属性    激活修改window画板中的OLE对象   在OLE控件的弹出菜单中选择open可以激活画板中OLE对象   使用服务器应用程序修改OLE对象   结束修改 使对象恢复为非活动状态 只要单击服务器应用对象之外的任何区域即可 也可以直接关闭服务器应用程序的窗口    嵌入和链结OLE控件   可以将OLE对象嵌入或者链结到自己的应用程序中 嵌入对象的数据放在应用程序中 在开发过程中这些数据放在应用程序的PBl库中 当生成应用后 这些数据将存放在exe或PBd文件中 虽然在程序的运行过程中可以修改 但修改的数据不会保存 链结对象的数据存放在PB应用程序以外 当链结一个对象时 在PB应用程序中不存放数据文件 而是存放引用数据的指针 使用链结的数据 对数据的管理和保存都由服务器应用程序负责 这样可以用服务器应用程序修改处理数据 处理后的数据可以保存回原文件中 链结方式应用于需要多个应用程序共享的数据文件 任何一个应用程序修改了数据文件 都将影响到所有链结该文件的应用程序    OLE控件的激活方式   OLE控件的激活方式有offsite和in place两种激活方式 offsite激活方式是指在PB应用程序的界面以外单独打开OLE对象 in place激活方式是指PB应用程序的界面的原位置打开OLE对象 在数据窗口中的dbOLE默认的是offsite激活方式 而window中的OLE默认的激活方式是in place   在PB应用程序中可以用命令   OLE_control active(offsite) 或者OLE_control active(in place)设置OLE对象的以何种方式打开    设置和插入OLE对象   在程序运行时可以用函数   OLE_control insertfile(soucefile) 插入对象   OLE_control objectdata = blobvar 设置对象    OLE存储    OLE存储(OLEstorage)的概念   OLE存储(OLEstorage)是OLE数据的一个仓库 存储就象磁盘上的目录结构 它可以是一个OLE对象 也可以包含在OLE对象中 每个对象都包含在OLE存储或者存储内的子存储内 保存在OLE存储中数据称作OLE流(OLE stream) OLE流同OLE对象的关系就象文件同目录的关系 含有OLE对象的存储或子存储可以看做是属于特殊服务器的信息 在该层次之下的各部分都可以被相应的服务器程序操作 OLE存储对象是类用户对象 可以说明相应类型的变量 建立与之相应的实例和打开存储等 在使用完存储后需要关闭存储 释放分配的内存    OLE存储的打开和保存   OLE存储可以用open函数打开 open函数的格式为   Olecontrol Open(OLEsourcefile)   此函数在OLEsourcefile不存在时 自动创建该文件 所以创建OLE文件也用该函数 OLE存储可以用save函数保存 save函数的格式为   OLEcontrol save() // 保存OLE控件 lishixinzhi/Article/program/SQL/201311/16230

如何显示存储在BLOB字段中的图像? 详细03

showimges. asp " 在浏览器上单独显示图像 < % @ LANGUAGE=″VBSCRIPT″ % > < % Response. Expires = 0 Response. Buffer = TRUE Response. Clear " 清除已经存在的 HTTP header 信息 Response. ContentType = "image/gif" " 将 HTTP header 置为 image/gif, 表示传送的将是图像信息 Set cn = Server. CreateObj ect(″ADODB. Connection″) " 根据指定的数据源名 (myDSN) 将数据取出 cn. Open "DSN=myDSN;UID=sa;PWD=;DATABASE=pubs" Set rs = cn. Execute("SELECT photo FROM people WHERE id=" 3302" ″) Response. BinaryWrite rs("photo") Response. End % > 我将上面的代码加入到 IMAGE 标记中, 以实现将图像从SQL Server 取出并插入到合适的 HTML 或ASP 页面中: showimges. htm 可为什么有些时候图像不能正确显示, 而有些时候就能显示呢?这种情况我想可能会发生在直接用 MS Access 或 MS Visual FoxPro 作为图像数据输入工具时遇到。 其根本原因正如你在问题的开始说的, “从 SQL Server 的 BLOB 字段Photo 中取出. GIF 图像的二进制数据, 构造出一个 HTTP Header……”, 问题就在这里:在ASP 中, 认为从BLOB 字段中取出的图像数据是原始的. GIF 或. JPEG 格式的二进制数据流, 而浏览器也认做在 HTTP Header 之后所得到的数据是原始的. GIF 或. JPEG 格式的二进制数据流。 这时, 如果在BLOB 字段中再包含有其它的信息的话,那么这个图像就不能正确显示出来。 因为, 在作为图像数据输入工具时, 在存储图像数据的同时, 会在实际的图像数据之前加上 OLE 信息, 然后再一起存放到 BLOB 字段中。

js前端接受blob对象数组怎么去操作

这个只能用集合来实现。在JavaScript中,常用Array来存储和操作对象:Array:新建:var ary = new Array(); 或 var ary = [];增加:ary.push(value);删除:delete ary[n];遍历:for ( var i=0 ; i < ary.length ; ++i ) ary[i];

blob 如何在sql中查询?

【答案】:您好,一下SQL语言您可以试一试!DELETE FROM MIS..MIS.CONTRACT_PROJECT --清空Oracle表中的数据INSERT into MIS..MIS.CONTRACT_PROJECT--将SQLServer中的数据写到Oracle中SELECT contract_id,project_code,actual_money FROM contract_projectSELECT * FROM MIS..MIS.CONTRACT_PROJECT

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[],)转化。

oracle sql怎么查看blob字段

打开表的数据窗口。BLOB单元将被命名为(BLOB)。右键单击该单元格。您将看到一个铅笔< / strong>图标。单击它。它将打开一个blob编辑器窗口。

mysql使用blob存储base64格式文件

1.MySQL有四种BLOB类型:   ·tinyblob:仅255个字符   ·blob:最大限制到65K字节   ·mediumblob:限制到16M字节   ·longblob:可达4GB 2.mybatis对应mysql blob的类型 byte[] imgbytes对应了mysql imgbytes blob类型 3.将base64转成二进制的byte数组。直接就可存储到mysql中

MySQL blob是否会影响性能

会严重影响,因为blob字段的存储是指存指针,指向另外的磁盘页/扇区。每次查询都需要单独指向的位置读取,性能很差。

浏览器端生成的blob数据怎么上传给服务器端的TP处理

1. 首先嘛,你得在浏览器里输入要网址:2. 浏览器查找域名的IP地址导航的第一步是通过访问的域名找出其IP地址。DNS查找过程如下:浏览器缓存 – 浏览器会缓存DNS记录一段时间。 有趣的是,操作系统没有告诉浏览器储存DNS记录的时间,这样不同浏览器会储存个自固定的一个时间(2分钟到30分钟不等)。系统缓存 – 如果在浏览器缓存里没有找到需要的记录,浏览器会做一个系统调用(windows里是gethostbyname)。这样便可获得系统缓存中的记录。路由器缓存 – 接着,前面的查询请求发向路由器,它一般会有自己的DNS缓存。ISP DNS 缓存 – 接下来要check的就是ISP缓存DNS的服务器。在这一般都能找到相应的缓存记录。递归搜索 – 你的ISP的DNS服务器从跟域名服务器开始进行递归搜索,从.com顶级域名服务器到Facebook的域名服务器。一般DNS服务器的缓存中会有.com域名服务器中的域名,所以到顶级服务器的匹配过程不是那么必要了。DNS递归查找如下图所示:DNS有一点令人担忧,这就是像wikipedia.org 或者 facebook.com这样的整个域名看上去只是对应一个单独的IP地址。还好,有几种方法可以消除这个瓶颈:循环 DNS 是DNS查找时返回多个IP时的解决方案。举例来说,Facebook.com实际上就对应了四个IP地址。负载平衡器 是以一个特定IP地址进行侦听并将网络请求转发到集群服务器上的硬件设备。 一些大型的站点一般都会使用这种昂贵的高性能负载平衡器。地理 DNS 根据用户所处的地理位置,通过把域名映射到多个不同的IP地址提高可扩展性。这样不同的服务器不能够更新同步状态,但映射静态内容的话非常好。Anycast 是一个IP地址映射多个物理主机的路由技术。 美中不足,Anycast与TCP协议适应的不是很好,所以很少应用在那些方案中。大多数DNS服务器使用Anycast来获得高效低延迟的DNS查找。3. 浏览器给web服务器发送一个HTTP请求因为像Facebook主页这样的动态页面,打开后在浏览器缓存中很快甚至马上就会过期,毫无疑问他们不能从中读取。所以,浏览器将把一下请求发送到Facebook所在的服务器:GET HTTP/1.1Accept: application/x-ms-application, image/jpeg, application/xaml+xml, [...]User-Agent: Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1; WOW64; [...]Accept-Encoding: gzip, deflateConnection: Keep-AliveHost: facebook.comCookie: datr=1265876274-[...]; locale=en_US; lsd=WW[...]; c_user=2101[...]GET 这个请求定义了要读取的URL: “”。 浏览器自身定义 (User-Agent 头), 和它希望接受什么类型的相应 (Accept and Accept-Encoding 头). Connection头要求服务器为了后边的请求不要关闭TCP连接。请求中也包含浏览器存储的该域名的cookies。可能你已经知道,在不同页面请求当中,cookies是与跟踪一个网站状态相匹配的键值。这样cookies会存储登录用户名,服务器分配的密码和一些用户设置等。Cookies会以文本文档形式存储在客户机里,每次请求时发送给服务器。用来看原始HTTP请求及其相应的工具很多。作者比较喜欢使用fiddler,当然也有像FireBug这样其他的工具。这些软件在网站优化时会帮上很大忙。除了获取请求,还有一种是发送请求,它常在提交表单用到。发送请求通过URL传递其参数(e.g.: )。发送请求在请求正文头之后发送其参数。像“”中的斜杠是至关重要的。这种情况下,浏览器能安全的添加斜杠。而像“http: //example.com/folderOrFile”这样的地址,因为浏览器不清楚folderOrFile到底是文件夹还是文件,所以不能自动添加 斜杠。这时,浏览器就不加斜杠直接访问地址,服务器会响应一个重定向,结果造成一次不必要的握手。 4. facebook服务的永久重定向响应图中所示为Facebook服务器发回给浏览器的响应:HTTP/1.1 301 Moved PermanentlyCache-Control: private, no-store, no-cache, must-revalidate, post-check=0,pre-check=0Expires: Sat, 01 Jan 2000 00:00:00 GMTLocation: P3P: CP="DSP LAW"Pragma: no-cacheSet-Cookie: made_write_conn=deleted; expires=Thu, 12-Feb-2009 05:09:50 GMT;path=/; domain=.facebook.com; httponlyContent-Type: text/html; charset=utf-8X-Cnection: closeDate: Fri, 12 Feb 2011 05:09:51 GMTContent-Length: 0服务器给浏览器响应一个301永久重定向响应,这样浏览器就会访问“” 而非“”。为什么服务器一定要重定向而不是直接发会用户想看的网页内容呢?这个问题有好多有意思的答案。其中一个原因跟搜索引擎排名有 关。你看,如果一个页面有两个地址,就像 和,搜索引擎会认为它们是两个网站,结果造成每一个的搜索链接都减少从而降低排名。而搜索引擎知道301永久重定向是 什么意思,这样就会把访问带www的和不带www的地址归到同一个网站排名下。还有一个是用不同的地址会造成缓存友好性变差。当一个页面有好几个名字时,它可能会在缓存里出现好几次。5. 浏览器跟踪重定向地址现在,浏览器知道了“”才是要访问的正确地址,所以它会发送另一个获取请求:GET HTTP/1.1Accept: application/x-ms-application, image/jpeg, application/xaml+xml, [...]Accept-Language: en-USUser-Agent: Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1; WOW64; [...]Accept-Encoding: gzip, deflateConnection: Keep-AliveCookie: lsd=XW[...]; c_user=21[...]; x-referer=[...]Host: 头信息以之前请求中的意义相同。6. 服务器“处理”请求服务器接收到获取请求,然后处理并返回一个响应。这表面上看起来是一个顺向的任务,但其实这中间发生了很多有意思的东西- 就像作者博客这样简单的网站,何况像facebook那样访问量大的网站呢!Web 服务器软件web服务器软件(像IIS和阿帕奇)接收到HTTP请求,然后确定执行什么请求处理来处理它。请求处理就是一个能够读懂请求并且能生成HTML来进行响应的程序(像ASP.NET,PHP,RUBY...)。举 个最简单的例子,需求处理可以以映射网站地址结构的文件层次存储。像这个地 址会映射/httpdocs/folder1/page1.aspx这个文件。web服务器软件可以设置成为地址人工的对应请求处理,这样 page1.aspx的发布地址就可以是。请求处理请求处理阅读请求及它的参数和cookies。它会读取也可能更新一些数据,并讲数据存储在服务器上。然后,需求处理会生成一个HTML响应。所 有动态网站都面临一个有意思的难点 -如何存储数据。小网站一半都会有一个SQL数据库来存储数据,存储大量数据和/或访问量大的网站不得不找一些办法把数据库分配到多台机器上。解决方案 有:sharding (基于主键值讲数据表分散到多个数据库中),复制,利用弱语义一致性的简化数据库。委 托工作给批处理是一个廉价保持数据更新的技术。举例来讲,Fackbook得及时更新新闻feed,但数据支持下的“你可能认识的人”功能只需要每晚更新 (作者猜测是这样的,改功能如何完善不得而知)。批处理作业更新会导致一些不太重要的数据陈旧,但能使数据更新耕作更快更简洁。7. 服务器发回一个HTML响应图中为服务器生成并返回的响应:HTTP/1.1 200 OKCache-Control: private, no-store, no-cache, must-revalidate, post-check=0,pre-check=0Expires: Sat, 01 Jan 2000 00:00:00 GMTP3P: CP="DSP LAW"Pragma: no-cacheContent-Encoding: gzipContent-Type: text/html; charset=utf-8X-Cnection: closeTransfer-Encoding: chunkedDate: Fri, 12 Feb 2011 09:05:55 GMT2b3Tn@[...]整个响应大小为35kB,其中大部分在整理后以blob类型传输。内容编码头告诉浏览器整个响应体用gzip算法进行压缩。解压blob块后,你可以看到如下期望的HTML:<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" ""><html xmlns="" xml:lang="en"lang="en" id="facebook" class=" no_js">...关于压缩,头信息说明了是否缓存这个页面,如果缓存的话如何去做,有什么cookies要去设置(前面这个响应里没有这点)和隐私信息等等。请注意报头中把Content-type设置为“text/html”。报头让浏览器将该响应内容以HTML形式呈现,而不是以文件形式下载它。浏览器会根据报头信息决定如何解释该响应,不过同时也会考虑像URL扩展内容等其他因素。8. 浏览器开始显示HTML在浏览器没有完整接受全部HTML文档时,它就已经开始显示这个页面了:9. 浏览器发送获取嵌入在HTML中的对象在浏览器显示HTML时,它会注意到需要获取其他地址内容的标签。这时,浏览器会发送一个获取请求来重新获得这些文件。下面是几个我们访问facebook.com时需要重获取的几个URL:图片…CSS 式样表…JavaScript 文件…这些地址都要经历一个和HTML读取类似的过程。所以浏览器会在DNS中查找这些域名,发送请求,重定向等等...但 不像动态页面那样,静态文件会允许浏览器对其进行缓存。有的文件可能会不需要与服务器通讯,而从缓存中直接读取。服务器的响应中包含了静态文件保存的期限 信息,所以浏览器知道要把它们缓存多长时间。还有,每个响应都可能包含像版本号一样工作的ETag头(被请求变量的实体值),如果浏览器观察到文件的版本 ETag信息已经存在,就马上停止这个文件的传输。试着猜猜看“fbcdn.net”在地址中代表什么?聪明的答案是"Facebook内容分发网络"。Facebook利用内容分发网络(CDN)分发像图片,CSS表和JavaScript文件这些静态文件。所以,这些文件会在全球很多CDN的数据中心中留下备份。静态内容往往代表站点的带宽大小,也能通过CDN轻松的复制。通常网站会使用第三方的CDN。例如,Facebook的静态文件由最大的CDN提供商Akamai来托管。举例来讲,当你试着ping static.ak.fbcdn.net的时候,可能会从某个akamai.net服务器上获得响应。有意思的是,当你同样再ping一次的时候,响应的服务器可能就不一样,这说明幕后的负载平衡开始起作用了。10. 浏览器发送异步(AJAX)请求在Web 2.0伟大精神的指引下,页面显示完成后客户端仍与服务器端保持着联系。以 Facebook聊天功能为例,它会持续与服务器保持联系来及时更新你那些亮亮灰灰的好友状态。为了更新这些头像亮着的好友状态,在浏览器中执行的 JavaScript代码会给服务器发送异步请求。这个异步请求发送给特定的地址,它是一个按照程式构造的获取或发送请求。还是在Facebook这个例 子中,客户端发送给ajax/chat/buddy_list.php一个发布请求来获取你好友里哪个 在线的状态信息。提起这个模式,就必须要讲讲"AJAX"-- “异步JavaScript 和 XML”,虽然服务器为什么用XML格式来进行响应也没有个一清二白的原因。再举个例子吧,对于异步请求,Facebook会返回一些JavaScript的代码片段。除了其他,fiddler这个工具能够让你看到浏览器发送的异步请求。事实上,你不仅可以被动的做为这些请求的看客,还能主动出击修改和重新发送它们。AJAX请求这么容易被蒙,可着实让那些计分的在线游戏开发者们郁闷的了。(当然,可别那样骗人家~)Facebook聊天功能提供了关于AJAX一个有意思的问题案例:把数据从服务器端推送到客户端。因为HTTP是一个请求-响应协议,所以聊天服务器不能把新消息发给客户。取而代之的是客户端不得不隔几秒就轮询下服务器端看自己有没有新消息。这些情况发生时长轮询是个减轻服务器负载挺有趣的技术。如果当被轮询时服务器没有新消息,它就不理这个客户端。而当尚未超时的情况下收到了该客户的新消息,服务器就会找到未完成的请求,把新消息做为响应返回给客户端。

找不到数据类型 blob

Blob数据类型的使用: blob{200} bl_var // 定义一个初始大小为200字节blob blob bl_var // 普通定义方法,零长度blob bl_var = Blob(Space(200)) // 动态分配200个字节,实际上是分配了一个200字符的字符串,全部为空格(ASCII码20H),最后转换为blob。也就是开辟了一个200字节的内存区,内容都是20H,而不是00H。全部初始化为全零的变通方法:(DX有更直接方法吗?) blob bl_var bl_var = Blob(Space(200)) for i = 1 to Len(bl_var) BlobEdit(bl_var, i, Char(0)) next // BlobEdit()用于修改一个blob变量指定位置的值,修改值可以是任何类型(转换到blob字节)。 但是有个奇特的地方,PB会把char看作string,当写入了一个非零的字符(char)时,字符串以零字符结束,因此实际上修改了blob变量的两个字节(一个是字符本身,一个是零字节),解决方法是Blob(some_char),因为用Blob来转换字符串时,只有有效字符被转换,结尾的零字符会被忽略。而Blob(Char(0))将会返回一个空值,因为PB把char(0)作为零长度的字符串处理。 当修改值超出blob变量的范围时,该次修改将不起作用! // 对blob变量作逐字节处理的方法: // bl_source已经初始化,i是要处理的字节位置 blob{1} bl_byte // 声明单字节长度的blob int li_byte bl_byte = BlobMid (bl_source, i, 1) // Extract a byte li_byte = Asc(String(bl_byte)) // 转换到整型 ... // 对li_byte的值作任意处理,处于0-255单字节取值范围内 // 字节内容处理后再放回去 if li_byte = 0 then BlobEdit(bl_source, i, Char(0)) // 写入00H else BlobEdit(bl_source, i, Blob(Char(li_byte))) 如果还有什么不懂的地方,可以搜索编程回忆录,现在他们也开始录制了这方面的教程, 我觉得这个课程很不错,零基础开始,由浅入深,容易学。

MySQL 中 CLOB 和 BLOB的疑惑

text类型,其字符所占的字节数量跟字符集有关,比如utf8一个字符占三个字节。其长度为字符数,就是保存字符的数量上限,65535就是最多65535个字符,不管是英文还是汉字。blob类型,保存二进制数据,和字符集无关。其长度为字节数,就是该字段保存文件的大小上限,65535就是保存文件的大小上限为65k。

php如何将BLOB类型的数据存储到服务器上

将mysql中的表的字段改成blog格式,然后就能插入了。

手机浏览器浏览blob文件流(xlsx)

js 导出xlsx文件,以文件流形式传到前端,转化成blob类型,然后通过fileSaver转化成Excel文件, 一切看起来都很简单,用电脑浏览器导出的时候也很顺利,但是再用ipad导出的时候却出现空页面,用google浏览器,导出的时候甚至没有任何反应 原因就是这个blob的type是个空字符串,查一下MIME type,将这个type替换成对应的MIME type 即可正常导出

MySql Blob图片类型存储Bug解决

先在本地装了个Mysql,又装了个navicat管理工具,又新建了个工程来测试:简单的测试方法,就是放一个按钮,点击一下,读取远程图片,然后存到数据库,再读取出来显示到界面上。管理工具随意建了个表“D1”,弄了三个id,img,name三个字段。示例代码如下,因为测试,代码就没写的太规范:protectedvoidbtnTest_Click(objectsender,EventArgse){stringurl="http://www.baidu.com/img/baidu_jgylogo3.gif";boolresult=false;intid=0;stringconn="host=127.0.0.1;Port=3306;Database=test;uid=root;pwd=123456";//stringconn="server=.;database=demo;uid=sa;pwd=123456";using(MActionaction=newMAction("d1",conn)){WebClientwc=newWebClient();try{//if(action.Fill(2))//{byte[]data=wc.DownloadData(url);action.Set("img",data);action.Set("name","ldf");result=action.Insert(InsertOp.ID);id=action.Get<int>("id");//}}catch(Exceptionerr){Log.WriteLogToTxt(err);}}if(result)//再开一个读取试试{using(MActionaction=newMAction("d1",conn)){if(action.Fill(id)){Response.BinaryWrite(action.Get<byte[]>("img"));}}}}解决与调试经过:经本地测试,调试,发现对blob类型的参数赋值时,抛出异常:索引超出了数组界限。异常太迷惑,网上搜了一下,有人说是:Mysql.dll的版本问题,花了一个csdn积分下了一个6.2.3版本,还是不顶用。然后无意识的进行调试,估计运气问题,竟然让我发现了问题所在,只能说是运气好。看一段小代码,对参数的赋值,参数多数据库支持时,类似这种写法:DbParameterpara=_fac.CreateParameter();//通过工厂广告获得当前数据库类型的参数para.ParameterName=parameterName;para.Value=value==null?DBNull.Value:value;para.DbType=dbType;if(size>-1)//设定长度。{para.Size=size;}para.Direction=direction;这代码其实很简单:产生了一个参数,然后赋参数名,参数值,参数类型,参数大小和参数指向。而Mysql竟然在对参数Size赋值的问题处理上有些Bug。当我调试跳过对para.Size赋值时,竟然正常了。于是代码改成了这样:if(dbType!=DbType.Binary&&size>-1)//mysql不能设定长度,否则会报索引超出了数组界限错误。然后我测试了下其它数据库,发现指定size是正常的,最后得出一结论:经过测试,其它数据库类型对Size的赋值是正常的,唯Mysql有问题,为此,在编写进行多数据库支持的框架时,总会时不时的遇到好多问题,别纠结,始终要解决。

在PB中用OLE存取blob类型数据(二)

   处理blob类型数据   对于大二进制数据 在PB Script中是用blob数据类型表示并加以处理 标准SQL语句中的select insert和update语句无法直接查询blob类型的数据 在PB中操作blob类型的数据只能用专用的语句 从数据库中查询blob类型的数据的命令是   selectblob restofselectstatement {using transactionobject}   更新数据库中blob类型数据的格式是   updateblob tablename   set blobcolumn = blobvarible    restofupatestatement {using transctionobject}   如连接的数据库是sybase或者Sql 则selectblob和updateblob语句要求数据库的自动提交方式为true 所以在在每次调用selectblob和updateblob语句以前必须用命令 Sqlca automit=true 把数据库的自动提交方式设置为true 在updateblob语句的结束后 再用命令Sqlca automit = false 把自动提交方式设置为false 索数据的参数(如flag) 然后在可修改列的Protect后的框中输入(user_name是该DataWindow中的一列 代表输入者的名称)     数据窗口的blob列    数据窗口blob列的功能   在PB 的datawindow画板中DBOLE控件允许用户利用这个控件浏览和操作数据库中的大二进制数据 即通过DBOLE控件可以作如下操作   往数据库中存储大二进制数据 如 excel工作表 word文档 视频文件 图片文件等各种格式的文件   从数据库中检索数据到datawindow对象 ue5e5ue5e5   使用OLE服务器程序察看修改数据 ue5e5ue5e5   将修改后的数据保存回数据库    在数据窗口中添加blob列的的步骤    )选择具有二进制字段的数据表作为数据源建立一新的数据窗口(该窗口可以至少需要包含非数据库表的标识列)    )选择insert control OLE database blob 菜单 在数据窗口的detail节中要插入blob列的位置单击鼠标 这时将显示如图 所示的对话框   下面解释这些属性的具体含义    )client class 客户类名 默认为datawindow    )client name 客户名 默认为untitled    )table: 选择含有blob列的数据库表 所选表的字段将出现在右侧的large binary/text column列表框中    )large binary/text column 选择一个blob类型的字段列    )key clause 检索和更新blob数据的关键字表达式其中使用带冒号前缀的变量指出是数据窗口对象的列 如 表达式 id=:id id是数据库表中的列 变量指出数据窗口对象的列    )filetemplate 如果需要OLE应用服务器每次打开相同的文件 则在filetemplate框中输入文件名    )OLE class 如果不需要OLE应用服务器每次打开相同的文件 则在OLE class框中选择一个OLE类 如Pbrush    )Client name expression 显示在OLE服务器应用程序窗口标题的文字 可以输入为 对应记录的id号是 +id   单击ok按钮关闭对话框 将dbole列添加到适当的位置 保存数据窗口 lishixinzhi/Article/program/SQL/201311/16229

java里怎么判断Blob类型是否为空

要看写的Blob类型是什么是不是只的boolean类型还是声明为Boolean的类jdk1.4情况下java里有基本类型的boolean和Boolean的包装类。两者是有区别的。至于什么区别,我想楼主应该多看看书。Blooean的声明的变量是引用类型。这个引用将指向一个对象。该对象可以为空。例如:Boolean b = null;System.out.println(b);打印的结果是 null;当然如果声明为基本类型,打印结果默认是false的,例如:boolean b ;System.out.println(b);打印的结果是falsejdk5.0的情况没做测试结果不清楚。估计结果和上面是一样的。但是因为在jdk5.0的情况下包装类对象和基本类型似乎可以互相直接转化例如:int i = new Integer(5);这种语句在1.4情况下编译不过的,似乎5.0就可以。所以5.0以后的情况不确定

怎么将二进制数据存入Blob中

/// <summary>/// 通过 OLEDB 模板保存二进制(BLOB) 数据到数据库/// <sListName="session">传入的 session 应已经正常连接数据库</param>/// <sListName="sSelectSQL">查询二进制数据的 SQL 语句,有且只有一个二进制对应的查询列,并且可返回唯一一条记录。例如:SELECT Photo FROM TB_PHOTO WHERE ID=1</param>/// <sListName="pIStream">已写入了二进制(BLOB) 数据的 IStream 接口。</param>/// <returns>标准 HRESULT</returns>/// </summary>HRESULT CXTrainApp::SaveBLOBData(CSession& session, LPCTSTR sSelectSQL, IStream* pIStream){ASSERT(session.m_spOpenRowset != NULL); //传入的 session 应已经正常连接数据库ASSERT(sSelectSQL != NULL);ASSERT(pIStream != NULL);HRESULT hr = 0;// 属性CDBPropSet propSet(DBPROPSET_ROWSET); // 这是行属性propSet.AddProperty(DBPROP_IRowsetChange, true); // 设置支持 IRowsetChange 接口,否则后面 CManualAccessor 的 m_spRowsetChange 接口为空propSet.AddProperty(DBPROP_UPDATABILITY, DBPROPVAL_UP_CHANGE); // 设置结果集允许修改// 借用 CManualAccessor 特性简化代码,否则额外需要很长的代码以获取一些接口CCommand<CManualAccessor> cmdBlob;if (FAILED(hr = cmdBlob.Open(session, sSelectSQL, &propSet)))return hr;// CManualAccessor 未提供可以绑定 ISequentialStream 的成员函数,这部分功能需要自行实现 ...// 自行获取 IAccessor 接口 (CManualAccessor 中未直接提供该接口)CComPtr<IAccessor> pIAccessor = NULL;if (FAILED(hr = cmdBlob.m_spRowsetChange->QueryInterface(IID_IAccessor, (void**)&pIAccessor)))return hr;// 借用 OLEDB 模板函数填充绑定结构 DBBINDINGDBOBJECT dbObject = { STGM_READ, __uuidof(ISequentialStream) };DBBINDING dbBinding = { 0 };CAccessorBase::Bind(&dbBinding, 1, DBTYPE_IUNKNOWN, sizeof(IUnknown*), 0, 0, DBPARAMIO_NOTPARAM, 0, 0, 0, &dbObject);// 用 IAccessor 接口根据 DBBINDING 自行创建 HACCESSORHACCESSOR hAccessor = DB_NULL_HACCESSOR;if (FAILED(hr = pIAccessor->CreateAccessor(DBACCESSOR_ROWDATA, 1, &dbBinding, sizeof(ISequentialStream*), &hAccessor, NULL)))return hr;// 借用 OLEDB 模板函数,效果与 cmdBlob.GetNextResult() 相同if (S_OK != (hr = cmdBlob.MoveNext())){ASSERT(hr == S_OK); // 只能在已存在的记录中保存数据,事先应 Insert 记录return hr;}// 复位 IStream 至开始位置pIStream->Seek({ 0 }, CFile::begin, NULL);// IStream 继承自 ISequentialStream, 因此可以直接从 IStream 获取 ISequentialStream 接口ISequentialStream* pISequentialStream = NULL;//(不能用 CComPtr,ISequentialStream 接口似乎会自动释放 ...)pIStream->QueryInterface(IID_ISequentialStream, (void**)&pISequentialStream);// CManualAccessor 自带的 SetData 不能实现二进制写入,需直接调用 IRowsetChange 的 SetData 方法保存数据return cmdBlob.m_spRowsetChange->SetData(cmdBlob.m_hRow, hAccessor, &pISequentialStream);}

如何用ResultSet.getBlob得到解密后的数据

1.使用jdk中的方法进行传输。在ResultSet 中有getBlob()方法,在PreparedStatement中有setBlob()方法,所以大多数人都会尝试setBlob(),getBlob() 进行读写,或者两个数据库之间BLOB的传输。这种方法实际上是行不通的,据网上的一些资料介绍,说sun官方的文档有些方法都是错误的。2.使用ResultSet.getBinaryStream 和PreparedStatement.setBinaryStream对BLOB进行读写或两个数据库间的传输。这种方法我自己尝试过,发现,如果BLOB中存储的是文本文件的话,就没问题,如果是二进制文件,传输就会有问题。根据自己的经验,以及查阅了Oracle的官方文档,都是使用如下处理方法:1.新建记录,插入BLOB数据 1.1首先新建记录的时候,使用oracle的函数插入一个空的BLOB,假设字段A是BLOB类型的: insert xxxtable(A,B,C) values(empty_blob(),"xxx","yyyy") 1.2后面再查询刚才插入的记录,然后更新BLOB,在查询前,注意设置Connection的一个属性: conn.setAutoCommit(false);如果缺少这一步,可能导致fetch out of sequence等异常. 1.3 查询刚才插入的记录,后面要加“ for update ”,如下: select A from xxxtable where xxx=999 for update ,如果缺少for update,可能出现row containing the LOB value is not locked的异常 1.4 从查询到的 BLOB字段中,获取blob并进行更新,代码如下: BLOB blob = (BLOB) rs.getBlob("A"); OutputStream os = blob.getBinaryOutputStream(); BufferedOutputStream output = new BufferedOutputStream(os); 后面再使用output.write方法将需要写入的内容写到output中就可以了。例如我们将一个文件写入这个字段中: BufferedInputStream input = new BufferedInputStream(new File("c://hpWave.log").toURL().openStream()); byte[] buff = new byte[2048]; //用做文件写入的缓冲 int bytesRead; while(-1 != (bytesRead = input.read(buff, 0, buff.length))) { output.write(buff, 0, bytesRead); System.out.println(bytesRead); } 上面的代码就是从input里2k地读取,然后写入到output中。 1.5上面执行完毕后,记得关闭output,input,以及关闭查询到的ResultSet 1.6最后执行conn.commit();将更新的内容提交,以及执行conn.setAutoCommit(true); 改回Connction的属性2.修改记录,方法与上面的方法类似, 2.1首先更新BLOB以外的其他字段 2.2 使用1.3中类似的方法获取记录 2.3 修改的过程中,注意以下:a 需要更新的记录中,BLOB有可能为NULL,这样在执行blob.getBinaryOutputStream()获取的值可能为null,那么就关闭刚才select的记录,再执行一次update xxxtable set A = empty_blob() where xxx, 这样就先写入了一个空的BLOB(不是null),然后再使用1.3,1.4中的方法执行更新记录.b 注意别忘了先执行setAutoCommit(false),以及"for update",以及后面的conn.commit();等。3.读取BLOB字段中的数据. 3.1 读取记录不需要setAutoCommit(),以及 select ....for update. 3.2 使用普通的select 方法查询出记录 3.3 从ResultSet中获取BLOB并读取,如下: BLOB b_to = (BLOB) rs.getBlob("A"); InputStream is = b_from.getBinaryStream(); BufferedInputStream input = new BufferedInputStream(is); byte[] buff = new byte[2048]; while(-1 != (bytesRead = input.read(buff, 0, buff.length))) { //在这里执行写入,如写入到文件的BufferedOutputStream里 System.out.println(bytesRead); } 通过循环取出blob中的数据,写到buff里,再将buff的内容写入到需要的地方4.两个数据库间blob字段的传输类似上面1和3的方法,一边获取BufferedOutputStream,另外一边获取BufferedInputStream,然后读出写入,需要注意的是写入所用的Connection要执行conn.setAutoCommit(false);以及获取记录时添加“ for update ”以及最后的commit();总结以上方法,其根本就是先创建空的BLOB,再获取其BufferedOutputStream进行写入,或获取BufferedInputStream进行读取(1)对数据库clob型执行插入操作   *************************************************      java.sql.PreparedStatement pstmt = null;   ResultSet rs = null;   String query = "";      conn.setAutoCommit(false);    query = "insert into clobtest_table(id,picstr) values(?,empty_clob())";   java.sql.PreparedStatement pstmt = conn.prepareStatement(query);   pstmt.setString(1,"001");   pstmt.executeUpdate();   pstmt = null    query = "select picstr from clobtest_table where id = "001" for update";   pstmt = con.prepareStatement(query)   rs= pstmt.executeQuery();      oracle.sql.CLOB clobtt = null;   if(rs.next()){    clobtt = (oracle.sql.CLOB)rs.getClob(1);   }   Writer wr = clobtt.getCharacterOutputStream();   wr.write(strtmp);   wr.flush();   wr.close();   rs.close();   con.commit();            (2)通过sql/plus查询是否已经成功插入数据库   *************************************************      PL/SQL的包DBMS_LOB来处理LOB数据。察看刚才的插入是否成功。使用DBMS_LOB包的getlength这个procedure来检测是否已经将str存入到picstr字段中了。如:      SQL> select dbms_lob.getlength(picstr) from clobtest_table;         (3)对数据库clob型执行读取操作   *************************************************      读取相对插入就很简单了。基本步骤和一半的取数据库数据没有太大的差别。   String description = ""    query = "select picstr from clobtest_table where id = "001"";   pstmt = con.prepareStatement(query);   ResultSet result = pstmt.executeQuery();   if(result.next()){    oracle.jdbc.driver.OracleResultSet ors =    (oracle.jdbc.driver.OracleResultSet)result;    oracle.sql.CLOB clobtmp = (oracle.sql.CLOB) ors.getClob(1);       if(clobtmp==null || clobtmp.length()==0){    System.out.println("======CLOB对象为空 ");    description = "";    }else{    description=clobtmp.getSubString((long)1,(int)clobtmp.length());    System.out.println("======字符串形式 "+description);    }   }

如何往oracle中的blob字段写入照片数据

往oracle里面类型为blob写入时,必须先插入一个empty_blob,实行update……具体java里面写入blob的代码如下:public class applyPhotoBLOB { final static String sDBDriver = "oracle.jdbc.driver.OracleDriver";public static void main(String[] args) { // TODO Auto-generated method stub Connection connSDC = null; Connection conn = null; String sConnStr = "jdbc:oracle:thin:@127 0.0 1 1521:sledu"; String sConnStrSDC = "jdbc:oracle:thin:@10 10 8.12:1521:rac2"; String sDBUid = "test"; String sDBPwd = "test"; String sDBUidSDC = "sdcmanager"; String sDBPwdSdc = "sdcmanager_888"; try { applyPhotoBLOB apply = new applyPhotoBLOB(); connSDC = apply.getConn(sConnStrSDC,sDBUidSDC,sDBPwdSdc); if(connSDC!=null) { apply.testBOLB(connSDC); } System.out.println("处理完成!"); } catch(Exception e) { System.out.println(e.getMessage()); } finally { try { if(conn!=null) conn.close(); if(connSDC!=null) connSDC.close(); } catch(Exception e) { System.out.println(e.getMessage()); } } } public void testBOLB(Connection conn) throws Exception { String strSQL = "Insert Into BKS_XSZPXX(XH,ZPLXM,ZP) Values("3071801040","1",empty_blob())"; updateTable1(strSQL,conn); conn.setAutoCommit(false); strSQL = "Select ZP from BKS_XSZPXX where XH="3071801040" For Update"; Statement stmt = null; ResultSet rs = null; stmt = conn.createStatement(); rs = stmt.executeQuery(strSQL); rs.next(); BLOB blob = (BLOB) rs.getBlob("ZP"); OutputStream os = blob.getBinaryOutputStream();// 建立输出流 BufferedOutputStream output = new BufferedOutputStream(os); BufferedInputStream input = new BufferedInputStream(new File("F:/3071801040.jpg").toURL().openStream()); byte[] buff = new byte[2048000]; //用做文件写入的缓冲 int bytesRead; while(-1 != (bytesRead = input.read(buff, 0, buff.length))) { output.write(buff, 0, bytesRead); //System.out.println(bytesRead); } output.close(); input.close(); rs.close(); conn.commit(); conn.setAutoCommit(true); stmt.close(); } private int updateTable1(String strSQL,Connection conn) throws Exception { PreparedStatement stmt = null; int result = 0; try { stmt = conn.prepareStatement(strSQL); result = stmt.executeUpdate(); } catch(Exception e) { throw new Exception(e.getMessage()); } finally { stmt.close(); } return result ; } public Connection getConn(String StrConn,String uid,String pwd) throws Exception { Connection conn = null; try { Class.forName(sDBDriver); conn = DriverManager.getConnection(StrConn,uid,pwd); } catch (Exception e) { throw new Exception(e.getMessage()); } return conn; }}另外:放入business里面的时候,其zp最好定义为InputStream转载,仅供参考。

BLOB是什么文件,用什么打开

是二进制对象,可以通过byte获取

c# 如何解析blob 类型的二进制数据

OdbcConnection cn = new OdbcConnection("DSN=Testgdb;UID=SYSDBA;PWD=masterkey;"); try { //写入BLOB字段 byte[] myBlob = System.Text.Encoding.UTF8.GetBytes(TextBoxDetails.Text); string myString = string.Format("update customer set SUMMARY= (@summary) where CUSTID="{0}" and SNAME="{1}"",TextBoxNo.Text , TextBoxCorp.Text); cn.Open(); OdbcCommand cmd = new OdbcCommand(myString, cn); cmd.Parameters.Add("@summary", SqlDbType.Image).Value = myData; Response.Write(myString); cmd.ExecuteNonQuery(); } catch (OdbcException ex) { Response.Write(ex.Message); } finally { cn.Close(); }

blob数据能直接显示二进制吗

可以。如果只想输出二进制,转成2进制字符串输出就行了,一般都是转成16进制比较容易看。如果二进制内容是有特殊含义可以转义的,比如照片,送给照片显示程序。

SQL中binary 和 varbinary的区别 blob

binary 和 varbinary固定长度 (binary) 的或可变长度 (varbinary) 的 binary 数据类型。binary [ ( n ) ]固定长度的 n 个字节二进制数据。N 必须从 1 到 8,000。存储空间大小为 n+4 字节。 varbinary [ ( n ) ]n 个字节变长二进制数据。n 必须从 1 到 8,000。存储空间大小为实际输入数据长度 +4 个字节,而不是 n 个字节。输入的数据长度可能为 0 字节。在 SQL-92 中 varbinary 的同义词为 binary varying。注释如果在数据定义或变量声明语句中没有指定 n,默认长度为 1。如果没有用 CAST 函数指定 n,默认长度为 30。当列数据项大小一致时应使用 binary。当列数据项大小不一致时应使用 varbinary。BLOB (binary large object),二进制大对象,是一个可以存储二进制文件的容器。在计算机中,BLOB常常是数据库中用来存储二进制文件的字段类型。BLOB是一个大文件,典型的BLOB是一张图片或一个声音文件,由于它们的尺寸,必须使用特殊的方式来处理(例如:上传、下载或者存放到一个数据库)。大型对象BLOB就是使用二进制保存数据。如:保存位图。CLOB使用CHAR来保存数据。如:保存XML文档。MySQL中,BLOB是个类型系列,包括:TinyBlob、Blob、MediumBlob、LongBlob,这几个类型之间的唯一区别是在存储文件的最大大小上不同。MySQL的四种BLOB类型类型 大小(单位:字节)TinyBlob 最大 255Blob 最大 65KMediumBlob 中等16MLongBlob 最大 4G

怎样提取blob数据类型中的信息

不知道你用的编程语言是什么 若是java 的话 直接从数据库里面拿(如果有hibernate支持)那就domain.getBlob()。然后用流去将blob转换成string 具体怎么做 百度。存值的时候是将表单的string转换成blob再塞进数据库。newSerialBlob(String对象的.getBytes())

Oracle中关于blob数的处理

blob是以二进制的形式存储大型数据,如图片、视频、文本 一般blob数据长度会很大,oracle缓冲区最大支持长度为2000,所以需要将原文分段转化

flash保存东西提示协议blob是未知的

1、打开控制面板,在FlashPlayer里点高级选项。2、选择删除全部,然后回到储存选项,勾选第一个即可。

java 怎样将File 对象转换为Blob

Blob...好像不是常用类型,是自定义的吧。好吧,最简单的方法。假设已知File类型的file1。List testList=new ArrayList();testList.add(file1);Blob blob=(Blob)testList.get(0);如果可以强转的话,以上代码均有效。换句话说只要Blob是File类型的子类以上代码就有效,否则报错,无法强转。

如何用ADOBlobStream的stream方式读写blob字段

1.使用jdk中的方法进行传输。在ResultSet 中有getBlob()方法,在PreparedStatement中有setBlob()方法,所以大多数人都会尝试setBlob(),getBlob() 进行读写,或者两个数据库之间BLOB的传输。这种方法实际上是行不通的,据网上的一些资料介绍,说sun官方的文档有些方法都是错误的。2.使用ResultSet.getBinaryStream 和PreparedStatement.setBinaryStream对BLOB进行读写或两个数据库间的传输。这种方法我自己尝试过,发现,如果BLOB中存储的是文本文件的话,就没问题,如果是二进制文件,传输就会有问题。根据自己的经验,以及查阅了Oracle的官方文档,都是使用如下处理方法:1.新建记录,插入BLOB数据 1.1首先新建记录的时候,使用oracle的函数插入一个空的BLOB,假设字段A是BLOB类型的: insert xxxtable(A,B,C) values(empty_blob(),"xxx","yyyy") 1.2后面再查询刚才插入的记录,然后更新BLOB,在查询前,注意设置Connection的一个属性: conn.setAutoCommit(false);如果缺少这一步,可能导致fetch out of sequence等异常. 1.3 查询刚才插入的记录,后面要加“ for update ”,如下: select A from xxxtable where xxx=999 for update ,如果缺少for update,可能出现row containing the LOB value is not locked的异常 1.4 从查询到的 BLOB字段中,获取blob并进行更新,代码如下: BLOB blob = (BLOB) rs.getBlob("A"); OutputStream os = blob.getBinaryOutputStream(); BufferedOutputStream output = new BufferedOutputStream(os); 后面再使用output.write方法将需要写入的内容写到output中就可以了。例如我们将一个文件写入这个字段中: BufferedInputStream input = new BufferedInputStream(new File("c://hpWave.log").toURL().openStream()); byte[] buff = new byte[2048]; //用做文件写入的缓冲 int bytesRead; while(-1 != (bytesRead = input.read(buff, 0, buff.length))) { output.write(buff, 0, bytesRead); System.out.println(bytesRead); } 上面的代码就是从input里2k地读取,然后写入到output中。 1.5上面执行完毕后,记得关闭output,input,以及关闭查询到的ResultSet 1.6最后执行conn.commit();将更新的内容提交,以及执行conn.setAutoCommit(true); 改回Connction的属性2.修改记录,方法与上面的方法类似, 2.1首先更新BLOB以外的其他字段 2.2 使用1.3中类似的方法获取记录 2.3 修改的过程中,注意以下:a 需要更新的记录中,BLOB有可能为NULL,这样在执行blob.getBinaryOutputStream()获取的值可能为null,那么就关闭刚才select的记录,再执行一次update xxxtable set A = empty_blob() where xxx, 这样就先写入了一个空的BLOB(不是null),然后再使用1.3,1.4中的方法执行更新记录.b 注意别忘了先执行setAutoCommit(false),以及"for update",以及后面的conn.commit();等。3.读取BLOB字段中的数据. 3.1 读取记录不需要setAutoCommit(),以及 select ....for update. 3.2 使用普通的select 方法查询出记录 3.3 从ResultSet中获取BLOB并读取,如下: BLOB b_to = (BLOB) rs.getBlob("A"); InputStream is = b_from.getBinaryStream(); BufferedInputStream input = new BufferedInputStream(is); byte[] buff = new byte[2048]; while(-1 != (bytesRead = input.read(buff, 0, buff.length))) { //在这里执行写入,如写入到文件的BufferedOutputStream里 System.out.println(bytesRead); } 通过循环取出blob中的数据,写到buff里,再将buff的内容写入到需要的地方4.两个数据库间blob字段的传输类似上面1和3的方法,一边获取BufferedOutputStream,另外一边获取BufferedInputStream,然后读出写入,需要注意的是写入所用的Connection要执行conn.setAutoCommit(false);以及获取记录时添加“ for update ”以及最后的commit();总结以上方法,其根本就是先创建空的BLOB,再获取其BufferedOutputStream进行写入,或获取BufferedInputStream进行读取1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859(1)对数据库clob型执行插入操作   *************************************************      java.sql.PreparedStatement pstmt = null;   ResultSet rs = null;   String query = "";      conn.setAutoCommit(false);    query = "insert into clobtest_table(id,picstr) values(?,empty_clob())";   java.sql.PreparedStatement pstmt = conn.prepareStatement(query);   pstmt.setString(1,"001");   pstmt.executeUpdate();   pstmt = null    query = "select picstr from clobtest_table where id = "001" for update";   pstmt = con.prepareStatement(query)   rs= pstmt.executeQuery();      oracle.sql.CLOB clobtt = null;   if(rs.next()){    clobtt = (oracle.sql.CLOB)rs.getClob(1);   }   Writer wr = clobtt.getCharacterOutputStream();   wr.write(strtmp);   wr.flush();   wr.close();   rs.close();   con.commit();            (2)通过sql/plus查询是否已经成功插入数据库   *************************************************      PL/SQL的包DBMS_LOB来处理LOB数据。察看刚才的插入是否成功。使用DBMS_LOB包的getlength这个procedure来检测是否已经将str存入到picstr字段中了。如:      SQL> select dbms_lob.getlength(picstr) from clobtest_table;         (3)对数据库clob型执行读取操作   *************************************************      读取相对插入就很简单了。基本步骤和一半的取数据库数据没有太大的差别。   String description = ""    query = "select picstr from clobtest_table where id = "001"";   pstmt = con.prepareStatement(query);   ResultSet result = pstmt.executeQuery();   if(result.next()){    oracle.jdbc.driver.OracleResultSet ors =    (oracle.jdbc.driver.OracleResultSet)result;    oracle.sql.CLOB clobtmp = (oracle.sql.CLOB) ors.getClob(1);       if(clobtmp==null || clobtmp.length()==0){    System.out.println("======CLOB对象为空 ");    description = "";    }else{    description=clobtmp.getSubString((long)1,(int)clobtmp.length());    System.out.println("======字符串形式 "+description);    }   }

oracle中blob,clob,nclob,Bfile主要区别是什么? .

他们的最大存储大小都为4gbBFILE 二进制文件,存储在数据库外的操作系统文件,只读的。把此文件当二进制处理。(类似于long类型)BLOB 二进制大对象。存储在数据库里的大对象,一般是图像声音等文件。 (类似于row和long row)CLOB 字符型大对象。一般存储大数量文本信息。存储单字节,固定宽度的数据。NCLOB 字节字符大对象。存储单字节大块,多字节固定宽度Bfile和clob,nclob,blob是不同的。Bfile是外部的lob类型,其他三个是oracle内部的lob类型,它们至少有三点主要不同的地方:1. bfile的值是存在操作系统的文件中,而不是数据库中。2. bfile不参与数据库事务操作。也就是改变bifle不能commit或rollback。但是改变bfile的locator可以commit或rollback。3. bfile在plsql和oracle中是只读的,不允许写。

怎样将保存在数据库中BLOB类型的图片输出到浏览器上?

分类: 电脑/网络 >> 程序设计 >> 其他编程语言 解析: <%@ page contentType="text/; charset=gbk" %> <%@ page import="java.io.*"%> <%@ page import="java.sql.*, javax.sql.*" %> <%@ page import="java.util.*"%><%@ page import="java.math.*"%> <% String photo_no = request.getParameter("photo_no"); mysql连接 Class.forName(".mysql.jdbc.Driver").newInstance(); String URL="jdbc:mysqllocalhost:3306/job?user=root&password=111111"; Connection con = DriverManager.getConnection(URL); oracle连接 String URL="jdbc:oracle:thin@localhost:1521:orcl2"; user="system"; password="manager"; Connection con = DriverManager.getConnection(URL,user,password); try{ 准备语句执行对象 Statement stmt = con.createStatement(); String sql = " SELECT * FROM PHOTO WHERE photo_no = "+ photo_no; ResultSet rs = stmt.executeQuery(sql); if (rs.next()) { Blob b = rs.getBlob("photo_image"); long size = b.length(); out.print(size); byte[] bs = b.getBytes(1, (int)size); response.setContentType("image/jpeg"); OutputStream outs = response.getOutputStream(); outs.write(bs); outs.flush(); rs.close(); } else { rs.close(); response.sendRedirect("./images/error.gif"); } } finally{ con.close(); } %> 请参考programfan/article/showarticle?id=2817

Mysql中如何实现Blob的存取?

此实现为用java访问mysql的blob,对图片进行存取/** * Title: BlobPros.java * Project: test * Description: 把图片存入mysql中的blob字段,并取出 * Call Module: mtools数据库中的tmp表 * File: C:downloadsluozsh.jpg * Copyright: Copyright (c) 2003-2003 * Company: uniware * Create Date: 2002.12.5 * @Author: ChenQH * @version 1.0 版本* * * Revision history * Name Date Description * ---- ---- ----------- * Chenqh 2003.12.5 对图片进行存取 * * note: 要把数据库中的Blob字段设为longblob * *///package com.uniware;import java.io.*;import java.util.*;import java.sql.*;public class BlobPros{ private static final String URL = "jdbc:mysql://10.144.123.63:3306/mtools?user=wind&password=123&useUnicode=true"; private Connection conn = null; private PreparedStatement pstmt = null; private ResultSet rs = null; private File file = null; public BlobPros() { } /** * 向数据库中插入一个新的BLOB对象(图片) * @param infile 要输入的数据文件 * @throws java.lang.Exception */ public void blobInsert(String infile) throws Exception { FileInputStream fis = null; try { Class.forName("org.gjt.mm.mysql.Driver").newInstance(); conn = DriverManager.getConnection(URL); file = new File(infile); fis = new FileInputStream(file); //InputStream fis = new FileInputStream(infile); pstmt = conn.prepareStatement("insert into tmp(descs,pic) values(?,?)"); pstmt.setString(1,file.getName()); //把传过来的第一个参数设为文件名 //pstmt.setBinaryStream(2,fis,(int)file.length()); //这种方法原理上会丢数据,因为file.length()返回的是long型 pstmt.setBinaryStream(2,fis,fis.available()); //第二个参数为文件的内容 pstmt.executeUpdate(); } catch(Exception ex) { System.out.println("[blobInsert error : ]" + ex.toString()); } finally { //关闭所打开的对像// pstmt.close(); fis.close(); conn.close(); } }/** * 从数据库中读出BLOB对象 * @param outfile 输出的数据文件 * @param picID 要取的图片在数据库中的ID * @throws java.lang.Exception */ public void blobRead(String outfile,int picID) throws Exception { FileOutputStream fos = null; InputStream is = null; byte[] Buffer = new byte[4096]; try { Class.forName("org.gjt.mm.mysql.Driver").newInstance(); conn = DriverManager.getConnection(URL); pstmt = conn.prepareStatement("select pic from tmp where id=?"); pstmt.setInt(1,picID); //传入要取的图片的ID rs = pstmt.executeQuery(); rs.next(); file = new File(outfile); if(!file.exists()) { file.createNewFile(); //如果文件不存在,则创建 } fos = new FileOutputStream(file); is = rs.getBinaryStream("pic"); int size = 0; /* while(size != -1) { size = is.read(Buffer); //从数据库中一段一段的读出数据 //System.out.println(size); if(size != -1) //-1表示读到了文件末 fos.write(Buffer,0,size); } */ while((size = is.read(Buffer)) != -1) { //System.out.println(size); fos.write(Buffer,0,size); } } catch(Exception e) { System.out.println("[OutPutFile error : ]" + e.getMessage()); } finally { //关闭用到的资源 fos.close(); rs.close(); pstmt.close(); conn.close(); } } public static void main(String[] args) { try { BlobPros blob = new BlobPros(); //blob.blobInsert("C:Downloadsluozsh1.jpg"); blob.blobRead("c:/downloads/1.jpg",47); } catch(Exception e) { System.out.println("[Main func error: ]" + e.getMessage()); } }}

如何在DB2的存储过程中用BLOB

要保存图片的字段列的类型设置成image然后插入的时候,取它的绝对路径insert into 表名 values(@"C:/123.JPG")可以用BLOB(string)函数将字符串转化为blob再插入,如下:create table test(c1 blob(200)); insert into test values(blob("Hello, world"));其他的方法可能需要用别的语言来写了,这种是在数据库下操作

如何解决BDE中的BLOB字段错误

1.使用jdk中的方法进行传输。在ResultSet 中有getBlob()方法,在PreparedStatement中有setBlob()方法,所以大多数人都会尝试setBlob(),getBlob() 进行读写,或者两个数据库之间BLOB的传输。这种方法实际上是行不通的,据网上的一些资料介绍,说sun官方的文档有些方法都是错误的。2.使用ResultSet.getBinaryStream 和PreparedStatement.setBinaryStream对BLOB进行读写或两个数据库间的传输。这种方法我自己尝试过,发现,如果BLOB中存储的是文本文件的话,就没问题,如果是二进制文件,传输就会有问题。根据自己的经验,以及查阅了Oracle的官方文档,都是使用如下处理方法:1.新建记录,插入BLOB数据1.1首先新建记录的时候,使用oracle的函数插入一个空的BLOB,假设字段A是BLOB类型的:insert xxxtable(A,B,C) values(empty_blob(),"xxx","yyyy")1.2后面再查询刚才插入的记录,然后更新BLOB,在查询前,注意设置Connection的一个属性:conn.setAutoCommit(false);如果缺少这一步,可能导致fetch out of sequence等异常.1.3 查询刚才插入的记录,后面要加“ for update ”,如下:select A from xxxtable where xxx=999 for update ,如果缺少for update,可能出现row containing the LOB value is not locked的异常1.4 从查询到的 BLOB字段中,获取blob并进行更新,代码如下:BLOB blob = (BLOB) rs.getBlob("A");OutputStream os = blob.getBinaryOutputStream();BufferedOutputStream output = new BufferedOutputStream(os);后面再使用output.write方法将需要写入的内容写到output中就可以了。例如我们将一个文件写入这个字段中:BufferedInputStream input = new BufferedInputStream(new File("c://hpWave.log").toURL().openStream());byte[] buff = new byte[2048]; //用做文件写入的缓冲int bytesRead;while(-1 != (bytesRead = input.read(buff, 0, buff.length))) {output.write(buff, 0, bytesRead);System.out.println(bytesRead);}上面的代码就是从input里2k地读取,然后写入到output中。1.5上面执行完毕后,记得关闭output,input,以及关闭查询到的ResultSet1.6最后执行conn.commit();将更新的内容提交,以及执行conn.setAutoCommit(true); 改回Connction的属性

java中blob类型是什么类型

java基本类型中没有blob类型,应该是自定义的一个类。

android如何显示blob字段?求答案

写这种代码概念也要先搞清楚,下面是关于blob的一些概念:BLOB的含义  BLOB (binary large object),二进制大对象,是一个可以存储二进制文件的容器。   在计算机中,BLOB常常是数据库中用来存储二进制文件的字段类型。   BLOB是一个大文件,典型的BLOB是一张图片或一个声音文件,由于它们的尺寸,必须使用特殊的方式来处理(例如:上传、下载或者存放到一个数据库)。   根据Eric Raymond的说法,处理BLOB的主要思想就是让文件处理器(如数据库管理器)不去理会文件是什么,而是关心如何去处理它。   但也有专家强调,这种处理大数据对象的方法是把双刃剑,它有可能引发一些问题,如存储的二进制文件过大,会使数据库的性能下降。在数据库中存放体积较大的多媒体对象就是应用程序处理BLOB的典型例子。编辑本段BLOB和CLOB的区别  大型对象   BLOB就是使用二进制保存数据。   如:保存位图。   CLOB使用CHAR来保存数据。

怎样从数据库中调用blob图片 并把它显示在网页上

在OracleQueryBean类中增加一个函数,来进行读取,具体代码如下:/** * 根据图片在数据库中的ID进行读取 * @param strID 图片字段ID * @param w 需要缩到的宽度 * @param h 需要缩到高度 * @return */ public byte[] GetImgByteById(String strID, int w, int h){ //System.out.println("Get img data which id is " + nID); if(myConnection == null) this.getConnection(); byte[] data = null; try { Statement stmt = myConnection.createStatement(); ResultSet myResultSet = stmt.executeQuery("select " + this.strIDName + " from " + this.strTabName + " where " + this.strIDName + "=" + strID); StringBuffer myStringBuffer = new StringBuffer(); if (myResultSet.next()) { java.sql.Blob blob = myResultSet.getBlob(this.strImgName); InputStream inStream = blob.getBinaryStream(); try { long nLen = blob.length(); int nSize = (int) nLen; //System.out.println("img data size is :" + nSize); data = new byte[nSize]; inStream.read(data); inStream.close(); } catch (IOException e) { System.out.println("获取图片数据失败,原因:" + e.getMessage()); } data = ChangeImgSize(data, w, h); } System.out.println(myStringBuffer.toString()); myConnection.commit(); myConnection.close(); } catch (SQLException ex) { System.out.println(ex.getMessage()); } return data;}

oracle中Blob和Clob类型的区别

blob 存储大的二进制Clob 存储大的文本如果是纯文本,可以使用Clob所有文件,都可以使用blob

如何使用 Blob 存储

BLOB的存储和读取 创建测试表SQL> create table alice.user_stats( 2 id number primary key, 3 username varchar2(4000), 4 app blob) 5 partition by range(id) 6 (partition part01 values less than(50), 7 partition part02 values less than(maxvalue)) 8 /创建directorySQL> create directory bfile as "/oracle";Directory created.SQL> grant read,write on directory bfile to alice;Grant succeeded.存储blobSQL> declare sfile bfile:=bfilename("BFILE","dotnetfx.exe"); 2 length_file int :=dbms_lob.getlength(sfile); --得到文件长度 3 dfile blob; blob指针 4 begin 5 insert into alice.user_stats(id,app) values(10,empty_blob()); 6 select app into dfile from alice.user_stats; --记录blob指针 7 dbms_lob.fileopen(sfile,dbms_lob.file_readonly); --以只读方式打开bfile模式的文件 8 dbms_lob.loadfromfile(dfile,sfile,length_file); --开始加载指定长度的文件到指针位置 9 dbms_lob.fileclose(sfile); --关闭 10 commit; 11 end; 12 /读取blobSQL> declare l_file utl_file.file_type; 2 l_buffer raw(32767); 3 l_amount binary_integer :=32767; 4 l_pos int :=1; 5 l_blob blob; 6 l_blob_length int; 7 begin 8 select app into l_blob from alice.user_stats where id=10; 9 l_blob_length:=dbms_lob.getlength(l_blob); 10 l_file :=utl_file.fopen("BFILE","dot.exe","wb",32767); --创建文件 11 while l_pos<l_blob_length loop 12 dbms_lob.read(l_blob,l_amount,l_pos,l_buffer); --循环读取blob到buffer 13 14 utl_file.put_raw(l_file,l_buffer,true); --刷新缓存到文件 15 l_pos:=l_pos+l_amount; 16 end loop; 17 utl_file.fclose(l_file); --关闭文件 18 end; 19 /

怎样SELECT出BLOB列

1.使用jdk中的方法进行传输。在ResultSet 中有getBlob()方法,在PreparedStatement中有setBlob()方法,所以大多数人都会尝试setBlob(),getBlob() 进行读写,或者两个数据库之间BLOB的传输。这种方法实际上是行不通的,据网上的一些资料介绍,说sun官方的文档有些方法都是错误的。2.使用ResultSet.getBinaryStream 和PreparedStatement.setBinaryStream对BLOB进行读写或两个数据库间的传输。这种方法我自己尝试过,发现,如果BLOB中存储的是文本文件的话,就没问题,如果是二进制文件,传输就会有问题。根据自己的经验,以及查阅了Oracle的官方文档,都是使用如下处理方法:1.新建记录,插入BLOB数据 1.1首先新建记录的时候,使用oracle的函数插入一个空的BLOB,假设字段A是BLOB类型的: insert xxxtable(A,B,C) values(empty_blob(),"xxx","yyyy") 1.2后面再查询刚才插入的记录,然后更新BLOB,在查询前,注意设置Connection的一个属性: conn.setAutoCommit(false);如果缺少这一步,可能导致fetch out of sequence等异常. 1.3 查询刚才插入的记录,后面要加“ for update ”,如下: select A from xxxtable where xxx=999 for update ,如果缺少for update,可能出现row containing the LOB value is not locked的异常 1.4 从查询到的 BLOB字段中,获取blob并进行更新,代码如下: BLOB blob = (BLOB) rs.getBlob("A"); OutputStream os = blob.getBinaryOutputStream(); BufferedOutputStream output = new BufferedOutputStream(os); 后面再使用output.write方法将需要写入的内容写到output中就可以了。例如我们将一个文件写入这个字段中: BufferedInputStream input = new BufferedInputStream(new File("c://hpWave.log").toURL().openStream()); byte[] buff = new byte[2048]; //用做文件写入的缓冲 int bytesRead; while(-1 != (bytesRead = input.read(buff, 0, buff.length))) { output.write(buff, 0, bytesRead); System.out.println(bytesRead); } 上面的代码就是从input里2k地读取,然后写入到output中。 1.5上面执行完毕后,记得关闭output,input,以及关闭查询到的ResultSet 1.6最后执行conn.commit();将更新的内容提交,以及执行conn.setAutoCommit(true); 改回Connction的属性2.修改记录,方法与上面的方法类似, 2.1首先更新BLOB以外的其他字段 2.2 使用1.3中类似的方法获取记录 2.3 修改的过程中,注意以下:a 需要更新的记录中,BLOB有可能为NULL,这样在执行blob.getBinaryOutputStream()获取的值可能为null,那么就关闭刚才select的记录,再执行一次update xxxtable set A = empty_blob() where xxx, 这样就先写入了一个空的BLOB(不是null),然后再使用1.3,1.4中的方法执行更新记录.b 注意别忘了先执行setAutoCommit(false),以及"for update",以及后面的conn.commit();等。3.读取BLOB字段中的数据. 3.1 读取记录不需要setAutoCommit(),以及 select ....for update. 3.2 使用普通的select 方法查询出记录 3.3 从ResultSet中获取BLOB并读取,如下: BLOB b_to = (BLOB) rs.getBlob("A"); InputStream is = b_from.getBinaryStream(); BufferedInputStream input = new BufferedInputStream(is); byte[] buff = new byte[2048]; while(-1 != (bytesRead = input.read(buff, 0, buff.length))) { //在这里执行写入,如写入到文件的BufferedOutputStream里 System.out.println(bytesRead); } 通过循环取出blob中的数据,写到buff里,再将buff的内容写入到需要的地方4.两个数据库间blob字段的传输类似上面1和3的方法,一边获取BufferedOutputStream,另外一边获取BufferedInputStream,然后读出写入,需要注意的是写入所用的Connection要执行conn.setAutoCommit(false);以及获取记录时添加“ for update ”以及最后的commit();总结以上方法,其根本就是先创建空的BLOB,再获取其BufferedOutputStream进行写入,或获取BufferedInputStream进行读取1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859(1)对数据库clob型执行插入操作   *************************************************      java.sql.PreparedStatement pstmt = null;   ResultSet rs = null;   String query = "";      conn.setAutoCommit(false);    query = "insert into clobtest_table(id,picstr) values(?,empty_clob())";   java.sql.PreparedStatement pstmt = conn.prepareStatement(query);   pstmt.setString(1,"001");   pstmt.executeUpdate();   pstmt = null    query = "select picstr from clobtest_table where id = "001" for update";   pstmt = con.prepareStatement(query)   rs= pstmt.executeQuery();      oracle.sql.CLOB clobtt = null;   if(rs.next()){    clobtt = (oracle.sql.CLOB)rs.getClob(1);   }   Writer wr = clobtt.getCharacterOutputStream();   wr.write(strtmp);   wr.flush();   wr.close();   rs.close();   con.commit();            (2)通过sql/plus查询是否已经成功插入数据库   *************************************************      PL/SQL的包DBMS_LOB来处理LOB数据。察看刚才的插入是否成功。使用DBMS_LOB包的getlength这个procedure来检测是否已经将str存入到picstr字段中了。如:      SQL> select dbms_lob.getlength(picstr) from clobtest_table;         (3)对数据库clob型执行读取操作   *************************************************      读取相对插入就很简单了。基本步骤和一半的取数据库数据没有太大的差别。   String description = ""    query = "select picstr from clobtest_table where id = "001"";   pstmt = con.prepareStatement(query);   ResultSet result = pstmt.executeQuery();   if(result.next()){    oracle.jdbc.driver.OracleResultSet ors =    (oracle.jdbc.driver.OracleResultSet)result;    oracle.sql.CLOB clobtmp = (oracle.sql.CLOB) ors.getClob(1);       if(clobtmp==null || clobtmp.length()==0){    System.out.println("======CLOB对象为空 ");    description = "";    }else{    description=clobtmp.getSubString((long)1,(int)clobtmp.length());    System.out.println("======字符串形式 "+description);    }   }

java中blob类型是什么类型

java基本类型中没有blob类型,应该是自定义的一个类。

SQL中binary 和 varbinary的区别 blob

BLOB (binary large object),二进制大对象,是一个可以存储二进制文件的容器。在计算机中,BLOB常常是数据库中用来存储二进制文件的字段类型。BLOB是一个大文件,典型的BLOB是一张图片或一个声音文件,由于它们的尺寸,必须使用特殊的方式来处理(例如:上传、下载或者存放到一个数据库)。根据Eric Raymond的说法,处理BLOB的主要思想就是让文件处理器(如数据库管理器)不去理会文件是什么,而是关心如何去处理它。但也有专家强调,这种处理大数据对象的方法是把双刃剑,它有可能引发一些问题,如存储的二进制文件过大,会使数据库的性能下降。在数据库中存放体积较大的多媒体对象就是应用程序处理BLOB的典型例子。

如何向各种数据库中写入blob类型的记录

1.使用jdk中的方法进行传输。在ResultSet 中有getBlob()方法,在PreparedStatement中有setBlob()方法,所以大多数人都会尝试setBlob(),getBlob() 进行读写,或者两个数据库之间BLOB的传输。这种方法实际上是行不通的,据网上的一些资料介绍,说sun官方的文档有些方法都是错误的。2.使用ResultSet.getBinaryStream 和PreparedStatement.setBinaryStream对BLOB进行读写或两个数据库间的传输。这种方法我自己尝试过,发现,如果BLOB中存储的是文本文件的话,就没问题,如果是二进制文件,传输就会有问题。根据自己的经验,以及查阅了Oracle的官方文档,都是使用如下处理方法:1.新建记录,插入BLOB数据1.1首先新建记录的时候,使用oracle的函数插入一个空的BLOB,假设字段A是BLOB类型的:insert xxxtable(A,B,C) values(empty_blob(),"xxx","yyyy")1.2后面再查询刚才插入的记录,然后更新BLOB,在查询前,注意设置Connection的一个属性:conn.setAutoCommit(false);如果缺少这一步,可能导致fetch out of sequence等异常.1.3 查询刚才插入的记录,后面要加“ for update ”,如下:select A from xxxtable where xxx=999 for update ,如果缺少for update,可能出现row containing the LOB value is not locked的异常1.4 从查询到的 BLOB字段中,获取blob并进行更新,代码如下:BLOB blob = (BLOB) rs.getBlob("A");OutputStream os = blob.getBinaryOutputStream();BufferedOutputStream output = new BufferedOutputStream(os);后面再使用output.write方法将需要写入的内容写到output中就可以了。例如我们将一个文件写入这个字段中:BufferedInputStream input = new BufferedInputStream(new File("c://hpWave.log").toURL().openStream());byte[] buff = new byte[2048]; //用做文件写入的缓冲int bytesRead;while(-1 != (bytesRead = input.read(buff, 0, buff.length))) {output.write(buff, 0, bytesRead);System.out.println(bytesRead);}上面的代码就是从input里2k地读取,然后写入到output中。1.5上面执行完毕后,记得关闭output,input,以及关闭查询到的ResultSet1.6最后执行conn.commit();将更新的内容提交,以及执行conn.setAutoCommit(true); 改回Connction的属性

mysql数据类型中blob和binary的区别?

BLOB (binary large object),二进制大对象,是一个可以存储二进制文件的容器。在计算机中,BLOB常常是数据库中用来存储二进制文件的字段类型。BLOB是一个大文件,典型的BLOB是一张图片或一个声音文件,由于它们的尺寸,必须使用特殊的方式来处理(例如:上传、下载或者存放到一个数据库)。根据Eric Raymond的说法,处理BLOB的主要思想就是让文件处理器(如数据库管理器)不去理会文件是什么,而是关心如何去处理它。但也有专家强调,这种处理大数据对象的方法是把双刃剑,它有可能引发一些问题,如存储的二进制文件过大,会使数据库的性能下降。在数据库中存放体积较大的多媒体对象就是应用程序处理BLOB的典型例子。 BINARY不是函数,是类型转换运算符,它用来强制它后面的字符串为一个二进制字符串,可以理解为在字符串比较的时候区分大小写

如何使用 Blob 存储

BLOB的存储和读取 创建测试表SQL> create table alice.user_stats( 2 id number primary key, 3 username varchar2(4000), 4 app blob) 5 partition by range(id) 6 (partition part01 values less than(50), 7 partition part02 values less than(maxvalue)) 8 /创建directorySQL> create directory bfile as "/oracle";Directory created.SQL> grant read,write on directory bfile to alice;Grant succeeded.存储blobSQL> declare sfile bfile:=bfilename("BFILE","dotnetfx.exe"); 2 length_file int :=dbms_lob.getlength(sfile); --得到文件长度 3 dfile blob; blob指针 4 begin 5 insert into alice.user_stats(id,app) values(10,empty_blob()); 6 select app into dfile from alice.user_stats; --记录blob指针 7 dbms_lob.fileopen(sfile,dbms_lob.file_readonly); --以只读方式打开bfile模式的文件 8 dbms_lob.loadfromfile(dfile,sfile,length_file); --开始加载指定长度的文件到指针位置 9 dbms_lob.fileclose(sfile); --关闭 10 commit; 11 end; 12 /读取blobSQL> declare l_file utl_file.file_type; 2 l_buffer raw(32767); 3 l_amount binary_integer :=32767; 4 l_pos int :=1; 5 l_blob blob; 6 l_blob_length int; 7 begin 8 select app into l_blob from alice.user_stats where id=10; 9 l_blob_length:=dbms_lob.getlength(l_blob); 10 l_file :=utl_file.fopen("BFILE","dot.exe","wb",32767); --创建文件 11 while l_pos<l_blob_length loop 12 dbms_lob.read(l_blob,l_amount,l_pos,l_buffer); --循环读取blob到buffer 13 14 utl_file.put_raw(l_file,l_buffer,true); --刷新缓存到文件 15 l_pos:=l_pos+l_amount; 16 end loop; 17 utl_file.fclose(l_file); --关闭文件 18 end; 19 /

Oracle中Blob和Clob的作用?

blob:二进制lob,为二进制数据,最长可达4GB,存贮在数据库中。 clob:字符lob,字符数据,最长可以达到4GB,存贮在数据库中。

怎样查看blob类型的数据

1、BLOB为二进制流文件,可导出为OS文件,用二进制文本编辑器打开,或用相关软件打开。 2、在PL/SQL Develop里,你可以直接把他们存为txt文件。

oracle中blob,clob,nclob主要区别是什么?

一、指代不同1、blob:是指图像中的一块连通区域,Blob分析就是对前景/背景分离后的二值图像。2、clob:是内置类型,将字符大对象 (Character Large Object) 存储为数据库表某一行中的一个列值。3、nclob:长度可变的字符大对象。二、特点不同1、blob:对运动目标在图像平面上的轨迹进行估计的问题。2、clob:CLOB 对象包含一个指向 SQL CLOB 数据的逻辑指针而不是数据本身。Clob 对象在被创建的事务处理期间有效。3、nclob:大小可变的CLOB 对象,指向 SQL CLOB 数据的逻辑指针。三、数据保存方式不同1、blob:就是使用二进制保存数据。2、clob:CLOB使用CHAR来保存数据。3、nclob:使用NCHAR来保存数据。参考资料来源:百度百科-CLOB参考资料来源:百度百科-blo

java 关于blob类型问题

用byte类型

如何把 上传的文件 转成二进制存入oracle中的BLOB字段上,恳请高手们指导一下

用hex函数么

如何提高blob查询效率

正常情况下,如果blob的数据量超过100kB,那么最好使用分开单独的文件来存储blob数据性能会好一点。如果非要讲Blob数据存储在一个数据库文件中,那么增加Page Size可以在一般情况下提升性能。具体还是与硬件、文件系统、操作系统有关系。blob如果是单条读取,效率不会差到那里去,如果一个segment超过200g,在9206上倒是有点问题的,但可以对可能超过200g的含有blob类型的表进行hash分区,注意含有blob的表一般都是单条通过主键读取的,如果要分页等,肯定会影响到查询效率的,可能的做法就是把blob字段分离到一个单独的表,与主表一对一,然后再对blob做hash分区...

怎样显示blob字段当中的二进制内容

navicat里面有个显示原始数据

如何将byte类型转换blob类型

import java.io.File;import java.io.FileInputStream;import java.sql.Connection;import java.sql.DriverManager;import java.sql.PreparedStatement;public class Main { static String url = "jdbc:oracle:thin:@localhost:1521:javaDemo"; static String username = "username"; static String password = "welcome"; public static void main(String[] args) throws Exception { Class.forName("oracle.jdbc.driver.OracleDriver"); Connection conn = DriverManager.getConnection(url, username, password); conn.setAutoCommit(false); String sql = "INSERT INTO pictures (name, description, image) VALUES (?, ?, ?)"; PreparedStatement stmt = conn.prepareStatement(sql); stmt.setString(1, "java.gif"); stmt.setString(2, "Java Official Logo"); File image = new File("D:\a.gif"); FileInputStream fis = new FileInputStream(image); stmt.setBinaryStream(3, fis, (int) image.length()); stmt.execute(); conn.commit(); fis.close(); conn.close(); }}

如何给oracle导入blob和clob字段

  例:假设给oracle数据库导入blob类型的图片,图片放在目录G:images下。 1.先创建一个目录directory,命名为IMAGES; CREATE OR REPLACE DIRE,TORY IMAGES AS "G: est";或者直接在PlSql Directories目录下新建目录; 2.创建一个存储过程,批量导入blob create or replace procedure img_insert asbeginDECLARE f_lob bfile;--文件类型b_lobblob; --用来存储图片的名称filenamevarchar2(400);begin --循环的初始值for i in 1 .. 100 loop --找出每一列的文件名,因为文件名和图片名称是一样的 select t.flnm into filename from ZS_GC_SNIMDT t where t.id =i; --查找到之后,执行update操作,插入空的blob (注意IMAGES一定要大写) update ZS_GC_SNIMDT set brfl = empty_blob()whereid = i return brfl into b_lob; --获取指定目录下的文件 f_lob := bfilename("IMAGES", filename); -- 以只读的方式打开文件 dbms_lob.fileopen(f_lob, dbms_lob.file_readonly);--传递对象 dbms_lob.loadfromfile(b_lob, f_lob, dbms_lob.getlength(f_lob)); --关闭原始文件

后端如何返回blob对象

使用jdk中的方法进行传输。在ResultSet 中有getBlob()方法,在PreparedStatement中有setBlob()方法,所以大多数人都会尝试setBlob。js没有所谓byte,只有一个ArrayBuffer,而且ArrayBuffer又不能通过http传递。要么你是用ajax的response直接获取blob对象的,要么你从服务器返回的是base64编码的字符串,js自己再decode然后转化成ArrayBuffer得到blob对象。SLICE方法:Blob对象的slice方法使用三个参数,均为可选参数,如果三个参数均省略时,相当于把一个Blob对象中的原始二进制数据原样复制到一个新建的Blob对象(即slice方法的返回值)中。Blob对象的slice方法的第一个参数start的参数值为一个整数值,代表起始复制位置在Blob对象所代表的原始二进制数据中的位置,当start参数值为0时代表从该数据的起始位置(即第一个字节)开始复制数据;如果start参数值为负数值且Blob对象的size属性值+start参数值大于等于0。则起始复制位置为Blob对象的size属性值+start参数值;如果start参数值为负数值且Blob对象的size属性值+start参数值小于0,则起始复制位置为Blob对象所代表的原始二进制数据的起始位置;如果start参数值为正数值且大于等于Blob对象的size属性值。

已阻止blob是什么意思啊

已经阻止了blob类对象运行。BlobURL/ObjectURL是一种伪协议,允许Blob和File对象用作图像,下载二进制数据链接等的URL源。BlobURL只能由浏览器在内部生成。URL.createObjectURL()将创建一个特殊的Blob或File对象的引用,以后可以使用它来发布URL.revokeObjectURL()。这些URL只能在浏览器的单个实例中和同一个会话中(即页面/文档的生命周期)在本地使用。

数据库的blob字段,怎样通过json来传输

图片显示不要用json啊。哥哥。如果你是想无刷新的变换图片之需要用JS换掉<img的src属性即可你的blob字段数据建一个servlet输出就行了。对应JS调用:$("yourImg").src = "/getImg?"+Math.random();这样就可以实现替换显示了。注意那个Math.random(),必须要的,当然你也可以自己换个保证不会重复的字符串也行,否则你看不到图片刷新。

如何把ORACLE数据从CLOB类型转化为BLOB类型

先删除后建立。前提:我的report_data 字段类型是CLOBalterer table REC_DOWNLOAD_LIST drop column report_data ;alterer table REC_DOWNLOAD_LIST add report_data BLOB;

请教SQLite数据库读写BLOB字段

SQLite中如何用api操作blob类型的字段在实际的编程开发当中我们经常要处理一些大容量二进制数据的存储,如图片或者音乐等等。对于这些二进制数据(blob字段)我们不能像处理普通的文本那样 简单的插入或者查询,为此SQLite提供了一组函数来处理这种BLOB字段类型。下面的代码演示了如何使用这些API函数。首先我们要建立一个数据库:sqlite3_exec(db, "CREATE TABLE list (fliename varchar(128) UNIQUE, fzip blob);", 0, 0, &zErrMsg);//由于mmmm.rar是一个二进制文件,所以要在使用insert语句时先用?号代替sqlite3_prepare(db, "insert into list values ("mmmm.rar",?);", -1, &stat, 0);FILE *fp;long filesize = 0;char * ffile;fp = fopen("mmmm.rar", "rb");if(fp != NULL){//计算文件的大小fseek(fp, 0, SEEK_END);filesize = ftell(fp);fseek(fp, 0, SEEK_SET);//读取文件ffile = new char[filesize+1];size_t sz = fread(ffile, sizeof(char), filesize+1, fp);fclose(fp);}//将文件数据绑定到insert语句中,替换“?”部分sqlite3_bind_blob(stat, 1, ffile, filesize, NULL);

oracle中Blob和Clob类型的区别是什么?

BLOB是按二进制来存储的,而CLOB是可以直接存储文字的。1、BLOB和CLOB都是大字段类型2、BLOB是按二进制来存储的3、CLOB是可以直接存储文字的4、两个是可以互换的的,或者可以直接用LOB字段代替这两个。5、但是为了更好的管理ORACLE数据库,通常像图片、文件、音乐等信息就用BLOB字段来存储,先将文件转为二进制再存储进去。6、像文章或者是较长的文字,就用CLOB存储,这样对以后的查询更新存储等操作都提供很大的方便。7、CLOB全称为字符大型对象(Character Large Object)。8、它与LONG数据类型类似,只不过CLOB用于存储数据库中的大型单字节字符数据块,不支持宽度不等的字符集。9、可存储的最大大小为4G字节10、NCLOB 基于国家语言字符集的NCLOB数据类型用于存储数据库中的固定宽度单字节或多字节字符的大型数据块11、不支持宽度不等的字符集12、可存储的最大大小为4G字节13、BFILE 当大型二进制对象的大小大与4G字节时,BFILE数据类型用于将其存储在数据库外的操作系统文件中14、当其大小不足4G字节时,则将其存储在数据库内部的操作系统文件中,BFILE列存储文件定位程序,此定位程序指向服务器上的大型二进制文件

为啥oracle的blob中存的是16进制而不是二进制

更新数据的时候,写insert语句的时候,不更新blob字段,blob字段对应的数据用 empty_blob() 代替就行。(注意:在执行上面那个 sql 之前,一定要把 connection 设置成不自动提交: conn.setAutoCommit(false); )最后单独出来blob字段://把 blob 字段取出来String sql = "select ANNEX from market_info_collect_t where info_id=""+ infoId + "" for update ";Statement stt=null;stt = conn.createStatement();rs = stt.executeQuery(sql);if (rs.next()) {blob = (oracle.sql.BLOB) rs.getBlob("ANNEX");outStream = blob.getBinaryOutputStream();instream = myFile.getContentStream();byte[] data = new byte[instream.available()];instream.read(data);outStream.write(data, 0, data.length);}instream.close();outStream.flush();outStream.close();上面这段是我以前写过的代码中的一部分,你看一下,希望对你能有帮助。。。

请教SQLite数据库读写BLOB字段

// 连接字符串 data source=d: est.db3;password=1234 SQLiteConnectionStringBuilder connStr = new SQLiteConnectionStringBuilder(); connStr.DataSource = @"d: est.db3"; connStr.Password = "1234"; conn = new SQLiteConnection(connStr.ToString()); conn.Open(); // 插入数据 string SQL = "INSERT INTO test(k) VALUES(:k)"; SQLiteCommand cmd = conn.CreateCommand(); cmd.CommandText = SQL; // 取图标,准备插入到数据库BLOB字段 FileStream picStream = File.OpenRead(@"d:1.bmp"); byte[] bArray = new byte[picStream.Length]; picStream.Read(bArray, 0, bArray.Length); picStream.Close(); cmd.Parameters.Add("k", DbType.Binary).Value = bArray; // BLOB cmd.ExecuteNonQuery(); //取出数据 cmd.CommandText = "SELECT k FROM test"; System.Data.SQLite.SQLiteDataReader reader = cmd.ExecuteReader(); while (reader.Read()) { MemoryStream streamImage = new MemoryStream(reader["k"] as byte[]); pictureBox1.Image = Image.FromStream(streamImage); streamImage.Close(); // 关闭流 } reader.close(); conn.close();

Mysql中是blob类型,实体类定义为string,怎么取值

这个是mysql下存取blob字段的一个很简单的类,跟据自己的需要改改就行了 /** * Title: BlobPros.java * Project: test * Description: 把图片存入mysql中的blob字段,并取出 * Call Module: mtools数据库中的tmp表 * File: C:downloadsluozsh

如何读取Oracle的BLOB字段里的文件

不知道你用的编程语言是什么 若是java 的话 直接从数据库里面拿(如果有hibernate支持)那就domain.getBlob()。然后用流去将blob转换成string 具体怎么做 百度。存值的时候是将表单的string转换成blob再塞进数据库。newSerialBlob(String对象的.getBytes())

如何导入 db2 blob

可以用BLOB(string)函数将字符串转化为blob再插入,如下: create table test(c1 blob(200));insert into test values(blob("Hello, world"));其他的方法可能需要用别的语言来写了,这种是在数据库下操作db2 import from c:aaa.txt of del modify by coldel| insert into table1其中c:aaa.txt为原始文本文件全名,可以带有完整路径of del表示文件的类型为定界ASCII类型,即每个列有分隔符的文本文件coldel参数用于指定每个列的分隔符,后面的竖线“|”与coldel之间不要有空格

字符串如何存到数据库blob字段

将字符串转换成byte数组String.getBytes(),然后放进一个ByteArrayInputStream输入流中即可存入BLOB字段中PreparedStatement.setBlob(int parameterIndex, InputStream inputStream)

上Mysql后,怎么存入和取出blob数据

读取 BLOB数据: 首先做查询,拿到查询结果ResultSet rs = XXXX (和普通数据查询一样) 然后:Blob blob = rs.getBlob("字段名"); 拿到你的Blob ,

java中如何把 varbinary 转换成blob

Blob...好像不是常用类型,是自定义的吧。好吧,最简单的方法。假设已知File类型的file1。List testList=new ArrayList();testList.add(file1);Blob blob=(Blob)testList.get(0);如果可以强转的话,以上代码均有效。换句话说只要Blob是File类型的子类以上代码就有效,否则报错,无法强转。

使用java语言操作,如何来实现MySQL中Blob字段的存取

/** * Title: BlobPros.java * Project: test * Description: 把图片存入mysql中的blob字段,并取出 * Call Module: mtools数据库中的tmp表 * File: C:downloadsluozsh.jpg * Copyright: Copyright (c) 2003-2003 * Company: uniware * Create Date: 2002.12.5 * @Author: ChenQH * @version 1.0 版本* * * Revision history * Name Date Description * ---- ---- ----------- * Chenqh 2003.12.5 对图片进行存取 * * note: 要把数据库中的Blob字段设为longblob * */ //package com.uniware; import java.io.*; import java.util.*; import java.sql.*; public class BlobPros { private static final String URL = "jdbc:mysql://10.144.123.63:3306/mtools?user=wind&password=123&useUnicode=true"; private Connection conn = null; private PreparedStatement pstmt = null; private ResultSet rs = null; private File file = null; public BlobPros() { } /** * 向数据库中插入一个新的BLOB对象(图片) * @param infile 要输入的数据文件 * @throws java.lang.Exception */ public void blobInsert(String infile) throws Exception { FileInputStream fis = null; try { Class.forName("org.gjt.mm.mysql.Driver").newInstance(); conn = DriverManager.getConnection(URL); file = new File(infile); fis = new FileInputStream(file); //InputStream fis = new FileInputStream(infile); pstmt = conn.prepareStatement("insert into tmp(descs,pic) values(?,?)"); pstmt.setString(1,file.getName()); //把传过来的第一个参数设为文件名 //pstmt.setBinaryStream(2,fis,(int)file.length()); //这种方法原理上会丢数据,因为file.length()返回的是long型 pstmt.setBinaryStream(2,fis,fis.available()); //第二个参数为文件的内容 pstmt.executeUpdate(); } catch(Exception ex) { System.out.println("[blobInsert error : ]" + ex.toString()); } finally { //关闭所打开的对像// pstmt.close(); fis.close(); conn.close(); } } /** * 从数据库中读出BLOB对象 * @param outfile 输出的数据文件 * @param picID 要取的图片在数据库中的ID * @throws java.lang.Exception */ public void blobRead(String outfile,int picID) throws Exception { FileOutputStream fos = null; InputStream is = null; byte[] Buffer = new byte[4096]; try { Class.forName("org.gjt.mm.mysql.Driver").newInstance(); conn = DriverManager.getConnection(URL); pstmt = conn.prepareStatement("select pic from tmp where id=?"); pstmt.setInt(1,picID); //传入要取的图片的ID rs = pstmt.executeQuery(); rs.next(); file = new File(outfile); if(!file.exists()) { file.createNewFile(); //如果文件不存在,则创建 } fos = new FileOutputStream(file); is = rs.getBinaryStream("pic"); int size = 0; /* while(size != -1) { size = is.read(Buffer); //从数据库中一段一段的读出数据 //System.out.println(size); if(size != -1) //-1表示读到了文件末 fos.write(Buffer,0,size); } */ while((size = is.read(Buffer)) != -1) { //System.out.println(size); fos.write(Buffer,0,size); } } catch(Exception e) { System.out.println("[OutPutFile error : ]" + e.getMessage()); } finally { //关闭用到的资源 fos.close(); rs.close(); pstmt.close(); conn.close(); } } public static void main(String[] args) { try { BlobPros blob = new BlobPros(); //blob.blobInsert("C:Downloadsluozsh1.jpg"); blob.blobRead("c:/downloads/1.jpg",47); } catch(Exception e) { System.out.println("[Main func error: ]" + e.getMessage()); } } }

oracle中blob,clob,nclob,Bfile主要区别是什么? .

他们的最大存储大小都为4gbBFILE二进制文件,存储在数据库外的操作系统文件,只读的。把此文件当二进制处理。(类似于long类型)BLOB二进制大对象。存储在数据库里的大对象,一般是图像声音等文件。(类似于row和longrow)CLOB字符型大对象。一般存储大数量文本信息。存储单字节,固定宽度的数据。NCLOB字节字符大对象。存储单字节大块,多字节固定宽度Bfile和clob,nclob,blob是不同的。Bfile是外部的lob类型,其他三个是oracle内部的lob类型,它们至少有三点主要不同的地方:1.bfile的值是存在操作系统的文件中,而不是数据库中。2.bfile不参与数据库事务操作。也就是改变bifle不能commit或rollback。但是改变bfile的locator可以commit或rollback。3.bfile在plsql和oracle中是只读的,不允许写。

如何查看BLOB类型的数据

1、BLOB为二进制流文件,可导出为OS文件,用二进制文本编辑器打开,或用相关软件打开。 2、在PL/SQL Develop里,你可以直接把他们存为txt文件。
 1 2  下一页  尾页