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?
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
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
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
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();
}
}
}
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 + "')";
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