Upload and save image in binary format in Sql server database and retrieve, bind to DataList in Asp.Net C#, VB

Save image in sql server database and display image in datalist in asp.net
Click on image to enlarge
Introduction: In this article i am going to share the code to upload the image through file upload control and save/store the image in binary form in Sql server database and then read/retrieve the record along with image and display in DataList data control in asp.net using both C# and VB languages.


Description:  Basically you will learn the following through this article.
  • How to upload image through asp.net fileupload control in folder?
  • How to store uploaded image in binary format in Sql server database?
  • How to read/retrieve the image stored in binary form from the sql server database and show in DataList data control?

I have created a demo web page from where i will insert book record like Book name, its author, publisher, price and Book picture. As soon as a new record will be inserted it will get binded to the Datalist control as show in the sample image shown above.

Implementation: Let's create a demo website page to insert data including image in database and retrieve that data and fill in datalist data controls.

First of all create a table "BookDetails" in Sql server Database with the columns and data type as shown in below:

Column Name
Data Type
BookId
Int (Primary key. Set Is Identity=true)
BookName
varchar(100)
Author
varchar(100)
Publisher
varchar(100)
Price
decimal(18, 2)
BookPic
Varbinary(MAX)
BookPicName
varchar(100)
BookPicPath
varchar(200)

Then create the following stored procedure in Sql server database
  • Stored procedure to save Book record in Database

CREATE PROCEDURE [dbo].[InsertBookDetails_Sp]
                @BookName                   VARCHAR(100),
                @Author                          VARCHAR(100),
                @Publisher                      VARCHAR(100),
                @Price                              DECIMAL(18,2),             
                @BookPic                         VARBINARY(MAX)=NULL,
                @BookPicName               VARCHAR(100)=NULL,
                @BookPicPath                 VARCHAR(200)=NULL
AS
BEGIN 
                SET NOCOUNT ON;
                INSERT INTO BookDetails(BookName,Author,Publisher,Price,BookPic,BookPicName,BookPicPath)
    VALUES (@BookName,@Author,@Publisher,@Price,@BookPic,@BookPicName,@BookPicPath)
END
  • Stored procedure to fetch the Book record from Database

CREATE PROCEDURE [dbo].[GetBookDetails_Sp]         
AS
BEGIN 
                SET NOCOUNT ON;
                SELECT * FROM BookDetails   
END
  • In the web.config file create the connection string to connect our asp.net website to Sql server database as:

<connectionStrings>
    <add name="conStr" connectionString="Data Source=LALIT;Initial Catalog=Books_DB;Integrated Security=True"/>
  </connectionStrings>

Note: Replace the Data Source and Initial catalog as per your application

Asp.Net C# Section:

Create a folder in the root directory of the project and name it "BookPictures". Uploaded Book images will be stored in this folder and the path will be saved into the database so that we can track the image from the folder if required and this image will be converted to binary format and stored in database.
  • In the <Form> tag of the Asp.Net design page (Default.aspx) create the page as:

<fieldset style="width:490px;">
    <legend>Save and retrieve image from database</legend>
    <table>
    <tr><td>Book Name: </td><td><asp:TextBox ID="txtBookName" runat="server"></asp:TextBox></td>
        </tr>
    <tr><td>Author: </td><td><asp:TextBox ID="txtAuthor" runat="server"></asp:TextBox></td></tr>
    <tr><td>Publisher: </td><td><asp:TextBox ID="txtPublisher" runat="server"></asp:TextBox></td></tr>
    <tr><td>Price: </td><td><asp:TextBox ID="txtPrice" runat="server"></asp:TextBox></td></tr>
    <tr><td>Book Picture: </td><td>
        <asp:FileUpload ID="flupBookPic" runat="server" /></td></tr>
        <tr><td></td><td>
            <asp:Button ID="btnSave" runat="server" Text="Save" onclick="btnSave_Click" />
            <asp:Button ID="btnCancel" runat="server" onclick="btnCancel_Click"
                Text="Cancel" />
            </td></tr>
        <tr><td>&nbsp;</td><td>
            <asp:Label ID="lblStatus" runat="server"></asp:Label>           
            </td></tr>
       
        <tr><td colspan="2">
            <asp:DataList ID="dlBooks" runat="server" RepeatColumns="2" RepeatDirection="Horizontal" >
            <ItemTemplate>
            <table>
            <tr style="border:1 solid #888;">
            <td>
            <asp:Image ID="ImgBookPic" runat="server" Height="80px" Width="80px" /><br />
            <asp:Label ID="lblBookPicName" runat="server" Text='<%#Eval("BookPicName") %>'></asp:Label>
            </td>
            <td valign="top">
            <asp:Label ID="lblBookName" runat="server" Text='<%#Eval("BookName") %>'></asp:Label><br />
            <asp:Label ID="lblAuthor" runat="server" Text='<%#Eval("Author") %>'></asp:Label><br />
            <asp:Label ID="lblPublisher" runat="server" Text='<%#Eval("Publisher") %>'></asp:Label><br />
            <asp:Label ID="lblPrice" runat="server" Text='<%#Eval("Price") %>'></asp:Label>
            </td>
            </tr>
            </table>
            </ItemTemplate>
            </asp:DataList>
            </td></tr>
    </table>  
    </fieldset>

Asp.Net C# Code to store image in binary format in database, then retrieve and show in DataList
  • In the code behind file(default.aspx.cs) write the code as:

 using System.Data;
using System.Data.SqlClient;
using System.Configuration;
using System.IO;
  
public partial class Default : System.Web.UI.Page
{
    SqlConnection con = new SqlConnection(ConfigurationManager.ConnectionStrings["conStr"].ConnectionString);
    protected void Page_Load(object sender, EventArgs e)
    {
        if (!Page.IsPostBack)
        {
            BindDataList();
        }
    }

  protected void btnSave_Click(object sender, EventArgs e)
    {
        string fileName = string.Empty;
        string filePath = string.Empty;
        string getPath = string.Empty;
        string pathToStore = string.Empty;
        string finalPathToStore = string.Empty;
        Byte[] bytes;
        FileStream fs;
        BinaryReader br;
       
        SqlCommand cmd = new SqlCommand("InsertBookDetails_Sp", con);
        cmd.CommandType = CommandType.StoredProcedure;
        cmd.Parameters.AddWithValue("@BookName", txtBookName.Text.Trim());
        cmd.Parameters.AddWithValue("@Author", txtAuthor.Text.Trim());
        cmd.Parameters.AddWithValue("@Publisher", txtPublisher.Text.Trim());
        cmd.Parameters.AddWithValue("@Price", Convert.ToDecimal(txtPrice.Text));

        try
        {
            if (flupBookPic.HasFile)
            {
                fileName = flupBookPic.FileName;
                filePath = Server.MapPath("BookPictures/" + System.Guid.NewGuid() + fileName);
                flupBookPic.SaveAs(filePath);

                fs = new FileStream(filePath, FileMode.Open, FileAccess.Read);
                br = new BinaryReader(fs);
                bytes = br.ReadBytes(Convert.ToInt32(fs.Length));
                br.Close();
                fs.Close();

                cmd.Parameters.AddWithValue("@BookPic", bytes);
                cmd.Parameters.AddWithValue("@BookPicName", fileName);
                int getPos = filePath.LastIndexOf("\\");
                int len = filePath.Length;
                getPath = filePath.Substring(getPos, len - getPos);
                pathToStore = getPath.Remove(0, 1);
                finalPathToStore = "~/BookPictures/" + pathToStore;
                cmd.Parameters.AddWithValue("@BookPicPath", finalPathToStore);
            }
            con.Open();
            cmd.ExecuteNonQuery();
            lblStatus.Text = "Book Record saved successfully";
            lblStatus.ForeColor = System.Drawing.Color.Green;
            ClearControls();
            BindDataList();
        }
        catch (Exception)
        {
            lblStatus.Text = "Book Record could not be saved";
            lblStatus.ForeColor = System.Drawing.Color.Red;
        }
        finally
        {
            con.Close();
            cmd.Dispose();
            fileName = null;
            filePath = null;
            fs = null;
            br = null;
            getPath = null;
            pathToStore = null;
            finalPathToStore = null;
        }
    }
   
    private void BindDataList()
    {
        DataTable dt = new DataTable();
        byte[] bytes;
        string base64String = string.Empty;
        SqlCommand cmd = new SqlCommand("GetBookDetails_Sp", con);
        cmd.CommandType = CommandType.StoredProcedure;
        SqlDataAdapter adp = new SqlDataAdapter(cmd);
        try
        {
            adp.Fill(dt);
            if (dt.Rows.Count > 0)
            {
                dlBooks.DataSource = dt;
                dlBooks.DataBind();

                for (int i = 0; i < dt.Rows.Count; i++)
                {
                    if (!string.IsNullOrEmpty(Convert.ToString(dt.Rows[i]["BookPic"])))
                    {
                        bytes = (byte[])dt.Rows[i]["BookPic"];
                        base64String = Convert.ToBase64String(bytes, 0, bytes.Length);

                        Image img = (Image)dlBooks.Controls[i].FindControl("ImgBookPic");                       
                        img.ImageUrl = "data:image/png;base64," + base64String;
                    }
                }
           }
        }
        catch (Exception)
        {
            lblStatus.Text = "Book record could not be retrieved";
            lblStatus.ForeColor = System.Drawing.Color.Red;
        }
        finally
        {
            con.Close();
            dt.Clear();
            dt.Dispose();
            cmd.Dispose();
            bytes = null;
            base64String = null;
        }
    }

    protected void btnCancel_Click(object sender, EventArgs e)
    {
        ClearControls();
        lblStatus.Text = string.Empty;
    }

    private void ClearControls()
    {
        txtAuthor.Text = string.Empty;
        txtBookName.Text = string.Empty;
        txtPrice.Text = string.Empty;
        txtPublisher.Text = string.Empty;      
        txtBookName.Focus();
    }

Asp.Net VB Section:

Create a folder in the root directory of the project and name it "BookPictures". Uploaded Book images will be stored in this folder and the path will be saved into the database and this image will be converted to binary format and stored in database.
  • Design the page as described in the Asp.Net C# Section above but replace the lines    

 <asp:Button ID="btnSave" runat="server" Text="Save" onclick="btnSave_Click" />
<asp:Button ID="btnCancel" runat="server" onclick="btnCancel_Click" Text="Cancel" />

With the following lines:
<asp:Button ID="btnSave" runat="server" Text="Save" />
<asp:Button ID="btnCancel" runat="server" Text="Cancel" />

Asp.Net VB Code to store image in binary format in database, then retrieve and show in DataList
  • In the code behind file(default.aspx.vb) write the code as:

Imports System.Data
Imports System.Data.SqlClient
Imports System.Configuration
Imports System.IO

Partial Class Default
    Inherits System.Web.UI.Page

    Dim con As New SqlConnection(ConfigurationManager.ConnectionStrings("conStr").ConnectionString)

    Protected Sub Page_Load(sender As Object, e As System.EventArgs) Handles Me.Load
        If Not Page.IsPostBack Then
            BindDataList()
        End If
    End Sub

Protected Sub btnSave_Click(sender As Object, e As EventArgs)
        Dim fileName As String = String.Empty
        Dim filePath As String = String.Empty
        Dim getPath As String = String.Empty
        Dim pathToStore As String = String.Empty
        Dim finalPathToStore As String = String.Empty
        Dim bytes As [Byte]()
        Dim fs As FileStream
        Dim br As BinaryReader

        Dim cmd As New SqlCommand("InsertBookDetails_Sp", con)
        cmd.CommandType = CommandType.StoredProcedure
        cmd.Parameters.AddWithValue("@BookName", txtBookName.Text.Trim())
        cmd.Parameters.AddWithValue("@Author", txtAuthor.Text.Trim())
        cmd.Parameters.AddWithValue("@Publisher", txtPublisher.Text.Trim())
        cmd.Parameters.AddWithValue("@Price", Convert.ToDecimal(txtPrice.Text))

        Try
            If flupBookPic.HasFile Then
                fileName = flupBookPic.FileName
                filePath = Server.MapPath("BookPictures/" & Convert.ToString(System.Guid.NewGuid()) & fileName)
                flupBookPic.SaveAs(filePath)

                fs = New FileStream(filePath, FileMode.Open, FileAccess.Read)
                br = New BinaryReader(fs)
                bytes = br.ReadBytes(Convert.ToInt32(fs.Length))
                br.Close()
                fs.Close()

                cmd.Parameters.AddWithValue("@BookPic", bytes)
                cmd.Parameters.AddWithValue("@BookPicName", fileName)
                Dim getPos As Integer = filePath.LastIndexOf("\")
                Dim len As Integer = filePath.Length
                getPath = filePath.Substring(getPos, len - getPos)
                pathToStore = getPath.Remove(0, 1)
                finalPathToStore = "~/BookPictures/" & pathToStore
                cmd.Parameters.AddWithValue("@BookPicPath", finalPathToStore)
            End If
            con.Open()
            cmd.ExecuteNonQuery()
            lblStatus.Text = "Book Record saved successfully"
            lblStatus.ForeColor = System.Drawing.Color.Green
            ClearControls()
            BindDataList()
        Catch generatedExceptionName As Exception
            lblStatus.Text = "Book Record could not be saved"
            lblStatus.ForeColor = System.Drawing.Color.Red
        Finally
            con.Close()
            cmd.Dispose()
            fileName = Nothing
            filePath = Nothing
            fs = Nothing
            br = Nothing
            getPath = Nothing
            pathToStore = Nothing
            finalPathToStore = Nothing
        End Try
    End Sub

    Private Sub BindDataList()
        Dim dt As New DataTable()
        Dim bytes As Byte()
        Dim base64String As String = String.Empty
        Dim cmd As New SqlCommand("GetBookDetails_Sp", con)
        cmd.CommandType = CommandType.StoredProcedure
        Dim adp As New SqlDataAdapter(cmd)
        Try
            adp.Fill(dt)
            If dt.Rows.Count > 0 Then
                dlBooks.DataSource = dt
                dlBooks.DataBind()

                For i As Integer = 0 To dt.Rows.Count - 1
                    If Not String.IsNullOrEmpty(Convert.ToString(dt.Rows(i)("BookPic"))) Then
                        bytes = DirectCast(dt.Rows(i)("BookPic"), Byte())
                        base64String = Convert.ToBase64String(bytes, 0, bytes.Length)

                        Dim img As Image = DirectCast(dlBooks.Controls(i).FindControl("ImgBookPic"), Image)

                        img.ImageUrl = "data:image/png;base64," & base64String
                    End If
               Next
            End If
        Catch generatedExceptionName As Exception
            lblStatus.Text = "Book record could not be retrieved"
            lblStatus.ForeColor = System.Drawing.Color.Red
        Finally
            con.Close()
            dt.Clear()
            dt.Dispose()
            cmd.Dispose()
            bytes = Nothing
            base64String = Nothing
        End Try
    End Sub

    Protected Sub btnCancel_Click(sender As Object, e As EventArgs)
        ClearControls()
        lblStatus.Text = String.Empty
    End Sub

    Private Sub ClearControls()
        txtAuthor.Text = String.Empty
        txtBookName.Text = String.Empty
        txtPrice.Text = String.Empty
        txtPublisher.Text = String.Empty
        txtBookName.Focus()
    End Sub


 Now over to you:
" I hope you have got the way to upload image in folder and store image path in database and retrieve the image path from sql server database and display in DataList using asp.net and If you like my work; you can appreciate by leaving your comments, hitting Facebook like button, following on Google+, Twitter, Linked in and Pinterest, stumbling my posts on stumble upon and subscribing for receiving free updates directly to your inbox . Stay tuned and stay connected for more technical updates."
Previous
Next Post »

1 comments:

Click here for comments
Anonymous
admin
January 04, 2015 ×

Thanks buddy.............

Congrats bro Anonymous you got PERTAMAX...! hehehehe...
Reply
avatar

If you have any question about any post, Feel free to ask.You can simply drop a comment below post or contact via Contact Us form. Your feedback and suggestions will be highly appreciated. Also try to leave comments from your account not from the anonymous account so that i can respond to you easily..