"> ذخیره و بازیابی عکس در SQL Server بدون استفاده از Stored Procedure | ام اس پی سافت

ذخیره و بازیابی عکس در SQL Server بدون استفاده از Stored Procedure

ذخیره و بازیابی عکس در SQL Server

در این مقاله نشان می دهیم که چگونه یک تصویر را بدون استفاده از Stored Procedure در زبان های سی شارپ و VB.Net به SQl Server وارد کنیم و دوباره از آن بگیریم. با من همراه باشید …

ذخیره و بازیابی عکس در SQL Server

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

در این جا ما یک DataBase میسازیم و آن را dbFiles مینامیم و در آن جدولی به نام tblFiles که دارای چهار فیلد هست ایجاد میکنیم.

ذخیره و بازیابی عکس در SQL Server

اگر در تصویر بالا دقت کرده باشید ما گزینه Is Identity را True میکنیم بنابراین به صورت خودکار افزایش پیدا خواهد کرد.

Field Relevance
id Identification Number
Name File Name
Content Type Content Type for the file
Data File stored as Binary Data

Content Type

نوع فایل هایی که در زیر آورده شده است کنتن تایپ هستن.

File Type Content Type
Word Document application/vnd.ms-word
Excel Document application/vnd.ms-excel
JPEG Image image/jpeg
Portable Document Format application/pdf

Connection string

در زیر Connection string درDataBase آورده شده است شما میتوانید آن را با توجه به سلیقه خود تغییر دهید.

<connectionStrings>

<add name="conString" connectionString="Data Source=.\SQLEXPRESS;database=dbFiles; Integrated Security=true"/>

</connectionStrings >

 

خواندن فایل

فایل هایی که خوانده خواهند شد باید به داخل File Stream روند و سپسFile Stream برای استفاده BinaryReader آن را به فرمت  byte array تبدیل خواهد کرد و سپس در database table ذخیره خواهد کرد.

سی شارپ

// 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

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 تبدیل میشود بهdatabase اضافه خواهد شد.

نام فایل , نوع محتوای فایل و Binary data که به فایل شباهت دارند ، در database ذخیره میشوند.

تصویر زیر data ذخیره شده در جدول را نشان میدهد.

ذخیره و بازیابی عکس در SQL Server

سی شارپ

//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 objectSql command را قبول میکند و query را اجرا میکند و data را وارد DataBase میکند.

سی شارپ

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

 

دریافت فایل از دیتابیس

برای برگرداندن فایل از دیتابیس , selectquery را اجرا کنید و ایدی فایل را به عنوان پارامتر به آن بدهید.

[divider style=”normal” top=”20″ bottom=”20″]

پیشنهاد میکنم : چگونه در SQL Server یک Stored Procedure بسازیم

[divider style=”normal” top=”20″ bottom=”20″]

command object آماده شده به GetData داده میشود و GetDataDataTable , شامل اطلاعات فایل مورد نظر را برمیگرداند.

سپس DataTable به تابع download داده میشود که شروع به دانلود فایل میکند.

سی شارپ

 

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 query را اجرا میکند.

سی شارپ

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

 

دانلود فایل

در این جا تابع شروع دانلود فایل وجود دارد.

که به طور کلی محتوای فایل (File Content) را بهByte array میخواند و همچنین نام فایل و محتوای آن را میگیرد.

سپس نتیجه را برای Response.BinaryWrite مینویسد.

سی شارپ

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

 

موفق باشید!

 

داریوش فرخی

داریوش فرخی هستم از سال 92 شروع به یادگیری برنامه نویسی و از سال 93 در بخش برنامه نویسی و تولید محتوای سایت mspsoft.com مشغول هستم. فعالیتم نیز بیشتر در زمینه های برنامه نویسی با سی شارپ و asp.net بوده است. اوقات فراغتم را هم غالبا با تماشای فیلم یا بازی های کامپیوتری پر میکنم .

نوشته‌های مرتبط

دیدگاه‌ها

*
*

این سایت از اکیسمت برای کاهش هرزنامه استفاده می کند. بیاموزید که چگونه اطلاعات دیدگاه های شما پردازش می‌شوند.

کدیشن ! مارکت پروژه های برنامه نویسی راه اندازی شدیه توکه پا بریم ببینم