web-dev-qa-db-ja.com

datagridviewのすべてのデータを一度にデータベースに挿入します

私は、さまざまなアクションとユーザーのデータ操作によって作成されたdatagridviewを持っています。 gridviewのすべてのデータを一度にデータベースに挿入したいのですが、次のようなコードを試すことができます。

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

しかし、レコードが挿入されるたびに新しい接続を作成することは公平でしょうか?データグリッドには多くの行が含まれている可能性があります...すべてのデータを一度にサーバーに送信し、SQL内でループしてすべてのデータを挿入する方法はありますか?

6
Manish Gautam

Forループを移動する場合、複数の接続を行う必要はありません。コードブロックをすばやく編集するだけです(決して完全に正しいわけではありません)。

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

複数のSQLコマンドを一度に実行する場合は、次のリンクを参照してください。 単一のSqlCommand内の複数のステートメント

16
CM Kanode

最善の方法は、Commandsオブジェクトを使用するのではなく TableAdapters を使用することだと思います。そのUpdateメソッドは、DatasetまたはDataTable内で行われたすべての変更(Updates、InsertsおよびDeletes)をデータベースに直接送信します。通常、DataGridViewを使用する場合は、DatatablesやDatasetsなどのDataSourceと対話できるBindingSourceにバインドします。

このように機能する場合、境界のあるDataGridViewで次のように実行できます。

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

「customersBindingSource」は、DataGridViewのDataSourceです。

アダプターのUpdateメソッドは、単一のデータテーブルを更新し、テーブル内の各データ行のRowStateに基づいて正しいコマンド(INSERT、UPDATE、またはDELETE)を実行します。

差出人: https://msdn.Microsoft.com/en-us/library/ms171933.aspx

したがって、DatagridView内で行われた変更は、Updateメソッドを使用するときにデータベースに反映されます。

TableAdaptersの詳細: https://msdn.Microsoft.com/en-us/library/bz9tthwx.aspx

2
WhySoSerious

以下があなたを助けることができるかどうか見てください

クラス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

終了クラス

1
P. nganga
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

構文エラーがあります次の構文を試してください:

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

接続を一度開くだけで同じことができます。このようなもの。

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

  }

また、特定のシナリオによっては、グリッドをデータベースにバインドすることを検討する必要があります。これにより、手作業の量が大幅に削減されます。 http://www.switchonthecode.com/tutorials/csharp-tutorial-binding-a-datagridview-to-a-database

0
InspiredBy