web-dev-qa-db-fra.com

Insérer toutes les données d'un datagridview dans la base de données à la fois

J'ai un datagridview qui est créé par diverses actions et par la manipulation des données par l'utilisateur ..__ Je veux insérer toutes les données du gridview dans la base de données en même temps, je sais que je pourrais essayer un code similaire à ceci: 

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();
            }
        }
      }

Mais sera-t-il juste de créer une nouvelle connexion chaque fois qu'un enregistrement est inséré? La grille de données peut contenir de nombreuses lignes ... Existe-t-il un moyen d'extraire simultanément toutes les données du serveur et de les insérer dans SQL pour insérer toutes les données?

6
Manish Gautam

Si vous déplacez votre boucle for, vous n’aurez pas à établir plusieurs connexions. Juste une modification rapide de votre bloc de code (en aucun cas complètement 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();
            }
        }
    }
}

Pour exécuter plusieurs commandes SQL à la fois, veuillez consulter le lien suivant: Plusieurs instructions dans une seule commande SqlCommand

16
CM Kanode

S'il vous plaît voir si ci-dessous peut vous aider

Classe 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

Classe de fin

1
P. nganga

Je pense que le meilleur moyen est d'utiliser TableAdapters plutôt que d'utiliser des objets Commands, sa méthode de mise à jour envoie toutes les modifications apportées (mises à jour, insertions et suppressions) dans un jeu de données ou une table de données directement à la base de données. Lorsque vous utilisez un DataGridView, vous vous connectez généralement à un BindingSource qui vous permet d'interagir avec un DataSource tel que Datatables ou Datasets. 

Si vous travaillez comme cela, alors sur votre DataGridView lié, vous pouvez simplement faire: 

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

'CustomersBindingSource' est la source de données de DataGridView. 

La méthode Update de l'adaptateur mettra à jour un seul tableau de données et exécuter la commande correcte (INSERT, UPDATE ou DELETE) en fonction du fichier RowState de chaque ligne de données dans la table.

De: https://msdn.Microsoft.com/en-us/library/ms171933.aspx

Ainsi, toutes les modifications apportées à l'intérieur de DatagridView seront répercutées dans la base de données lors de l'utilisation de la méthode Update.

Plus d'infos sur TableAdapters: https://msdn.Microsoft.com/en-us/library/bz9tthwx.aspx

1
WhySoSerious
private void Ledger_entryForm_FormClosing(object sender, FormClosingEventArgs e)
    { 
            SqlConnection con = new SqlConnection(@"Data Source=DESKTOP-UR0T08C;Initial Catalog=Small_Accounting;Integrated Security=True");
            for (int i = 0; i < LedgerEntryDataGridView.Rows.Count; i++)
            {
                SqlCommand cmd = new SqlCommand(@"INSERT INTO LedgerEntry (Date, Account_Type,  Account,  Debit,  Credit,   Descripation, Ref)VALUES('" + LedgerEntryDataGridView.Rows[i].Cells[1].Value + "','" + LedgerEntryDataGridView.Rows[i].Cells[2].Value + "','" + LedgerEntryDataGridView.Rows[i].Cells[3].Value + "','" + LedgerEntryDataGridView.Rows[i].Cells[4].Value + "','" + LedgerEntryDataGridView.Rows[i].Cells[5].Value + "','" + LedgerEntryDataGridView.Rows[i].Cells[6].Value + "','" + LedgerEntryDataGridView.Rows[i].Cells[7].Value + "')", con);
                con.Open();
                cmd.ExecuteNonQuery();
            con.Close();
            }
        }

    }
0
Dhanraj Kumar

Vous avez une erreur de syntaxe Veuillez essayer la syntaxe suivante:

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 + "')";
0
Suresh

Vous pouvez faire la même chose avec la connexion ouverte une seule fois. Quelque chose comme ça.

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();

  }

En outre, en fonction de votre scénario spécifique, vous pouvez envisager de lier la grille à la base de données. Cela réduirait considérablement la quantité de travail manuel: http://www.switchonthecode.com/tutorials/csharp-tutorial-binding-a-datagridview-to-a-database

0
InspiredBy