私は、さまざまなアクションとユーザーのデータ操作によって作成された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内でループしてすべてのデータを挿入する方法はありますか?
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内の複数のステートメント
最善の方法は、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
以下があなたを助けることができるかどうか見てください
クラス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
終了クラス
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();
}
}
}
構文エラーがあります次の構文を試してください:
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 + "')";
接続を一度開くだけで同じことができます。このようなもの。
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