Каков наилучший способ вставить динамическое число c строк в SQL сервер в C# - PullRequest
0 голосов
/ 01 февраля 2020

Я использую C# и ADO. NET, чтобы вставить динамическое число c строк в таблицу SQL Server, но я не уверен, является ли это лучшим подходом или наиболее эффективным.

После прочтения разных мнений я использовал этот способ, но хотел подтвердить, если это хорошая идея.

Используемые инструменты можно изменить, если вы скажете, что лучше

SqlConnection sc = DBManager.CreateConnection();
sc.Open();

foreach (string item in listSurfaceTypes)
{
    SqlCommand insert = new SqlCommand("INSERT INTO dbo.surface_type_inspection " +
                "(InspectionID, SurfaceType) VALUES (@InspecId, @SurfaceType)", sc);
    insert.Parameters.AddWithValue("@InspecId", id);
    insert.Parameters.AddWithValue("@SurfaceType", item);

    insert.ExecuteNonQuery();
}

sc.Close();

Да, и, кстати, существует более одной таблицы, поэтому мне приходится многократно повторять, нужно ли открывать и закрывать соединение для каждой таблицы или использовать одно и то же соединение для всех?

Ответы [ 2 ]

3 голосов
/ 01 февраля 2020

Как минимум, пакетные вставки в SqlTransaction и помещают SqlConnection в блок using. Транзакция гарантирует, что все строки либо вставлены, либо отсутствуют, и повышает производительность за счет исключения фиксации и журнала flu sh после каждой строки.

using (var sc = DBManager.CreateConnection())
{
    sc.Open();
    var tran = sc.BeginTransaction();
    foreach (string item in listSurfaceTypes)
    {
        SqlCommand insert = new SqlCommand("INSERT INTO dbo.surface_type_inspection (InspectionID,SurfaceType) values(@InspecId,@SurfaceType)", sc);
        insert.Parameters.AddWithValue("@InspecId", id);
        insert.Parameters.AddWithValue("@SurfaceType", item);

        insert.Transaction = tran;
        insert.ExecuteNonQuery();
    }
    tran.Commit();
    sc.Close();
}

SqlBulkCopy будет значительно быстрее, если у вас есть тысячи строки для вставки.

1 голос
/ 01 февраля 2020

Используйте класс SqlBulkCopy, таким образом, вы не делаете построчную вставку, которая намного медленнее. https://docs.microsoft.com/en-us/dotnet/api/system.data.sqlclient.sqlbulkcopy

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...