[转载]数据库存储图片(MSSQL/ORACLE/ACCESS
下面我来汇总一下如何将图片保存到SqlServer、Oracle、Access数据库中。
首先,我们要明白图片是以二进制的形式保存在数据库中的,那么把图片保存到数据库中的步骤大体上有这几步
1.将图片转换为二进制数组(byte[]);
2.把转换后的二进制数组(byte[])作为参数传递给要执行的Command;
3.执行Command;
首先,如何把图片转换成byte[],如果你使用的是ASP.Net2.0,那么你可以使用FileUpLoad控件来实现
byte[] fileData = this.FileUpload1.FileBytes;
如果你用的是ASP.Net1.1或者你在创建WinForm那么你可以使用下面的方法来把图片转换为byte[]
public byte[] getBytes(string filePath)
{
System.IO.FileStream fs = new System.IO.FileStream(filePath, System.IO.FileMode.Open);
byte[] imgData = new byte[fs.Length];
fs.Read(imgData, 0, (int)fs.Length);
return imgData;
}接下来我们要做的就是要把已经得到的byte[]作为参数传递给Command对象
1.SqlServer数据库。SqlServer有Image字段类型,最大可以存储2G的数据。 byte[] fileData = this.FileUpload1.FileBytes;
string sql = "insert into t_img(img) values (@img)";
string strconn = System.Configuration.ConfigurationManager.ConnectionStrings["fengdongDB"].ToString();
SqlConnection sqlConn = new SqlConnection(strconn);
SqlCommand sqlComm = new SqlCommand(sql, sqlConn);
sqlComm.Parameters.Add("@img", SqlDbType.Image);//添加参数
sqlComm.Parameters["@img"].Value = fileData;//为参数赋值
sqlConn.Open();
sqlComm.ExecuteNonQuery();
sqlConn.Close();
2.Oracle数据库。在Oracle数据库中我们可以使用BLOB字段类型,最大可以存储4G的数据。
byte[] fileData = this.FileUpload1.FileBytes;
string sql = "insert into t_img(imgid,IMGDATA) values(100,:IMGDATA)";
string strconn = System.Configuration.ConfigurationManager.ConnectionStrings["ConnectionStringForOracle"].ToString();
OracleConnection oraConn = new OracleConnection(strconn);
OracleCommand oraComm = new OracleCommand(sql, oraConn);
oraComm.Parameters.Add(":IMGDATA", OracleType.Blob);//添加参数
oraComm.Parameters[":IMGDATA"].Value = fileData;//为参数赋值
oraConn.Open();
oraComm.ExecuteNonQuery();
oraConn.Close();
注意:这里我需要说明一下,用Oracle的专用连接传递参数的时候你要小心一点,看看上面的SQL语句你就会知道,要在参数名前加个“:”否则就会出现下面的错误“OracleException: orA-01036: 非法的变量名/编号”。这里需要我们注意一下。另外还有一个地方,当我引用System.Data.OracleClient命名空间的时候默认是没有的,必须添加对System.Data.OracleClient的引用,我记得在VS2003下如果安装了OracleClient是不用添加引用就可以引入的。这里也要留意一下。
3.Access数据库。在Access中我们使用OLE对象字段类型,最大支持1G的数据。
byte[] fileData = this.FileUpload1.FileBytes;
string sql = "insert into t_img(IMGDATA) values(?)";
string strconn = System.Configuration.ConfigurationManager.ConnectionStrings["ConnectionStringForAccess"].ToString();
OleDbConnection oleConn = new OleDbConnection(strconn);
OleDbCommand oleComm = new OleDbCommand(sql, oleConn);
oleComm.Parameters.Add("imgdata", OleDbType.Binary);
oleComm.Parameters["imgdata"].Value = fileData;
oleConn.Open();
oleComm.ExecuteNonQuery();
oleConn.Close();
好了,到这里我们就把图片保存到数据库中全部说完了,接下来要说的是如何从数据库中把图片读取出来。实际上这是与插入操做相反的一个过程:先报把从数据库中获取的图片数据转换为数组,然后把数组转换为图片。不同数据之间没有特别大的差异,我这里只列出从Oracle数据库中把数据读取出来以供参考。
private byte[] getImageDataFromOracle()
{
string sql = "select IMGDATA from t_img where imgID=100";
string strconn = System.Configuration.ConfigurationManager.ConnectionStrings["ConnectionStringForOracle"].ToString();
OracleConnection oraConn = new OracleConnection(strconn);
OracleCommand oraComm = new OracleCommand(sql, oraConn);
oraConn.Open();
byte[] fileData = (byte[])oraComm.ExecuteScalar();
oraConn.Close();
return fileData;
}
我们获取到了数据,那么把byte[]转换为图片的过程都是一样的。
private System.Drawing.Image convertByteToImg(byte[] imgData)
{
System.IO.MemoryStream ms = new System.IO.MemoryStream(imgData);
System.Drawing.Image img = System.Drawing.Image.FromStream(ms);
return img;
} 如果你在开发WinForm应用的话你可以直接把返回结果保存或者显示到PictureBox里,如果你在使用ASP.Net那么你可以在单独的一个页面把图片输出,在另外一个页面把Image控件的ImageUrl属性指向图片输出页面。
比如输出页面getImg.aspx的代码 protected void Page_Load(object sender, EventArgs e)
{
string sql = "select IMGDATA from t_img where imgID=100";
string strconn = System.Configuration.ConfigurationManager.ConnectionStrings["ConnectionStringForOracle"].ToString();
OracleConnection oraConn = new OracleConnection(strconn);
OracleCommand oraComm = new OracleCommand(sql, oraConn);
oraConn.Open();
byte[] fileData = (byte[])oraComm.ExecuteScalar();
oraConn.Close();
System.IO.MemoryStream ms = new System.IO.MemoryStream(fileData);
System.Drawing.Image img = System.Drawing.Image.FromStream(ms);
img.Save(Response.OutputStream, System.Drawing.Imaging.ImageFormat.Jpeg);
}
注意:MsSQL和Access测试通过。ORACLE缺乏应用平台未经过测试。
学习分享!
http://www.cnblogs.com/px7034/archive/2011/01/10/1931774.html
[转载]数据库存储图片(MSSQL/ORACLE/ACCESS的更多相关文章
- 数据库存储图片相对路径使用问题,配置tomcat的server.xml文件
我想从前端读取路径的时候,必须输入相对路径+根路径,但是我数据库中存的相对路径 接下来讲解如何通过相对路径获得照片 首先我们需要在tomcat的server.xml文件中更改属性,eslipse可以直 ...
- MySQL&SQL server&Oracle&Access&PostgreSQL数据库sql注入详解
判断数据库的类型 当我们通过一些测试,发现存在SQL注入之后,首先要做的就是判断数据库的类型. 常用的数据库有MySQL.Access.SQLServer.Oracle.PostgreSQL.虽然绝大 ...
- 数据库存储txt文本和jpg图片
环境:MySql+SQLyog+j2se+jdbc 存储文本用longtext类型 存储图片用blob类型 1.首先建表 create table t_t (id int(16) NOT NULL A ...
- ORACLE数据库存储结构简介(转)
首先,oracle数据库的存储结构可以分为逻辑存储结构和物理存储结构,对于这两种存储结构,oracle是分别进行管理的. 逻辑存储结构:oracle内部的组织和管理数据的方式. 物理存储结构:o ...
- Oracle中存储图片的类型为BLOB类型,Java中如何将其读取并转为字符串?
一,读取图片转为String类型: 需要使用Sun公司提供的Base64工具 String str = ((Map) list1.get(0)).get("EINVOICEFILE" ...
- Oracle 下基于 DBMS_RESOURCE_MANAGER 包估算数据库存储 IO 性能
:first-child { margin-top: 0; } blockquote > :last-child { margin-bottom: 0; } img { border: 0; m ...
- java+mysql实现保存图片到数据库,以及读取数据库存储的图片
一:建表 二:获取数据库连接 1:导入mysql的驱动jar包,mysql-connector-java-5.1.8-bin.jar 2:写代码连接数据库,如下: /** * */ package c ...
- Oracle数据库插入图片和读取图片
package com.basicSql.scroll_page; import java.io.File; import java.io.FileInputStream; import java.i ...
- Atitit.数据库存储引擎的原理与attilax 总结
Atitit.数据库存储引擎的原理与attilax 总结 1. 存储引擎是什么1 2. 其它数据库系统(包括大多数商业选择)仅支持一种类型的数据存储2 3. 表的存储有三个文件:结构+数据+索引2 4 ...
随机推荐
- 【Unity3D】Unity3D之 Resources.Load 动态加载资源
[Unity3D]Unity3D之 Resources.Load 动态加载资源 1.Resources.Load:使用这种方式加载资源,首先需要下Asset目录下创建一个名为Resources的文件夹 ...
- sql server 修改列类型
如下代码中为修改bcp数据库中表B_TaskFileMonitor中的列FileSizeOriginal的类型为bigint use bcp; ); --判断是否存在这一列 IF COL_LENGTH ...
- VSS汉化后出现问题及解决方法
1.vss汉化后在获取项目时不递归获取? 解决方法:工具-->选项-->常规-->勾选 项目递归时有效(R) 2.查看差异,可视化窗口未出现分隔? 解决方法:差异选项-->格式 ...
- .NET清除Session 的几个方法[clear/removeAll/remove/Abandon]
1.clear() 清空所有session对象的值,但保留会话 2.removeAll() 调用clear()方法 3.remove("SessionName") 删除某个 ...
- ant条件逻辑
<condition property="sdk-folder" value="E:\android\android-sdk\adt-bundle-windows- ...
- Git的学习总结和使用时遇到的问题。
git 是一款非常强大的版本控制工具,现在市场占有率应该是一家独大了,以前用svn的童鞋估计都转投git阵营了吧 加上很多公司也用git管理自己的项目,所以 ...
- DIV_ROUND_UP(x,y)实现x/y向上取整
#define DIV_ROUND_UP(x,y) (((x) + ((y) - 1)) / (y)) 1.问题 x.y都是整数,且x > 1, y > 1,求 x / y的向上取整,即: ...
- jQuery EasyUI 数据网格 - 启用行内编辑(转自http://www.runoob.com/jeasyui/jeasyui-datagrid-datagrid12.html)
可编辑的功能是最近添加到数据网格(datagrid)的.它可以使用户添加一个新行到数据网格(datagrid).用户也可以更新一个或多个行.本教程向您展示如何创建一个数据网格(datagrid)和内联 ...
- 封装底层Ajax
创建Ajax简易步骤:创建Ajax对象:var xhr=new XMLHttpRequest();链接服务器:xhr.open('get','a.php',true);发送请求或数据:xhr.send ...
- Mysql 正则获取字段的交集【转】
问题描述 比如table1中有两条记录 name no a 2,9 b 8,10 然后有一串字符串,是0,1,2,3,4 然后通过一条sql,找出no为2,9的记录来``` 因为字符串中有 ...