本文总结如何在.Net WinForm和.Net WebForm(asp.net)中将图片存入SQL Server中并读取显示的方法 。
1.使用asp.net将图片上传并存入SQL Server中,然后从SQL Server中读取并显示出来:
1)上传并存入SQL Server
数据库结构
create table test
{
id identity(1,1),
FImage image
}
相关的存储过程
Create proc UpdateImage
(
@UpdateImage Image
)
As
Insert Into test(FImage) values(@UpdateImage)
GO
在UpPhoto.aspx文件中添加如下:
<input id="UpPhoto" name="UpPhoto" runat="server" type="file">
<asp:Button id="btnAdd" name="btnAdd" runat="server" Text="上传"></asp:Button>
然后在后置代码文件UpPhoto.aspx.cs添加btnAdd按钮的单击事件处理代码:
private void btnAdd_Click(object sender, System.EventArgs e)
{
//获得图象并把图象转换为byte[]
HttpPostedFile upPhoto=UpPhoto.PostedFile
int upPhotoLength=upPhoto.ContentLength
byte[] PhotoArray=new Byte[upPhotoLength]
Stream PhotoStream=upPhoto.InputStream
PhotoStream.Read(PhotoArray,0,upPhotoLength)
//连接数据库
SqlConnection conn=new SqlConnection()
conn.ConnectionString="Data Source=localhostDatabase=testUser Id=saPwd=sa"
SqlCommand cmd=new SqlCommand("UpdateImage",conn)
cmd.CommandType=CommandType.StoredProcedure
cmd.Parameters.Add("@UpdateImage",SqlDbType.Image)
cmd.Parameters["@UpdateImage"].Value=PhotoArray
//如果你希望不使用存储过程来添加图片把上面四句代码改为:
//string strSql="Insert into test(FImage) values(@FImage)"
//SqlCommand cmd=new SqlCommand(strSql,conn)
//cmd.Parameters.Add("@FImage",SqlDbType.Image)
//cmd.Parameters["@FImage"].Value=PhotoArray
conn.Open()
cmd.ExecuteNonQuery()
conn.Close()
}
2)从SQL Server中读取并显示出来
在需要显示图片的地方添加如下代码:
<asp:image id="imgPhoto" runat="server" ImageUrl="ShowPhoto.aspx"></asp:image>
ShowPhoto.aspx主体代码:
private void Page_Load(object sender, System.EventArgs e)
{
if(!Page.IsPostBack)
{
SqlConnection conn=new SqlConnection()
conn.ConnectionString="Data Source=localhostDatabase=testUser Id=saPwd=sa"
string strSql="select * from test where id=2"//这里假设获取id为2的图片
SqlCommand cmd=new SqlCommand(strSql,conn)
conn.Open()
SqlDataReader reader=cmd.ExecuteReader()
reader.Read()
Response.ContentType="application/octet-stream"
Response.BinaryWrite((Byte[])reader["FImage"])
Response.End()
reader.Close()
}
}
2.在WinForm中将图片存入SQL Server,并从SQL Server中读取并显示在picturebox中
1),存入SQL Server
数据库结构和使用的存储过过程,同上面的一样
首先,在窗体中加一个OpenFileDialog控件,命名为ofdSelectPic ;
然后,在窗体上添加一个打开文件按钮,添加如下单击事件代码:
Stream ms
byte[] picbyte
//ofdSelectPic.ShowDialog()
if (ofdSelectPic.ShowDialog()==DialogResult.OK)
{
if ((ms=ofdSelectPic.OpenFile())!=null)
{
//MessageBox.Show("ok")
picbyte=new byte[ms.Length]
ms.Position=0
ms.Read(picbyte,0,Convert.ToInt32(ms.Length))
//MessageBox.Show("读取完毕!")
//连接数据库
SqlConnection conn=new SqlConnection()
conn.ConnectionString="Data Source=localhostDatabase=testUser Id=saPwd=sa"
SqlCommand cmd=new SqlCommand("UpdateImage",conn)
cmd.CommandType=CommandType.StoredProcedure
cmd.Parameters.Add("@UpdateImage",SqlDbType.Image)
cmd.Parameters["@UpdateImage"].Value=picbyte
conn.Open()
cmd.ExecuteNonQuery()
conn.Close()
ms.Close()
}
}
2)读取并显示在picturebox中
首先,添加一个picturebox,名为ptbShow
然后,添加一个按钮,添加如下响应事件:
SqlConnection conn=new SqlConnection()
conn.ConnectionString="Data Source=localhostDatabase=testUser Id=saPwd=sa"
string strSql="select FImage from test where id=1"
SqlCommand cmd=new SqlCommand(strSql,conn)
conn.Open()
SqlDataReader reader=cmd.ExecuteReader()
reader.Read()
MemoryStream ms=new MemoryStream((byte[])reader["FImage"])
Image image=Image.FromStream(ms,true)
reader.Close()
conn.Close()
ptbShow.Image=image
参考资料:http://stewen.cnblogs.com/archive/2005/12/20/300587.aspx
我使用过,我一般是这么处理的,如下(我用的vb,你可以转变成access里的代码):图片是可以放到数据库里面的,以ACCESS为例子,要使用OLE数据类型,
然后把图片转化为长二进制数据存入,读取的时候可以生成系统隐藏的图
片然后在图片控件中显示
Dim cc() As Byte
Dim i
Dim t
Private Sub Command1_Click()
CommonDialog1.Filter = "JPG图片(*.BMP)|*.BMP"
CommonDialog1.ShowOpen
If CommonDialog1.FileName <>"" Then
Picture1.Picture = LoadPicture(CommonDialog1.FileName)
strname = CommonDialog1.FileName
Open strname For Binary As #1
ReDim cc(LOF(1) - 1)
t = cc(LOF(1) - 1) '在读取二进制时,如果是用文件 *** 作那么涉及到到底从文件中取多少字节的问题,所以字节数组要指定大小
Get #1, , cc
Close
Else
MsgBox "没有选中图片"
End If
End Sub
Private Sub Command2_Click()
Adodc1.Refresh
Adodc1.Recordset.AddNew
Adodc1.Recordset.Fields("id") = i
Adodc1.Recordset.Fields("qq") = cc
i = i + 1
Adodc1.Recordset.Update
Adodc1.Refresh
End Sub
Private Sub Command3_Click()
Adodc1.Refresh
Dim P() As Byte
Adodc1.RecordSource = "select qq from 表一 where id='" &Text1.Text &"'"
P = Adodc1.Recordset.Fields("qq") '当把一组二进制数据赋值给一个二进制数组时就不用指定数组的大小了,因为是全部赋值
Open App.Path &"\oo.bmp" For Binary As #1
Put #1, , P
Close
End Sub
Private Sub Command4_Click()
Open App.Path &"\oo.bmp" For Binary As #1
Put #1, , cc
Close
End Sub
Private Sub Form_Load()
i = 1
End Sub
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)