[ASP.net] 快速將檔案、圖片二進位檔案塞入資料表
隨手紀錄一下
目前我見過最有效率的寫法
1. 楊志強老師的書籍:T-SQL實戰學堂(使用T-SQL OPENROWSET)
2. 使用程式做,聖哥的部落格 ADO.NET 二進位資料存取 (SQL Server image 型態)
3.SqlBulkCopy in ADO.NET 2.0、MSDN範例
假設Table:
Create Table myPhoto
(
[uid] int identity Not NULL primary key,
title nvarchar(50) NULL,
photoImage varbinary(MAX) NULL
)
以下是第一種SQL的寫法:
(OPENROWSET很好用,可以讀檔案裡的文字資料也可以讀二進位資料)
//按鈕Click事件
protected void btn_Go_Click(object sender, EventArgs e)
{
//SINGLE_BLOG表示二進位檔案,SINGLE_CLOB表示檔案裡的文字資料,SINGLE_NCLOB表示UNICODE編碼檔案裡的文字
this.ExecuteNonQuery(@"Insert into myPhoto (title,photoImage)
Select 'Penguins',a.*
From OPENROWSET(Bulk '\\59.121.35.241\共享資料夾\Penguins.jpg',Single_Blob) a;");//必須給資料集別名
}
//執行新刪修指令
private int ExecuteNonQuery(String sql)
{
using (SqlConnection conn=new SqlConnection(@"Data Source=.\sqlexpress;Database=NorthwindChinese;Integrated Security=True"))
{
SqlCommand cmd=new SqlCommand(sql,conn);
conn.Open();
int rows = cmd.ExecuteNonQuery();//執行新刪修SQL語法
conn.Close();
return rows;//回傳影響筆數
}
}
引用楊志強老師書上寫的,每秒鐘可以載入5.9MB (真快…
讀取的話,先準備另一個Web Form(Default2.aspx)
.cs
protected void Page_Load(object sender, EventArgs e)
{
//依據傳入的Request.QueryString["uid"]的不同,撈不同的圖片
Response.Clear();
//application/octet-stream為任意的二進位檔案,圖片類型也可用image/jpeg
Response.ContentType = "application/octet-stream";
byte[] file = (byte[])this.GetSingle("Select Top 1 photoImage FROM myPhoto Where uid = '"+Request.QueryString["uid"]+"' Order by uid ASC");
Response.BinaryWrite(file);
}
private Object GetSingle(String sql)
{
using (SqlConnection conn = new SqlConnection(@"Data Source=.\sqlexpress;Database=NorthwindChinese;Integrated Security=True"))
{
SqlCommand cmd = new SqlCommand(sql, conn);
conn.Open();
Object obj = cmd.ExecuteScalar();
conn.Close();
return obj;//回傳該檔案
}
}
然後其他頁.aspx可以如下的寫法:
<img src="Default2.aspx?uid=2" alt="圖片" />
執行結果: