ذخیره و بازیابی تصاویر از Database بدون استفاده از Stored Procedures

در این مقاله آموزش می دهیم که چگونه بدون استفاده از Stored Procedures در #C تصاویر را در دیتابیس ذخیره کرده و از آن بازیابی کنیم.

ذخیره و بازیابی تصاویر از Database بدون استفاده از Stored Procedures

طراحی دیتابیس:

در اینجا یک دیتابیس به نام 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

 

فایل های ضمیمه