ذخیره و بازیابی تصاویر از 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
- 3k بازدید
- 1 تشکر