Вставьте ADO.Net DataTable в таблицу SQL

Текущее решение, которое я реализовал, ужасно!

Я использую for... loop для вставки записей из таблицы данных ADO.NET в таблицу SQL.

Я хотел бы сразу вставить таблицу данных в таблицу SQL, не повторяя...

Это возможно, или я слишком много прошу?


person OrElse    schedule 18.03.2010    source источник
comment
используйте dataAdapter, он сделает это сам.   -  person garik    schedule 18.03.2010


Ответы (4)



Я думаю, вы ищете SQLBulkCopy.

person ryanulit    schedule 18.03.2010
comment
Ссылка больше не действительна - person Noel; 07.03.2019

Вы также можете попробовать следующий метод.

private void button1_Click(object sender, EventArgs e)
{
    tabevent();
    DataSet ds = new DataSet();
    DataTable table = new DataTable("DataFromDGV");

    ds.Tables.Add(table);

    foreach (DataGridViewColumn col in dataGridView1.Columns)
        table.Columns.Add(col.HeaderText, typeof(string));

    foreach (DataGridViewRow row in dataGridView1.Rows)
    {
        table.Rows.Add(row);
        foreach (DataGridViewCell cell in row.Cells)
        {

                    table.Rows[row.Index][cell.ColumnIndex] = cell.Value;
                }
            }

            // DataTable ds1changes = ds1.Tables[0].GetChanges();
            if (table != null)
            {
                SqlConnection dbConn = new SqlConnection(@"Data Source=wsswe;Initial Catalog=vb;User ID=sa;Password=12345");
                SqlCommand dbCommand = new SqlCommand();
                dbCommand.Connection = dbConn;
                foreach (DataRow row in table.Rows)
                {
                    if (row["quantity"] != null && row["amount"]!=null && row["itemname"]!=null)
                    {
                        if (row["amount"].ToString() != string.Empty)
                        {
                            dbCommand.CommandText =
                            "INSERT INTO Bill" +
                            "(Itemname,Participants,rate,Quantity,Amount)" +
                            "SELECT '" + Convert.ToString(row["itemname"]) + "' AS Itemname,'" + Convert.ToString(row["Partcipants"]) + "' AS Participants,'" + Convert.ToInt32(row["rate"]) + "' AS rate,'" +
                             Convert.ToInt32(row["quantity"]) + "' AS Quantity,'" + Convert.ToInt32(row["amount"]) + "' AS Amount";


                            dbCommand.Connection.Open();
                            dbCommand.ExecuteNonQuery();

                            if (dbCommand.Connection.State != ConnectionState.Closed)
                            {
                                dbCommand.Connection.Close();
                            }

                            MessageBox.Show("inserted");

                        }
                    }
                }
            }
        } 
person Rosh    schedule 27.03.2012

SqlBulkCopy самое простое решение.

        using (SqlConnection dbConn = new SqlConnection(connectionString))
        {
            dbConn.Open();
            using (SqlBulkCopy bulkCopy = new SqlBulkCopy(dbConn))
            {
                bulkCopy.DestinationTableName =
                    "dbo.MyTable";
                try
                {
                    bulkCopy.WriteToServer(myDataTable, DataRowState.Added);
                }
                catch (Exception ex)
                {
                    myLogger.Error("Fail to upload session data. ", ex);
                }
            }
        }

Вы можете создать SqlBulkCopyColumnMapping, если столбцы в вашем DataTable не соответствуют вашей таблице базы данных.

person Adamy    schedule 04.07.2019