Manish Gautam
Manish Gautam

Reputation: 516

Insert all data of a datagridview to database at once

I have a datagridview which is created by various action and user's manipulation of data. I want to insert all the data of the gridview to the database at once, I know I could try a code similar to this:

for(int i=0; i< dataGridView1.Rows.Count;i++)
    {
        string StrQuery= @"INSERT INTO tableName VALUES (" + dataGridView1.Rows[i].Cells["ColumnName"].Value +", " + dataGridView1.Rows[i].Cells["ColumnName"].Value +");";

      try
      {
        using (SqlConnection conn = new SqlConnection(ConnString))
        {
            using (SqlCommand comm = new SqlCommand(StrQuery, conn))
            {
                conn.Open();
                comm.ExecuteNonQuery();
            }
        }
      }

But will it be fair to create a new connection every time a record is inserted? The datagrid may contain many rows... Is there any way to take off all the data to the server at once and loop inside in sql to insert all the data?

Upvotes: 9

Views: 142684

Answers (9)

akash rehmat
akash rehmat

Reputation: 3

try
{
    string barcode = "", name = "";
    int qty = 0, unitprice = 0;
    for (int i = 0; i < dataGridView1.Rows.Count; i++)
    {
       barcode= dataGridView1.Rows[i].Cells["barcode"].Value.ToString();
        name = dataGridView1.Rows[i].Cells["name"].Value.ToString();
        qty = Int32.TryParse(dataGridView1.Rows[i].Cells["stkqty"].Value.ToString(),out qty)?qty:0;
        unitprice = Int32.TryParse(dataGridView1.Rows[i].Cells["unitprice"].Value.ToString(),out unitprice)?unitprice:0;
        SqlConnection conn = new SqlConnection(urls);
        conn.Open();
        String insertquery = "INSERT INTO Stock_Sale_Record(invoiceno,barcode,saleqty,proname,saleprice,duedate) VALUES (@invoiceno,@barcode,@saleqty,@proname,@saleprice,@duedate)";
        SqlCommand insertcommand = new SqlCommand(insertquery, conn);
        insertcommand.Parameters.AddWithValue("@invoiceno", invoicenolabel.Text.ToString());
        insertcommand.Parameters.AddWithValue("@barcode", barcode);
        insertcommand.Parameters.AddWithValue("@saleqty", qty);
        insertcommand.Parameters.AddWithValue("@proname", name);
        insertcommand.Parameters.AddWithValue("@saleprice", unitprice);
        insertcommand.Parameters.AddWithValue("@duedate", duedatetxt.Value.Date);
        insertcommand.ExecuteNonQuery();
        conn.Close();
    }
}
catch (Exception ex)
{
    MessageBox.Show(""+ex.Message);
}

Upvotes: 0

akash rehmat
akash rehmat

Reputation: 3

try {

            string barcode = "", name = "";
            int qty = 0, unitprice = 0;
            for (int i = 0; i < dataGridView1.Rows.Count; i++)
            {
               barcode= dataGridView1.Rows[i].Cells["barcode"].Value.ToString();
                name = dataGridView1.Rows[i].Cells["name"].Value.ToString();
                qty = Int32.TryParse(dataGridView1.Rows[i].Cells["stkqty"].Value.ToString(),out qty)?qty:0;
                unitprice = Int32.TryParse(dataGridView1.Rows[i].Cells["unitprice"].Value.ToString(),out unitprice)?unitprice:0;
                SqlConnection conn = new SqlConnection(urls);
                conn.Open();
                String insertquery = "INSERT INTO Stock_Sale_Record(invoiceno,barcode,saleqty,proname,saleprice,duedate) VALUES (@invoiceno,@barcode,@saleqty,@proname,@saleprice,@duedate)";
                SqlCommand insertcommand = new SqlCommand(insertquery, conn);
                insertcommand.Parameters.AddWithValue("@invoiceno", invoicenolabel.Text.ToString());
                insertcommand.Parameters.AddWithValue("@barcode", barcode);
                insertcommand.Parameters.AddWithValue("@saleqty", qty);
                insertcommand.Parameters.AddWithValue("@proname", name);
                insertcommand.Parameters.AddWithValue("@saleprice", unitprice);
                insertcommand.Parameters.AddWithValue("@duedate", duedatetxt.Value.Date);
                insertcommand.ExecuteNonQuery();
                conn.Close();
            }
          


        }
        catch (Exception ex)
        {
            MessageBox.Show(""+ex.Message);
        }

Upvotes: 0

Monzur
Monzur

Reputation: 1435

Try this 100% Working Code

string SQL = "", tableName = "tableName";
for (int i = 0; i < dataGridView1.Rows.Count; i++)
{
    SQL = @"INSERT INTO " + tableName + " VALUES (";
    for (int col = 0; col < dataGridView1.ColumnCount; col++)
    {
        string data = "";
        if (dataGridView1.Rows[i].Cells[col].Value != null)
        {
            data = dataGridView1.Rows[i].Cells[col].Value.ToString();
        }
        SQL += "'" + data.Trim() + "'";
        if (col < dataGridView1.ColumnCount - 1)
        {
            SQL += ",";
        }
    }
    SQL += ")";
    string finalSQL = SQL;
    //INSERT to DB the finalSQL
}

Your Data is ready now Insert the finalSQL in your database with your connection

Upvotes: 1

P. nganga
P. nganga

Reputation: 13

Please see if below can help you

Class Post_Sales

Public Shared Sub Post_sales()

    Dim ITM_ID As Integer

    Dim SLS_QTY As Integer

    Dim SLS_PRC As Double

    Dim SLS_AMT As Double

    Dim DSPL_RCT As String

    Dim TAX_CODE As Integer


    'Format the current  date and send it to a textbox
    Form1.TextBox6.Text = System.DateTime.Now.ToString((" yyyy-MM-dd"))

    'Open Connection

    Dim con As New SqlConnection("Initial Catalog=Your Database here;Data source=.;Network Library=DBMSSOCN;User ID=sa;Password=")

    con.Open()

    'Insert Records into the database


    For Each rw As DataGridViewRow In Form1.DataGridView1.Rows

        ITM_ID = rw.Cells("Column1").Value
        DSPL_RCT = rw.Cells("Column2").Value
        SLS_QTY = rw.Cells("Column3").Value
        SLS_PRC = rw.Cells("Column4").Value
        SLS_AMT = rw.Cells("Column5").Value
        TAX_CODE = rw.Cells("Column6").Value

        Dim cmd As New SqlCommand("INSERT INTO DAY_PLUSALES (DT,ITM_ID,DSPL_RCT,SLS_QTY,SLS_PRC,SLS_AMT,TAX_CODE) values ('" & Form1.TextBox6.Text & "','" & ITM_ID & "','" & DSPL_RCT & "','" & SLS_QTY & "','" & SLS_PRC & "','" & SLS_AMT & "','" & TAX_CODE & "')", con)

        cmd.ExecuteNonQuery()

    Next

    con.Close()

    MessageBox.Show("Records Added to the SQL Database successfully!", "Records Updated ")

End Sub

End Class

Upvotes: 1

CM Kanode
CM Kanode

Reputation: 1436

If you move your for loop, you won't have to make multiple connections. Just a quick edit to your code block (by no means completely correct):

string StrQuery;
try
{
    using (SqlConnection conn = new SqlConnection(ConnString))
    {
        using (SqlCommand comm = new SqlCommand())
        {
            comm.Connection = conn;
            conn.Open();
            for(int i=0; i< dataGridView1.Rows.Count;i++)
            {
                StrQuery= @"INSERT INTO tableName VALUES (" 
                    + dataGridView1.Rows[i].Cells["ColumnName"].Text+", " 
                    + dataGridView1.Rows[i].Cells["ColumnName"].Text+");";
                comm.CommandText = StrQuery;
                comm.ExecuteNonQuery();
            }
        }
    }
}

As to executing multiple SQL commands at once, please look at this link: Multiple statements in single SqlCommand

Upvotes: 20

Alberto Juliao O.
Alberto Juliao O.

Reputation: 2015

I think the best way is by using TableAdapters rather than using Commands objects, its Update method sends all changes mades (Updates,Inserts and Deletes) inside a Dataset or DataTable straight TO the database. Usually when using a DataGridView you bind to a BindingSource which lets you interact with a DataSource such as Datatables or Datasets.

If you work like this, then on your bounded DataGridView you can just do:

this.customersBindingSource.EndEdit();
this.myTableAdapter.Update(this.myDataSet.Customers);

The 'customersBindingSource' is the DataSource of the DataGridView.

The adapter's Update method will update a single data table and execute the correct command (INSERT, UPDATE, or DELETE) based on the RowState of each data row in the table.

From: https://msdn.microsoft.com/en-us/library/ms171933.aspx

So any changes made inside the DatagridView will be reflected on the Database when using the Update method.

More about TableAdapters: https://msdn.microsoft.com/en-us/library/bz9tthwx.aspx

Upvotes: 4

Suresh
Suresh

Reputation: 23

You have a syntax error Please try the following syntax as given below:

string StrQuery="INSERT INTO tableName VALUES ('" + dataGridView1.Rows[i].Cells[0].Value + "',' " + dataGridView1.Rows[i].Cells[1].Value + "', '" + dataGridView1.Rows[i].Cells[2].Value + "', '" + dataGridView1.Rows[i].Cells[3].Value + "',' " + dataGridView1.Rows[i].Cells[4].Value + "')";

Upvotes: 0

siddhi
siddhi

Reputation: 7

for (int i = 0; i < dataGridView2.Rows.Count; i++)
{
SqlConnection con = new SqlConnection("Data Source=.;Initial Catalog=ID_Proof;Integrated Security=True");
                        SqlCommand cmd = new SqlCommand("INSERT INTO Restaurant (Customer_Name,Quantity,Price,Category,Subcategory,Item,Room_No,Tax,Service_Charge,Service_Tax,Order_Time) values (@customer,@quantity,@price,@category,@subcategory,@item,@roomno,@tax,@servicecharge,@sertax,@ordertime)", con);
                        cmd.Parameters.AddWithValue("@customer",dataGridView2.Rows[i].Cells[0].Value);
                        cmd.Parameters.AddWithValue("@quantity",dataGridView2.Rows[i].Cells[1].Value);
                        cmd.Parameters.AddWithValue("@price",dataGridView2.Rows[i].Cells[2].Value);
                        cmd.Parameters.AddWithValue("@category",dataGridView2.Rows[i].Cells[3].Value);
                        cmd.Parameters.AddWithValue("@subcategory",dataGridView2.Rows[i].Cells[4].Value);
                        cmd.Parameters.AddWithValue("@item",dataGridView2.Rows[i].Cells[5].Value);
                        cmd.Parameters.AddWithValue("@roomno",dataGridView2.Rows[i].Cells[6].Value);
                        cmd.Parameters.AddWithValue("@tax",dataGridView2.Rows[i].Cells[7].Value);
                        cmd.Parameters.AddWithValue("@servicecharge",dataGridView2.Rows[i].Cells[8].Value);
                        cmd.Parameters.AddWithValue("@sertax",dataGridView2.Rows[i].Cells[9].Value);
                        cmd.Parameters.AddWithValue("@ordertime",dataGridView2.Rows[i].Cells[10].Value);
                        con.Open();
                        cmd.ExecuteNonQuery();
                        con.Close();
                        MessageBox.Show("Added successfully!");

Upvotes: -2

InspiredBy
InspiredBy

Reputation: 4320

You can do the same thing with the connection opened just once. Something like this.

for(int i=0; i< dataGridView1.Rows.Count;i++)
  {
    string StrQuery= @"INSERT INTO tableName VALUES (" + dataGridView1.Rows[i].Cells["ColumnName"].Value +", " + dataGridView1.Rows[i].Cells["ColumnName"].Value +");";

  try
  {
      SqlConnection conn = new SqlConnection();
      conn.Open();

          using (SqlCommand comm = new SqlCommand(StrQuery, conn))
          {
              comm.ExecuteNonQuery();
          }
      conn.Close();

  }

Also, depending on your specific scenario you may want to look into binding the grid to the database. That would reduce the amount of manual work greatly: http://www.switchonthecode.com/tutorials/csharp-tutorial-binding-a-datagridview-to-a-database

Upvotes: 0

Related Questions