Sqlserver数据库存储的图片格式(二进制数据)怎么显示到页面?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Sqlserver数据库存储的图片格式(二进制数据)怎么显示到页面?相关的知识,希望对你有一定的参考价值。

成功解决问题提高悬赏

1.将图片以二进制存入数据库
//保存图片到数据库
protected void Button1_Click(object sender, EventArgs e)

//图片路径
string strPath = "~/photo/03.JPG";
string strPhotoPath = Server.MapPath(strPath);
//读取图片
FileStream fs = new System.IO.FileStream(strPhotoPath, FileMode.Open, FileAccess.Read);
BinaryReader br = new BinaryReader(fs);
byte[] photo = br.ReadBytes((int)fs.Length);
br.Close();
fs.Close();
//存入
SqlConnection myConn = new SqlConnection("Data Source=127.0.0.1;Initial Catalog=TestDB;User ID=sa;Password=sa");
string strComm = " INSERT INTO personPhoto(personName, personPhotoPath, personPhoto) ";
strComm += " VALUES('wangwu', '" + strPath + "', @photoBinary )";
SqlCommand myComm = new SqlCommand(strComm, myConn);
myComm.Parameters.Add("@photoBinary", SqlDbType.Binary,photo.Length);
myComm.Parameters["@photoBinary"].Value = photo;
myConn.Open();
myComm.ExecuteNonQuery();
myConn.Close();

2.读取二进制图片在页面显示
//读取图片
SqlConnection myConn = new SqlConnection("Data Source=127.0.0.1;Initial Catalog=TestDB;User ID=sa;Password=sa");
string strComm = " SELECT personPhoto FROM personPhoto WHERE personName='wangwu' ";
SqlCommand myComm = new SqlCommand(strComm, myConn);
myConn.Open();
SqlDataReader dr = myComm.ExecuteReader();
while (dr.Read())

byte[] photo = (byte[])dr["personPhoto"];
this.Response.BinaryWrite(photo);

dr.Close();
myConn.Close();

SqlConnection myConn = new SqlConnection("Data Source=127.0.0.1;Initial Catalog=TestDB;User ID=sa;Password=sa");
SqlDataAdapter myda = new SqlDataAdapter(" SELECT personPhoto FROM personPhoto WHERE personName='11' ", myConn);
DataSet myds = new DataSet();
myConn.Open();
myda.Fill(myds);
myConn.Close();
byte[] photo = (byte[])myds.Tables[0].Rows[0]["personPhoto"];
this.Response.BinaryWrite(photo);
3.设置Image控件显示从数据库中读出的二进制图片
---------------------------------------------
SqlConnection myConn = new SqlConnection("Data Source=192.168.0.1;Initial Catalog=TestDB;User ID=sa;Password=sa");
SqlDataAdapter myda = new SqlDataAdapter(" SELECT personPhoto FROM personPhoto WHERE personName='11' ", myConn);
DataSet myds = new DataSet();
myConn.Open();
myda.Fill(myds);
myConn.Close();
byte[] photo = (byte[])myds.Tables[0].Rows[0]["personPhoto"];
//图片路径
string strPath = "~/photo/wangwu.JPG";
string strPhotoPath = Server.MapPath(strPath);
//保存图片文件
BinaryWriter bw = new BinaryWriter(File.Open(strPhotoPath,FileMode.OpenOrCreate));
bw.Write(photo);
bw.Close();
3.显示图片
this.Image1.ImageUrl = strPath;
4.GridView中ImageField以URL方式显示图片
--------------------------
<asp:GridView ID="GridView1" runat="server" AutoGenerateColumns="False">
<Columns>
<asp:BoundField DataField="personName" HeaderText="姓名" />
<asp:ImageField DataImageUrlField="personPhotoPath"
HeaderText="图片">
</asp:ImageField>
</Columns>
</asp:GridView>
5.GridView显示读出的二进制图片
//样板列
<asp:GridView ID="GridView1" runat="server" AutoGenerateColumns="False" OnRowDataBound="GridView1_RowDataBound">
<Columns>
<asp:BoundField DataField="personName" HeaderText="姓名" />
<asp:ImageField DataImageUrlField="personPhotoPath"
HeaderText="图片">
</asp:ImageField>
<asp:TemplateField HeaderText="图片">
<ItemTemplate>
<asp:Image ID="Image1" runat="server" />
</ItemTemplate>
</asp:TemplateField>
</Columns>
</asp:GridView>
protected void GridView1_RowDataBound(object sender, GridViewRowEventArgs e)

if (e.Row.RowIndex < 0)
return;
// System.ComponentModel.Container
string strPersonName = (string)DataBinder.Eval(e.Row.DataItem, "personName");
Image tmp_Image = (Image)e.Row.Cells[2].FindControl("Image1");
if (!System.Convert.IsDBNull(DataBinder.Eval(e.Row.DataItem, "personPhoto")))

//
byte[] photo = (byte[])DataBinder.Eval(e.Row.DataItem, "personPhoto");
//图片路径
string strPath = "~/photo/" + strPersonName.Trim() + ".JPG";
string strPhotoPath = Server.MapPath(strPath);
//保存图片文件
BinaryWriter bw = new BinaryWriter(File.Open(strPhotoPath, FileMode.OpenOrCreate));
bw.Write(photo);
bw.Close();
//显示图片
tmp_Image.ImageUrl = strPath;

参考技术A //读取byte[]没问题吧
byte[] bytes = 数据库中的img数据;
MemoryStream ms = new MemoryStream(bytes);  
Image img = Image.FromStream(ms,true);  
//显示(1.如果你是webForm那么麻烦一些。需要你读取这个img,然后保存在一个地方。通过url的形式显示;2.如果你是winForm,用pictureBox控件可以直接显示pictureBox.Image=img)

追问

这一步报错,参数无效


追答

从报错来看,是不是分号是中文的?

参数无效,你可以断点看看,你有没有读到数据

追问

数据读进去了,不存在符号方面的问题,是不是用这种方法不行哦!

是不是二进制数据太长了?我截图你看下,这是在数据库里面复制出来的

追答using(MemoryStream ms = new MemoryStream(bytes))

    Image img = Image.FromStream(ms);


//这样试一下,看看Image对象能不能得到。

追问

一样的提示;用这种方法也许不行,是不是得画出来?

追答

你这个错误,是编译的时候就报错,还是运行的时候报错?

//改成这样
Image img = Image.FromStream(ms);

追问

报同样的错,运行时报错,加:二.九.二.九.七.七.九.零.九.九,

追答

已加

本回答被提问者和网友采纳
参考技术B DBimage控件就可以了追问

我说的是在.net,貌似没有这个控件

关于使用C#将图片用二进制方式存储到sql server数据库中

做出的winform窗体如图所示,可能还要再添加一个按钮。具体步骤:
输入图片名称,然后点击button1选择图片,再添加一个按钮“预览”使得图片可以显示在左边的pictureBox1中
确认后,最后点击“添加”按钮将图片信息存储到sql server数据库中。
图片表是这样建的:
create table S(foodID varchar(10) primary key,-图片编号foodname varchar(30), -图片名称pic image )

我的程序卡在这里了,求详解,求指教

我也遇到过类似的问题呢,谁让咱们是新手呢。不过有人给了我两个参考网站,然后摸索着就解决了问题。可以参考一下http://zhidao.baidu.com/question/1381619597368002820.html?quesup2&oldq=1。主要还是用filestream来实现图片的二进制上传,和用memorystream来实现图片的下载和预览。不过我的界面和你的不大一样。呵呵。cnblogs博客园里有N多类似的代码和说明。亲可以去看一下。另外晒一下我的界面。呵呵

追问

我觉得我连新手都称不上。看代码还要慢慢理解。。好艰难。。。。。

追答

我是毕业后N多年了,在三年前偶然接触到C#和SQL,才开始一点点的接触。一直没看书,直到最近才借了本《叩响C#之门》和《从零开始学SQL SERVER》,一边复制代码,一边用这两本书翻译编码原理,也学到不少。慢慢来吧。给你一个我之前找的上传图片的小程序。虽然有点问题,查是基本上都是对的,改改就能用了。

追问

我后来搜到一个直接点击一个button就打开对话框选择图片,然后显示在pictureBox中的小程序段,挺好玩的。多谢呀

追答

呵呵,我自己的程序也是那样的,点击插入后打开对话框,选择好图片后会居中缩放在参考图片1的PICTUREBOX中,再单击PICTUREBOX1,会打开子窗口进行全屏预览。点击速查并选择单据后,与单据关联的图片信息会显示在PICTRUEBOX1中。足足折腾了我一个星期,呵呵。共同成长吧

追问

你知不知道有什么控件可以作临时容器存放从DataGridView中选中的数据?

追答

不一定要用控件吧。我猜你的意思是将SQL中的数据绑定到DATAGRIDVIEW中,然后选择某一行的数据,将指定的数据显示在某个控件里。或者是类似的意思。
你可以说的更清楚一些,才能让大家给你提方案嘛。呵呵。举个例子,我要得到某一列的值,我可以直接从数据库中读取一列的值,然后comboBox.items.add(read[].tostring()),也可以选择某一个值,给textBox,让textBox.text=this.datagridview.currentrows.cells[0].value.tostring();也可以用变量。也可以用dataset,反正N多种方式啦,关键还是要看你怎么用。我自学C#三年来,唯一的感触就是条条大路通罗马,还是先看目的是什么了。不好意思的是我从来不看书,只知道怎么弄,不知道术语和名词,呵呵,还得靠其它专业的人讲解啦。

参考技术A 讲图片的相对路径放到数据库里,把图片放到项目里。调用数据库里的相对路径就可以看的到 参考技术B public void Upload(string path, System.Web.UI.WebControls.FileUpload fileupload)

bool fileOK = false;
if (FileUpload1.HasFile)

string fileException = System.IO.Path.GetExtension(FileUpload1.FileName).ToLower();
//获取指定路劲字符串的后缀名,并转化为小写
string[] allowExcption = ".jpg", ".jpeg", ".bmp",".gif" ;
//定义允许的后缀名
for (int i = 0; i < allowExcption.Length; i++)

if (fileException == allowExcption[i])

fileOK = true;



if (fileOK)

//判断文件是否存在,若不在则创建路径
if (System.IO.Directory.Exists(path))

//MessageBox.Show("该目录已经存在","信息提示");

else

System.IO.Directory.CreateDirectory(path);//创建文件路径

fileupload.SaveAs(path + "\\" + fileupload.FileName);//上传文件

else

Response.Write("<Script>alert('不支持此格式文件上传')</Script>");
return;



protected void Button1_Click(object sender, EventArgs e)

string serverpath = Server.MapPath("~/ImageFile");
string imapath = "~/ImageFile/" + FileUpload1.FileName;
Upload(serverpath, this.FileUpload1);
Image1.ImageUrl = imapath;
serverpath = Server.MapPath("~/ImageFile");
imapath = "~/ImageFile/" + FileUpload1.FileName;
Image1.ImageUrl = imapath;
Upload(serverpath, this.FileUpload1);

这部分是调用的(预览的功能),你要上传的话改成数据库操作就可以了,存放上传的路劲,文件的话她会自动生成文件夹放在里面的。你修改下应该就可以了追问

您好,我在使用你的代码段的时候有这样的问题:
public void Upload(string path, System.Web.UI.WebControls.FileUpload fileupload)
会出现“system.web中不存在类型或命名空间UI”,请问应该添加什么样的命名空间?求指教

追答

我这个是网站的命名方式,你可以新建一个空网站,拉一个FileUpload控件,一个image控件
一个button控件就能实现的,这个和你的应用程序差不多的,你改一下语法就可以了。

追问

我建的winform。。。。。。看来要换。。。

以上是关于Sqlserver数据库存储的图片格式(二进制数据)怎么显示到页面?的主要内容,如果未能解决你的问题,请参考以下文章

关于使用C#将图片用二进制方式存储到sql server数据库中

sqlserver数据库中img类型的二进制数据怎么转换成图片,再怎么把图片转换成这个类型的二进制数据

记一次从Sql Server中图片二进制流还原回图片的开发过程

UniqueIdentifier 数据类型 和 GUID 生成函数

UniqueIdentifier 数据类型 和 GUID 生成函数

php解析word,获得文档中的图片