Я пытаюсь выполнить массивную вставку, используя Dapper над Npgsql, которая возвращает идентификаторы вновь вставленных строк. Следующая инструкция insert используется в обоих моих примерах:
var query = "INSERT INTO \"MyTable\" (\"Value\") VALUES (@Value) RETURNING \"ID\"";
Сначала я попытался добавить массив объектов со свойством "Значение":
var values = new[] {
new { Value = 0.0 },
new { Value = 0.5 }
};
var ids = connection.Query<int>(query, values);
Однако это не работает с NpgsqlException: "ERROR: 42703: значение столбца" не существует ". Прочитав этот вопрос, я подумал, что, возможно, мне нужно передать объект DataTable вместо массива объектов:
var dataTable = new DataTable();
dataTable.Columns.Add("Value", typeof(double));
dataTable.Rows.Add(0.0);
dataTable.Rows.Add(0.5);
var ids = connection.Query<int>(query, dataTable);
Однако это не удается с тем же самым исключением. Как выполнить массивную вставку и получить результирующие последовательные идентификаторы из Dapper над Npgsql?
Я заметил, что оболочка исключения не соответствует имени столбца, но я уверен, что у меня есть кавычки вокруг имен таблиц и столбцов, поэтому я не уверен, почему он говорит "значение" вместо "Значение" "в исключении. Просто подумал, что я бы упомянул об этом на случай, если он каким-то образом связан с ошибкой, так как легко заметить корпус.
- EDIT -
Чтобы уточнить, это SQL, чтобы создать таблицу
CREATE TABLE "MyTable" (
"ID" SERIAL PRIMARY KEY,
"Value" DOUBLE PRECISION NOT NULL
);
И используя переменные "запрос" и "значения", определенные выше, это код, который работает для каждой строки:
var ids = new List<int>();
foreach (var valueObj in values) {
var queryParams = new DynamicParamaters();
queryParams.Add("Value", valueObj.Value);
ids.AddRange(connection.Query<int>(query, queryParams));
}
Проблема в том, что мне нужно иметь возможность вставлять сотни (возможно, тысячи в ближайшем будущем) строк в секунду в "MyTable", поэтому ожидание этого цикла для итеративного отправления каждого значения в базу данных является громоздким и (I предположим, но еще не достигли контрольных показателей). Кроме того, я выполняю дополнительные вычисления для значений, которые могут или не могут привести к дополнительным вставкам, где мне нужна ссылка внешнего ключа на запись "MyTable".
Из-за этих проблем я ищу альтернативу, которая отправляет все значения в один оператор в базу данных, чтобы уменьшить сетевой трафик и задержку обработки. Опять же, я НЕ тестировал итеративный подход еще... то, что я ищу, является альтернативой, которая делает объемную вставку, поэтому я могу сравнить два подхода друг к другу.