[ASP.net] 快速將檔案、圖片二進位檔案塞入資料表

[ASP.net] 快速將檔案、圖片二進位檔案塞入資料表

隨手紀錄一下

目前我見過最有效率的寫法

1. 楊志強老師的書籍:T-SQL實戰學堂(使用T-SQL OPENROWSET)

2. 使用程式做,聖哥的部落格 ADO.NET 二進位資料存取 (SQL Server image 型態)

3.SqlBulkCopy in ADO.NET 2.0MSDN範例

 

假設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="圖片" />

 

執行結果: