一般情况下,将图片保存在服务器的某个目录下,在数据库中存储此图片的地址,这样做的好处很明显
- 可以节省数据库的存储空间
- 当数据库崩溃后,图片资源不会丢失
- 向数据库中插入图片时,需要先将图片压缩成二进制表示形式,而从数据库中查询图片时,则需要将二进制流转换为图片,这在频繁查询时会影响程序的性能
- ....
下面从纯技术的角度解释如何将图片插入数据库中。
首先在sql server中新建一个表Images,sql语句如下:
- (
- BLODID int identity not null,
- BLOBData image not null
- )
其中 BLOBData字段采用image数据类型,这是sql server中用于存储图片的一种数据类型
下面阐述一下程序的思路
- 点击“浏览”按钮打开选择对话框,用户可以选择想要存储到数据库中的图片
- 点击“存储图片”按钮,将图片插入到数据库中
- 点击”读取图片“按钮,将图片从数据库中查询出来
具体步骤如下:
- 新建一个winform窗体,放置一个文本框,两个按钮,一个OpenFileDialog控件,一个PictureBox控件
界面布局图下:
2.声明全局变量filename:
在”浏览“按钮的单击事件中添加如下代码:
- {
- filename = this.openFileDialog1.FileName;
- }
3.在”存储图片“按钮的单击事件中添加如下代码:
- {
- string strConn = "user id=sa;password=sa;initial catalog=MyTest;Server=YHB;Connect Timeout=30";
- SqlConnection connection = new SqlConnection(strConn);
- string sql = "insert into Images (blobdata) values (@blobdata)";
- SqlCommand command = new SqlCommand(sql, connection);
- //图片路径
- string picturePath = @"D:\My Documents\My Pictures\000_d74047f595809456636fd470a00f0ff8.jpg";
- FileStream fs = new FileStream(picturePath, FileMode.Open, FileAccess.Read);
- Byte[] mybyte = new byte[fs.Length];
- fs.Read(mybyte,0,mybyte.Length);
- fs.Close();
- SqlParameter prm = new SqlParameter
- "@blobdata", SqlDbType.VarBinary, mybyte.Length);
- prm.Value = mybyte;
- command.Parameters.Add(prm);
- connection.Open();
- command.ExecuteNonQuery();
- connection.Close();
- MessageBox.Show("存储成功");
- }
- catch (Exception ex)
- {
- MessageBox.Show(ex.Message);
- }
4.在”读取图片“按钮的单击事件中添加如下代码:
- {
- //创建数据库连接字符串
- string strConn = "user id=sa;password=sa;initial catalog=MyTest;Server=YHB;Connect Timeout=30";
- //创建SqlConnection对象
- SqlConnection connection = new SqlConnection(strConn);
- //打开数据库连接
- connection.Open();
- //创建SQL语句
- string sql = "select blodid,blobdata from Images order by blodid";
- //创建SqlCommand对象
- SqlCommand command = new SqlCommand(sql, connection);
- //创建DataAdapter对象
- SqlDataAdapter dataAdapter = new SqlDataAdapter(command);
- //创建DataSet对象
- DataSet dataSet = new DataSet();
- dataAdapter.Fill(dataSet, "BLOBTest");
- int c = dataSet.Tables["BLOBTest"].Rows.Count;
- if (c > 0)
- {
- Byte[] mybyte = new byte[0];
- mybyte = (Byte[])(dataSet.Tables["BLOBTest"].Rows[c - 1]["BLOBData"]);
- MemoryStream ms = new MemoryStream(mybyte);
- pictureBox1.Image = Image.FromStream(ms);
- }
- connection.Close();
- }
- catch (Exception ex)
- {
- MessageBox.Show(ex.Message);
- }