ذخیره و بازیابی تصاویر از Database بدون استفاده از Stored Procedures
پنجشنبه 26 شهریور 1394در این مقاله آموزش می دهیم که چگونه بدون استفاده از Stored Procedures در #C تصاویر را در دیتابیس ذخیره کرده و از آن بازیابی کنیم.
طراحی دیتابیس:
در اینجا یک دیتابیس به نام dbFiles ایجاد کرده ایم که جدولی به نام tblFiles دارد. این جدول همانطور که در شکل مشاهده می کنید، 4 فیلد دارد.
همانطور که می بینید، برای فیلد id، ویژگی identity را فعال نمودیم و id به طور اتوماتیک افزایش خواهد یافت.
نوع محتوا:
با توجه به نوع فایل، نوع محتوا به شکل زیر خواهد بود:
Connection String:
کد مربوط به connection string به صورت زیر می باشد که می توانید آن را باتوجه به نیاز خود تغییر دهید:
<connectionStrings> <add name="conString" connectionString="Data Source=.;database=dbFiles;User ID=sa;Password=123;"/> </connectionStrings >
خواندن فایل:
فایل ها در File Stream خوانده می شوند و سپس File Stream با استفاده از BinaryReader برای ذخیره شدن در جدول دیتابیس به Byte array تبدیل می شود.
کد #C:
// Read the file and convert it to Byte Array string filePath = Server.MapPath("APP_DATA/TestDoc.docx"); string filename = Path.GetFileName(filePath); FileStream fs = new FileStream(filePath, FileMode.Open, FileAccess.Read); BinaryReader br = new BinaryReader(fs); Byte[] bytes = br.ReadBytes((Int32)fs.Length); br.Close(); fs.Close();
کد VB.Net:
' Read the file and convert it to Byte Array Dim filePath As String = Server.MapPath("APP_DATA/Testxls.xlsx") Dim filename As String = Path.GetFileName(filePath) Dim fs As FileStream = New FileStream(filePath, FileMode.Open, FileAccess.Read) Dim br As BinaryReader = New BinaryReader(fs) Dim bytes As Byte() = br.ReadBytes(Convert.ToInt32(fs.Length)) br.Close() fs.Close()
ذخیره فایل در دیتابیس:
زمانی که فایل به Byte array تبدیل شد، می تواند در دیتابیس قرار بگیرد. نام فایل، نوع محتوای فایل و Byte array درکنارهم، فایل ذخیره شده در دیتابیس را تشکیل می دهند.
شکل زیر داده هایی را که در جدول ذخیره می شوند، نشان می دهد.
کد #C:
//insert the file into database string strQuery = "insert into tblFiles(Name, ContentType, Data) values (@Name, @ContentType, @Data)"; SqlCommand cmd = new SqlCommand(strQuery); cmd.Parameters.Add("@Name", SqlDbType.VarChar).Value = filename; cmd.Parameters.Add("@ContentType", SqlDbType.VarChar).Value = "application/vnd.ms-word"; cmd.Parameters.Add("@Data", SqlDbType.Binary).Value = bytes; InsertUpdateData(cmd);
کد VB.Net:
'insert the file into database Dim strQuery As String = "insert into tblFiles(Name, ContentType, Data) values (@Name, @ContentType, @Data)" Dim cmd As SqlCommand = New SqlCommand(strQuery) cmd.Parameters.Add("@Name", SqlDbType.VarChar).Value = filename cmd.Parameters.Add("@ContentType", SqlDbType.VarChar).Value = "application/vnd.ms-excel" cmd.Parameters.Add("@Data", SqlDbType.Binary).Value = bytes InsertUpdateData(cmd)
و تابع InsertUpdateData شیء SqlCommand را پذیرفته، Query را اجرا کرده و داده ها را در دیتابیس وارد می کند.
کد #C:
private Boolean InsertUpdateData(SqlCommand cmd) { String strConnString = System.Configuration.ConfigurationManager .ConnectionStrings["conString"].ConnectionString; SqlConnection con = new SqlConnection(strConnString); cmd.CommandType = CommandType.Text; cmd.Connection = con; try { con.Open(); cmd.ExecuteNonQuery(); return true; } catch (Exception ex) { Response.Write(ex.Message); return false; } finally { con.Close(); con.Dispose(); } }
کد VB.Net:
Public Function InsertUpdateData(ByVal cmd As SqlCommand) As Boolean Dim strConnString As String = System.Configuration. ConfigurationManager.ConnectionStrings("conString").ConnectionString Dim con As New SqlConnection(strConnString) cmd.CommandType = CommandType.Text cmd.Connection = con Try con.Open() cmd.ExecuteNonQuery() Return True Catch ex As Exception Response.Write(ex.Message) Return False Finally con.Close() con.Dispose() End Try End Function
بازیابی فایل از دیتابیس:
برای بازیابی فایل، یک کوئری Select اجرا می شود و ID فایل مربوطه به عنوان پارامتر ارسال می شود. شیء command آماده شده و به تابع GetData ارسال می شود که یک DataTable برمی گرداند که حاوی فایل موردنظر است.
سپس DataTable به تابع download ارسال می شود که دانلود فایل را شروع می کند.
کد #C:
string strQuery = "select Name, ContentType, Data from tblFiles where id=@id"; SqlCommand cmd = new SqlCommand(strQuery); cmd.Parameters.Add("@id", SqlDbType.Int).Value = 1; DataTable dt = GetData(cmd); if (dt != null) { download(dt); }
کد VB.Net:
Dim strQuery As String = "select Name, ContentType, Data from tblFiles where id=@id" Dim cmd As SqlCommand = New SqlCommand(strQuery) cmd.Parameters.Add("@id", SqlDbType.Int).Value = 1 Dim dt As DataTable = GetData(cmd) If dt IsNot Nothing Then download(dt) End If
در زیر، می توانید کد تابع GetData را مشاهده کنید که بسیار ساده است و کوئری Select را اجرا می کند.
کد #C:
private DataTable GetData(SqlCommand cmd) { DataTable dt = new DataTable(); String strConnString = System.Configuration.ConfigurationManager .ConnectionStrings["conString"].ConnectionString; SqlConnection con = new SqlConnection(strConnString); SqlDataAdapter sda = new SqlDataAdapter(); cmd.CommandType = CommandType.Text; cmd.Connection = con; try { con.Open(); sda.SelectCommand = cmd; sda.Fill(dt); return dt; } catch { return null; } finally { con.Close(); sda.Dispose(); con.Dispose(); } }
کد VB.Net:
Public Function GetData(ByVal cmd As SqlCommand) As DataTable Dim dt As New DataTable Dim strConnString As String = System.Configuration .ConfigurationManager.ConnectionStrings("conString").ConnectionString() Dim con As New SqlConnection(strConnString) Dim sda As New SqlDataAdapter cmd.CommandType = CommandType.Text cmd.Connection = con Try con.Open() sda.SelectCommand = cmd sda.Fill(dt) Return dt Catch ex As Exception Response.Write(ex.Message) Return Nothing Finally con.Close() sda.Dispose() con.Dispose() End Try End Function
دانلود فایل:
در اینجا کد تابعی را داریم که دانلود فایل را آغاز می کند. این تابع محتوای فایل را می خواند و در یک Byte array می ریزد و همچنین نام فایل و نوع محتوای آن را نیز می گیرد. سپس بایت ها را با استفاده از Response.BinaryWrite در response مربوطه می نویسد.
کد #C:
private void download (DataTable dt) { Byte[] bytes = (Byte[])dt.Rows[0]["Data"]; Response.Buffer = true; Response.Charset = ""; Response.Cache.SetCacheability(HttpCacheability.NoCache); Response.ContentType = dt.Rows[0]["ContentType"].ToString(); Response.AddHeader("content-disposition", "attachment;filename=" + dt.Rows[0]["Name"].ToString()); Response.BinaryWrite(bytes); Response.Flush(); Response.End(); }
کد VB.Net:
Protected Sub download(ByVal dt As DataTable) Dim bytes() As Byte = CType(dt.Rows(0)("Data"), Byte()) Response.Buffer = True Response.Charset = "" Response.Cache.SetCacheability(HttpCacheability.NoCache) Response.ContentType = dt.Rows(0)("ContentType").ToString() Response.AddHeader("content-disposition", "attachment;filename=" & dt.Rows(0)("Name").ToString()) Response.BinaryWrite(bytes) Response.Flush() Response.End() End Sub
- ASP.net
- 2k بازدید
- 1 تشکر