Npg sql AddWithValue не работает с транзакцией - PullRequest
0 голосов
/ 30 марта 2020

Я пытаюсь выполнить запрос с транзакцией в Npg sql, поскольку это делает код значительно чище и более совместимым с запросами в других системах с чистым SQL. Однако я получаю ошибку Npgsql.PostgresException: 42703: column "_hash" does not exist в следующем коде.

var cmd = new NpgsqlCommand(@"
do
$do$
begin
    if ((select count(1) from components where hash = @_hash) = 0) then
        insert into components (hash, name) values (@_hash, @_name);
    end if;
end
$do$", db); // db is NpgsqlConnection connection
cmd.Parameters.AddWithValue("_hash", "00000000-0000-0000-0000-000000000000");
cmd.Parameters.AddWithValue("_name", "t_test");
cmd.ExecuteNonQuery(); // error on this line

Следующее действительно работает по какой-то причине, что заставляет меня думать, что это проблема с AddWithValue в транзакциях

Жесткое кодирование значения;

var cmd = new NpgsqlCommand(@"
do
$do$
begin
    if ((select count(1) from components where hash = '00000000-0000-0000-0000-000000000000') = 0) then
        insert into components (hash, name) values ('00000000-0000-0000-0000-000000000000', 't_test');
    end if;
end
$do$", db);
cmd.ExecuteNonQuery();

Избавление от транзакции

var cmd = new NpgsqlCommand("insert into components (hash, name) values (@_hash, @_name);", db)
cmd.Parameters.AddWithValue("_hash", "00000000-0000-0000-0000-000000000000");
cmd.Parameters.AddWithValue("_name", "t_test");
cmd.ExecuteNonQuery();

В чем причина этой проблемы и как ее можно исправить?

ПРИМЕЧАНИЕ. Я могу запустить запрос, который не выполняется в менеджере баз данных, таком как JetBrains DataGrip, поэтому запрос не искажен.

1 Ответ

2 голосов
/ 30 марта 2020

Нельзя передать параметры анонимному блоку do. Это не относится к npg sql, а к Postgres.

do c говорит:

Кодовый блок обрабатывается как это было тело функции без параметров , возвращающей void. Он анализируется и выполняется один раз.

...