9

我有一个由各种操作和用户对数据的操作创建的 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中循环以插入所有数据?

4

8 回答 8

20

如果你移动你的 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 命令,请看这个链接: Multiple statements in single SqlCommand

于 2012-05-11T18:26:18.140 回答
4

我认为最好的方法是使用TableAdapters而不是使用 Commands 对象,它的 Update 方法将 Dataset 或 DataTable 中的所有更改(更新、插入和删除)直接发送到数据库。通常在使用 DataGridView 时,您绑定到 BindingSource,它允许您与 DataSource(如 Datatables 或 Datasets)进行交互。

如果你像这样工作,那么在你的有界 DataGridView 上你可以这样做:

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

“customersBindingSource”是 DataGridView 的数据源。

适配器的 Update 方法将更新单个数据表,并根据表中每个数据行的 RowState 执行正确的命令(INSERT、UPDATE 或 DELETE)。

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

因此,在使用 Update 方法时,在 DatagridView 中所做的任何更改都将反映在数据库中。

有关 TableAdapters 的更多信息:https ://msdn.microsoft.com/en-us/library/bz9tthwx.aspx

于 2015-08-01T17:09:11.750 回答
1

请看下面是否可以帮助你

类 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

结束类

于 2016-11-03T06:01:34.663 回答
0

您可以对只打开一次的连接执行相同的操作。像这样的东西。

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

于 2012-05-11T18:20:49.737 回答
0

您有语法错误请尝试以下语法:

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 + "')";
于 2013-04-24T07:37:19.810 回答
0

试试这个 100% 工作代码

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
}

您的数据现在已准备好使用您的连接将 finalSQL 插入数据库中

于 2020-10-21T11:16:38.957 回答
0
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);
}
于 2021-11-03T08:19:43.150 回答
-2
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!");
于 2012-12-27T11:40:43.127 回答