使用.NET從SQL伺服器儲存和讀取圖片

來源:互聯網
上載者:User

用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();
    }
}

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.