Подтвердить что ты не робот

Лучший способ для массовой вставки из С# DataTable

У меня есть DataTable, который я хочу нажать на БД. Я хочу сказать, как

myDataTable.update();

Но после чтения MSDN docs, похоже, это вставляет строки за строкой.

Следует отметить, что эти операторы не выполняются в виде пакетного процесса; каждая строка обновляется индивидуально.

Каковы мои альтернативы?

Изменить: я использую SQL Server 2005

4b9b3361

Ответ 1

При использовании SQL Server SqlBulkCopy.WriteToServer(DataTable)

Или также с SQL Server вы можете записать его в .csv и использовать BULK INSERT

Если вы используете MySQL, вы можете записать его в .csv и использовать LOAD DATA INFILE

Если вы используете Oracle, вы можете использовать функцию привязки массива ODP.NET

Если SQLite:

Ответ 2

string connectionString= ServerName + DatabaseName + SecurityType;
using (SqlConnection connection = new SqlConnection(connectionString))
using (SqlBulkCopy bulkCopy = new SqlBulkCopy(connection)) {
    connection.Open();
    bulkCopy.DestinationTableName = "TableName";
    try {
        bulkCopy.WriteToServer(dataTableName);
    } catch (Exception e) {
        Console.Write(e.Message);
    }
}

Обратите внимание, что структура таблицы базы данных и имени таблицы должна быть одинаковой или вызывать исключение.

Ответ 3

Это будет во многом зависеть от используемой СУБД, и существует ли даже такая возможность .NET для этой СУБД.

Если вы используете SQL Server, используйте класс SqlBulkCopy.

Для других поставщиков баз данных попробуйте выполнить поиск по ним. Например, поиск "Вставка .NET Bulk в Oracle" привел к некоторым интересным результатам, включая эту ссылку, в Stack Overflow: Массовая вставка в Oracle с использованием .NET.

Ответ 4

Вот как я это делаю, используя DataTable. Это рабочая часть кода TEST.

using (SqlConnection con = new SqlConnection(connStr))
{
    con.Open();

    // Create a table with some rows. 
    DataTable table = MakeTable();

    // Get a reference to a single row in the table. 
    DataRow[] rowArray = table.Select();

    using (SqlBulkCopy bulkCopy = new SqlBulkCopy(con))
    {
        bulkCopy.DestinationTableName = "dbo.CarlosBulkTestTable";

        try
        {
            // Write the array of rows to the destination.
            bulkCopy.WriteToServer(rowArray);
        }
        catch (Exception ex)
        {
            Console.WriteLine(ex.Message);
        }

    }

}//using