有時候我們需要儲存一些binary data進資料庫。SQL Server提供一個叫做image的特殊資料類型供我們儲存binary data。Binary data可以是圖片、文檔等。在這篇文章中我們將看到如何在SQL Server中儲存和輸出圖片。
建表
為了實驗這個例子你需要一個含有資料的table(你可以在現在的庫中建立它,也可以建立一個新的資料庫),下面是它的結構:
Column Name |
Datatype |
Purpose |
ID |
Integer |
identity column Primary key |
IMGTITLE |
Varchar(50) |
Stores some user friendly title to identity the image |
IMGTYPE |
Varchar(50) |
Stores image content type. This will be same as recognized content types of ASP.NET |
IMGDATA |
Image |
Stores actual image or binary data. |
儲存images進SQL Server資料庫
為了儲存圖片到table你首先得從用戶端上傳它們到你的web伺服器。你可以建立一個web form,用TextBox得到圖片的標題,用HTML File Server Control得到圖片檔案。確信你設定了Form的encType屬性為multipart/form-data。
Stream imgdatastream = File1.PostedFile.InputStream;
int imgdatalen = File1.PostedFile.ContentLength;
string imgtype = File1.PostedFile.ContentType;
string imgtitle = TextBox1.Text;
byte[] imgdata = new byte[imgdatalen];
int n = imgdatastream.Read(imgdata,0,imgdatalen);
string connstr=
((NameValueCollection)Context.GetConfig
("appSettings"))["connstr"];
SqlConnection connection = new SqlConnection(connstr);
SqlCommand command = new SqlCommand
("INSERT INTO ImageStore(imgtitle,imgtype,imgdata)
VALUES ( @imgtitle, @imgtype,@imgdata )", connection );
SqlParameter paramTitle = new SqlParameter
("@imgtitle", SqlDbType.VarChar,50 );
paramTitle.Value = imgtitle;
command.Parameters.Add( paramTitle);
SqlParameter paramData = new SqlParameter
( "@imgdata", SqlDbType.Image );
paramData.Value = imgdata;
command.Parameters.Add( paramData );
SqlParameter paramType = new SqlParameter
( "@imgtype", SqlDbType.VarChar,50 );
paramType.Value = imgtype;
command.Parameters.Add( paramType );
connection.Open();
int numRowsAffected = command.ExecuteNonQuery();
connection.Close();
從資料庫中輸出圖片
現在讓我們從資料庫中取出我們剛剛儲存的圖片,在這兒,我們將直接將圖片輸出至瀏覽器。你也可以將它儲存為一個檔案或做任何你想做的。
private void Page_Load(object sender, System.EventArgs e)
{
string imgid =Request.QueryString["imgid"];
string connstr=((NameValueCollection)
Context.GetConfig("appSettings"))["connstr"];
string sql="SELECT imgdata, imgtype FROM ImageStore WHERE id = "
+ imgid;
SqlConnection connection = new SqlConnection(connstr);
SqlCommand command = new SqlCommand(sql, connection);
connection.Open();
SqlDataReader dr = command.ExecuteReader();
if(dr.Read())
{
Response.ContentType = dr["imgtype"].ToString();
Response.BinaryWrite( (byte[]) dr["imgdata"] );
}
connection.Close();
}
在上面的代碼中我們使用了一個已經開啟的資料庫,通過datareader選擇images。接著用Response.BinaryWrite代替Response.Write來顯示image檔案。