Я совершенно новичок в донете и пытаюсь найти способ записать базу данных из c # в провайдера БД.Данные происходят из файлов JSON, которые содержат всю необходимую информацию для процесса вставки (имена таблиц, имена столбцов, типы (в виде строк) и данные).Поскольку объем данных может быть довольно большим, я бы хотел обойти создание нового оператора вставки для каждой строки.Есть ли подход, который работает со всеми поставщиками БД?
Из десериализованного файла json я сначала создаю массив DbType, который содержит типы данных для каждого столбца.
С этим я пыталсяполучить удовлетворительный подход вставки с помощью
Построение оператора INSERT с использованием строителя строк
Построение DbCommand и предоставление ему всей информации
Выполнить созданную команду 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();
}
}
}
}
Что я хотел бы сделать, это обойти одиночные вызовы вставки в базу данных без указания поставщика базы данных.Есть ли библиотека, которая поддерживает массовую вставку для нескольких провайдеров?Идеальный сценарий - это библиотека, которая позволяет мне просто изменить значение параметра, а также максимальное количество строк, которые должны быть вставлены сразу (чтобы контролировать использование памяти).