Storing and Retrieving Images from SQL Server using Microsoft .NET
原文 Storing and Retrieving Images from SQL Server using Microsoft .NET
Introduction
This article is about storing and retrieving images from database in Microsoft .NET using C#.
Tools Used
- SQL Server 2000
- Microsoft .NET Version 1.1
- C# (Windows Forms based application)
Storing Images
- Create a table in a SQL Server 2000 database which has at least one field of type
IMAGE
.Here is the script I used:
Collapse | Copy Code
- CREATE TABLE [dbo].[tblImgData] (
- [ID] [int] NOT NULL ,
- [Name] [varchar] (50) COLLATE SQL_Latin1_General_CP1_CI_AS NULL ,
- [Picture] [image] NULL
- ) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]
- Actually
IMAGE
field is just holding the reference to the page containing the binary data so we have to convert our image into bytes.- I used a file open dialog box to locate the file.
Collapse | Copy Code
- this.openFileDialog1.ShowDialog(this);
- string strFn=this.openFileDialog1.FileName;
- this.openFileDialog1.ShowDialog(this);
- By using
FileInfo
class, I retrieved the file size:Collapse | Copy Code
- FileInfo fiImage=new FileInfo(strFn);
- Declare an array of that size.
Collapse | Copy Code
- this.m_lImageFileLength=fiImage.Length;
- m_barrImg=new byte[Convert.ToInt32(this.m_lImageFileLength)];
- this.m_lImageFileLength=fiImage.Length;
- By using
FileStream
object, I filled the byte array.Collapse | Copy Code
- FileStream fs=new FileStream(strFn,FileMode.Open,
- FileAccess.Read,FileShare.Read);
- int iBytesRead=fs.Read(m_barrImg,0,
- Convert.ToInt32(this.m_lImageFileLength));
- fs.Close();
- FileStream fs=new FileStream(strFn,FileMode.Open,
Complete Load Image Code
Collapse | Copy Code
- protected void LoadImage()
- {
- try
- {
- this.openFileDialog1.ShowDialog(this);
- string strFn=this.openFileDialog1.FileName;
- this.pictureBox1.Image=Image.FromFile(strFn);
- FileInfo fiImage=new FileInfo(strFn);
- this.m_lImageFileLength=fiImage.Length;
- FileStream fs=new FileStream(strFn,FileMode.Open,
- FileAccess.Read,FileShare.Read);
- m_barrImg=new byte[Convert.ToInt32(this.m_lImageFileLength)];
- int iBytesRead = fs.Read(m_barrImg,0,
- Convert.ToInt32(this.m_lImageFileLength));
- fs.Close();
- }
- catch(Exception ex)
- {
- MessageBox.Show(ex.Message);
- }
- }
- I used a file open dialog box to locate the file.
- Saving byte array data to database.
- Create command text to insert record.
Collapse | Copy Code
- this.sqlCommand1.CommandText=
- "INSERT INTO tblImgData(ID,Name,Picture)" +
- " values(@ID,@Name,@Picture)";
- this.sqlCommand1.CommandText=
- Create parameters.
Collapse | Copy Code
- this.sqlCommand1.Parameters.Add("@ID",
- System.Data.SqlDbType.Int, 4);
- this.sqlCommand1.Parameters.Add("@Name",
- System.Data.SqlDbType.VarChar, 50);
- this.sqlCommand1.Parameters.Add("@Picture",
- System.Data.SqlDbType.Image);
Notice “
@Picture
” has “SqlDbType.Image
” because it is ofIMAGE
type Field. - this.sqlCommand1.Parameters.Add("@ID",
- Provide the value to the parameters.
Collapse | Copy Code
- this.sqlCommand1.Parameters["@ID"].Value=this.editID.Text;
- this.sqlCommand1.Parameters["@Name"].Value=this.editName.Text;
- this.sqlCommand1.Parameters["@Picture"].Value=this.m_barrImg;
“
this.m_barrImg
” is a byte array which we filled in the previous step. - this.sqlCommand1.Parameters["@ID"].Value=this.editID.Text;
- Now execute non-query for saving the record to the database.
Collapse | Copy Code
- int iresult=this.sqlCommand1.ExecuteNonQuery();
Complete Save Image Code
Collapse | Copy Code
- private void btnSave_Click(object sender, System.EventArgs e)
- {
- try
- {
- this.sqlConnection1.Open();
- if (sqlCommand1.Parameters.Count ==0 )
- {
- this.sqlCommand1.CommandText="INSERT INTO tblImgData(ID," +
- " Name,Picture) values(@ID,@Name,@Picture)";
- this.sqlCommand1.Parameters.Add("@ID",
- System.Data.SqlDbType.Int,4);
- this.sqlCommand1.Parameters.Add("@Name",
- System.Data.SqlDbType.VarChar,50);
- this.sqlCommand1.Parameters.Add("@Picture",
- System.Data.SqlDbType.Image);
- }
- this.sqlCommand1.Parameters["@ID"].Value=this.editID.Text;
- this.sqlCommand1.Parameters["@Name"].Value=this.editName.Text;
- this.sqlCommand1.Parameters["@Picture"].Value=this.m_barrImg;
- int iresult=this.sqlCommand1.ExecuteNonQuery();
- MessageBox.Show(Convert.ToString(iresult));
- }
- catch(Exception ex)
- {
- MessageBox.Show(ex.Message);
- }
- finally
- {
- this.sqlConnection1.Close();
- }
- }
- Create command text to insert record.
Retrieving Image
Retrieving images from the database is the exact reverse process of saving images to the database.
- First create command text to retrieve record.
Collapse | Copy Code
- SqlCommand cmdSelect = new SqlCommand("select Picture" +
- " from tblImgData where ID=@ID",
- this.sqlConnection1);
- SqlCommand cmdSelect = new SqlCommand("select Picture" +
- Create parameter for the query.
Collapse | Copy Code
- cmdSelect.Parameters.Add("@ID",SqlDbType.Int,4);
- Provide value to the parameter.
Collapse | Copy Code
- cmdSelect.Parameters["@ID"].Value=this.editID.Text;
- Open database connection and execute “
ExecuteScalar
” because we want only “IMAGE
” column data back.Collapse | Copy Code
- byte[] barrImg=(byte[])cmdSelect.ExecuteScalar();
As the execute scalar returns data of “
Object
” data type, we cast it tobyte
array. - Save this data to a temporary file.
Collapse | Copy Code
- string strfn=Convert.ToString(DateTime.Now.ToFileTime());
- FileStream fs=new FileStream(strfn,FileMode.CreateNew,FileAccess.Write);
- fs.Write(barrImg,0,barrImg.Length);
- fs.Flush();
- fs.Close();
- string strfn=Convert.ToString(DateTime.Now.ToFileTime());
- And display the image anywhere you want to display.
Collapse | Copy Code
- pictureBox1.Image=Image.FromFile(strfn);
Complete Image Retrieving Code

- private void btnLoad_Click(object sender, System.EventArgs e)
- {
- try
- {
- SqlCommand cmdSelect=new SqlCommand("select Picture" +
- " from tblImgData where ID=@ID",this.sqlConnection1);
- cmdSelect.Parameters.Add("@ID",SqlDbType.Int,4);
- cmdSelect.Parameters["@ID"].Value=this.editID.Text;
- this.sqlConnection1.Open();
- byte[] barrImg=(byte[])cmdSelect.ExecuteScalar();
- string strfn=Convert.ToString(DateTime.Now.ToFileTime());
- FileStream fs=new FileStream(strfn,
- FileMode.CreateNew, FileAccess.Write);
- fs.Write(barrImg,0,barrImg.Length);
- fs.Flush();
- fs.Close();
- pictureBox1.Image=Image.FromFile(strfn);
- }
- catch(Exception ex)
- {
- MessageBox.Show(ex.Message);
- }
- finally
- {
- this.sqlConnection1.Close();
- }
- }
Bibliography
License
This article has no explicit license attached to it but may contain usage terms in the article text or the download files themselves. If in doubt please contact the author via the discussion board below.
A list of licenses authors might use can be found here
Storing and Retrieving Images from SQL Server using Microsoft .NET的更多相关文章
- 转载:Character data is represented incorrectly when the code page of the client computer differs from the code page of the database in SQL Server 2005
https://support.microsoft.com/en-us/kb/904803 Character data is represented incorrectly when the cod ...
- SQL SERVER 2012/2014 链接到 SQL SERVER 2000的各种坑
本文总结一下SQL SERVER 2012/2014链接到SQL SERVER 2000的各种坑,都是在实际应用中遇到的疑难杂症.可能会有人说怎么还在用SQL SERVER 2000,为什么不升级呢? ...
- SQL SERVER 2005删除维护作业报错:The DELETE statement conflicted with the REFERENCE constraint "FK_subplan_job_id"
案例环境: 数据库版本: Microsoft SQL Server 2005 (Microsoft SQL Server 2005 - 9.00.5000.00 (X64) ) 案例介绍: 对一个数据 ...
- [转]SQL SERVER – Importance of Database Schemas in SQL Server
原文地址http://blog.sqlauthority.com/2009/09/07/sql-server-importance-of-database-schemas-in-sql-server/ ...
- sql server数据库连接问题处理
下面请一字一句地看,一遍就设置成功,比你设置几十遍失败,费时会少得多. 首先,在连接数据库之前必须保证SQL Server 2012是采用SQL Server身份验证方式而不是windows身份验证方 ...
- Sql Server 2008卸载后再次安装一直报错
sql server 2008卸载之后再次安装一直报错问题. 第一:由于上一次的卸载不干净,可参照百度完全卸载sql server2008 的方式 1. 用WindowsInstaller删除所有与S ...
- [转载]在SQL Server 中,如何实现DBF文件和SQL Server表之间的导入或者导出?
原来使用SQL Server 2000数据库,通过DTS工具很方便地在SQL Server和DBF文件之间进行数据的导入和导出,现在安装了SQL Server2005之后,发现其提供的“SQL Ser ...
- sql server 基础教程[温故而知新三]
子曰:“温故而知新,可以为师矣.”孔子说:“温习旧知识从而得知新的理解与体会,凭借这一点就可以成为老师了.“ 尤其是咱们搞程序的人,不管是不是全栈工程师,都是集十八般武艺于一身.不过有时候有些知识如果 ...
- 招聘 微软全球技术支持中心 sql server组
微软亚太区全球技术支持中心(APGC CSS)是微软为个人用户.开发者.IT 专业人员到合作伙伴和企业级合作伙伴提供全方位.多元化的服务和技术支持的部门.一个优秀的SQL Server技术支持工程师应 ...
随机推荐
- [转载] RaspberryPi B+ WiringPi 引脚对应图
Pin Numbering - Raspberry Pi Model B+ Numbering Scheme Expansion Header J8 Pinout (40-pin Header) Ad ...
- 轮播图片 高效图片轮播,两个imageView实现
该轮播框架的优势: 文件少,代码简洁 不依赖任何其他第三方库,耦合度低 同时支持本地图片及网络图片 可修改分页控件位置,显示或隐藏 自定义分页控件的图片,就是这么个性 自带图片缓存,一次加载,永久使用 ...
- HDU 4435 charge-station (并查集)
先说下题目的意思: 在一个二维坐标系中有N个点,某人要来个走遍所有点的旅行,但是他的车每次加油后只能走M个单位距离:所以要在这个N点中选一些建立加油站:问题来了:i^th 点 建加油站的花费是 2 ...
- Linux下一个OTL 采用long long类型数据库支持BIGINT
码如下面: #define OTL_BIGINT long long #define OTL_STR_TO_BIGINT(str,n) \ { \ n=atoll(str); \ } #define ...
- 左右Map
Person p=new Person("黄雄"); Map map=new HashMap(); map.put("p", p); p.setName(&qu ...
- 进程和线程之间的关系和区别 和 CPU牒
流程具有一定独立功能的程序关于某个数据集合上的一次执行活动,进程是系统进行资源分配和调度的一个独立单位. 线程是进程的一个实体,是CPU调度和分派的基本单位,它是比进程更小的能独立执行的基本单位. 进 ...
- 每位iOS开发人员不容错过的10大实用工具
内容简介 1.iOS简介 2.iOS开发十大实用工具之开发环境 3.iOS开发十大实用工具之图标设计 4.iOS开发十大实用工具之原型设计 5.iOS开发十大实用工具之演示工具 6.iOS开发十大实用 ...
- Everything中文绿色版在Win7/8/10用不了问题的图文教程,只显示盘符
打开Everything后点击菜单上的“工具”——“选项” 勾选 Everything Service 后,点应用 需要用到管理者权限
- Java AIO 入门实例(转)
Java7 AIO入门实例,首先是服务端实现: 服务端代码 SimpleServer: public class SimpleServer { public SimpleServer(int port ...
- JSON小结
在 JSON 中,“Object” 是什么呢? json.org 有很好的解释: 1 .An object is an unordered set of name/value pairs. 2.An ...