用SQL Server來儲存圖片的程式
介紹:
這片文章是關於使用.NET從SQL伺服器儲存和讀取圖片。
使用工具:
SQL Server 2000
Microsoft .NET Version 1.1
C# (Windows Forms based application)
儲存圖片:
在一個SQL Server 2000 資料庫中建立一個表至少要有一個IMAGE類型的欄位。
這裡用到的SQL語句如下:
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]
實際上IMAGE欄位只是儲存了包含位元據參數的欄位,所以我們必須將圖片轉化成位元組型。
string strFn=this.openFileDialog1.FileName;
通過使用FileInfo類,我獲得了檔案的大小:FileInfo fiImage=new FileInfo(strFn);
聲明一個相應大小的數組:
this.m_lImageFileLength=fiImage.Length;
m_barrImg=new byte[Convert.ToInt32(this.m_lImageFileLength)];
通過FileStream對象,我填充該數組:
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();
完成調用圖片代碼:
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);
}
}
儲存位元組數組資料到資料庫。
Create command text to insert record. this.sqlCommand1.CommandText=
"INSERT INTO tblImgData(ID,Name,Picture)" +
" values(@ID,@Name,@Picture)";
Create parameters. 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);
注意 “@Picture” 有 “SqlDbType.Image”因為它是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;
“this.m_barrImg”是一個位元組數組,剛才我們已經填充過了。
現在執行SQL用來儲存記錄到資料庫中:
int iresult=this.sqlCommand1.ExecuteNonQuery();
完成儲存圖片代碼:
Collapseprivate 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();
}
}
讀取圖片:
從資料庫讀取圖片是儲存圖片的精確的反向操作。
首先建立文本指令用來讀取記錄。
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;
開啟資料庫連接並執行“ExecuteScalar”,因為我們只需要“IMAGE”欄位下的返回資料。
byte[] barrImg=(byte[])cmdSelect.ExecuteScalar();
通過分階段的運行指令返回“Object”類型的資料,我們將其轉換為位元組數組。
儲存資料到臨時檔案中:
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);
完成圖片的讀取代碼:
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();
}
}