如何将图片保存到sqlserver、oracle、access数据库中。 首先,我们要明白图片是以二进制的形式保存在数据库中的,那么把图片保存到数据库中的步骤大体上有这几步 1.将图片转换为二进制数组(byte[]); 2.把转换后的二进制数组(byte[])作为参数传
如何将图片保存到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);
}