Вставьте таблицу данных ADO.Net в таблицу SQL - PullRequest
1 голос
/ 18 марта 2010

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

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

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

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

Ответы [ 4 ]

9 голосов
/ 18 марта 2010

Вы можете передать весь DataTable в виде единого параметра с табличным значением и сразу вставить весь TVP. Ниже приведен пример из Табличные параметры в SQL Server 2008 (ADO.NET) :

// Assumes connection is an open SqlConnection.
using (connection)
{
// Create a DataTable with the modified rows.
DataTable addedCategories = CategoriesDataTable.GetChanges(
    DataRowState.Added);

// Define the INSERT-SELECT statement.
string sqlInsert = 
    "INSERT INTO dbo.Categories (CategoryID, CategoryName)"
    + " SELECT nc.CategoryID, nc.CategoryName"
    + " FROM @tvpNewCategories AS nc;"

// Configure the command and parameter.
SqlCommand insertCommand = new SqlCommand(
    sqlInsert, connection);
SqlParameter tvpParam = insertCommand.Parameters.AddWithValue(
    "@tvpNewCategories", addedCategories);
tvpParam.SqlDbType = SqlDbType.Structured;
tvpParam.TypeName = "dbo.CategoryTableType";

// Execute the command.
insertCommand.ExecuteNonQuery();
}

TVP доступны только в SQL 2008.

3 голосов
/ 18 марта 2010

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

0 голосов
/ 04 июля 2019

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, если столбцы в вашей таблице данных не соответствуют таблице базы данных.

0 голосов
/ 27 марта 2012

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

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

                        }
                    }
                }
            }
        } 
...