Массовая вставка для нескольких поставщиков баз данных - PullRequest
3 голосов
/ 20 мая 2019

Я совершенно новичок в донете и пытаюсь найти способ записать базу данных из c # в провайдера БД.Данные происходят из файлов JSON, которые содержат всю необходимую информацию для процесса вставки (имена таблиц, имена столбцов, типы (в виде строк) и данные).Поскольку объем данных может быть довольно большим, я бы хотел обойти создание нового оператора вставки для каждой строки.Есть ли подход, который работает со всеми поставщиками БД?

Из десериализованного файла json я сначала создаю массив DbType, который содержит типы данных для каждого столбца.

С этим я пыталсяполучить удовлетворительный подход вставки с помощью

  1. Построение оператора INSERT с использованием строителя строк

  2. Построение DbCommand и предоставление ему всей информации

  3. Выполнить созданную команду DbCommand


using (IDbConnection connection = dbFactory.CreateConnection())
{
    foreach (TableDTO table in dbTables)
    {
        //build the insert statement
        StringBuilder insertSQLBuilder = new StringBuilder();
        insertSQLBuilder.Append("INSERT INTO " + table.Name + "(");

        foreach (ColumnDTO column in table.Columns)
        {
            insertSQLBuilder.Append(column.Name + ", ");                    
        }
        insertSQLBuilder.Length = insertSQLBuilder.Length - 2;
        insertSQLBuilder.Append(") VALUES (");

        for (int i = 0; i < table.Columns.Length; i++) {
            insertSQLBuilder.Append("@param" + i + ", ");          
        }
        insertSQLBuilder.Length = insertSQLBuilder.Length - 2;
        insertSQLBuilder.Append(")");

        //prepare the insert command
        using (IDbCommand dbCommand = connection.CreateCommand()) {
            dbCommand.CommandText = insertSQLBuilder.ToString();

            IDbDataParameter[] dbParameters = new DbParameter[table.Columns.Length];

            for (int i = 0; i < table.Columns.Length; i++)
            {
                IDbDataParameter dbParameter = dbCommand.CreateParameter();
                dbParameter.DbType = typeArray[i];  //DbType Array, which holds the types for each column
                dbParameter.ParameterName = "param" + i;
                dbParameters[i] = dbParameter;
            } 

            while (dataDeserializer.MoveNext())
            {
                // get new row from json file, each element of ColumnData holds the value and extra information which is not needed here
                ColumnData[] columnData = dataDeserializer.Current;
                for (int i = 0; i < dbParameters.Length; i++)
                {
                    bool isNotGuid = typeArray[i] != DbType.Guid;
                    object value = null;
                    //TODO stupid conversion workaround
                    if (isNotGuid)
                    {
                        value = columnData[i].Value;
                    }
                    else
                    {
                        value = Guid.Parse(columnData[i].Value);
                    }
                    dbParameters[i].Value = value ?? DBNull.Value;
                    dbCommand.Parameters.Add(dbParameters[i]);
                }
                //execute statement and close connection
                dbCommand.Connection.Open();
                dbCommand.ExecuteNonQuery();
                dbCommand.Connection.Close();
                dbCommand.Parameters.Clear();
            }
        }
    }           
}

Что я хотел бы сделать, это обойти одиночные вызовы вставки в базу данных без указания поставщика базы данных.Есть ли библиотека, которая поддерживает массовую вставку для нескольких провайдеров?Идеальный сценарий - это библиотека, которая позволяет мне просто изменить значение параметра, а также максимальное количество строк, которые должны быть вставлены сразу (чтобы контролировать использование памяти).

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