有很多網友想在數據庫中保存圖片,雖然這不是什么最好的選擇,但有時的確很有用。
有時候我們需要保存一些binary data進數據庫。SQL Server提供一個叫做image的特殊數據類型供我們保存binary data。Binary data可以是圖片、文檔等。在這篇文章中我們將看到如何在SQL Server中保存和輸出圖片。
1、建表
為了試驗這個例子你需要一個含有數據的table(你可以在現在的庫中創建它,也可以創建一個新的數據庫),下面是它的結構:
| 列名 | 數據類型 | 目的 |
| ID | integer | 主鍵 |
| IMGTITLE | varchar(50) | 存儲圖片名字 |
| IMGTYPE | varchar(50) | 存儲圖片類型 |
| IMGDATA | image | 存儲圖片本身數據 |
2、保存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();
3、從數據庫中輸出圖片
現在讓我們從數據庫中取出我們剛剛保存的圖片,在這兒,我們將直接將圖片輸出至瀏覽器。你也可以將它保存為一個文件或做任何你想做的。
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文件。
新聞熱點
疑難解答