Npgsql AddWithValue 不适用于事务
Npgsql AddWithValue doesn't work with transaction
我正在尝试使用 Npgsql 中的事务执行查询,因为它使代码更加清晰,并且与其他系统中使用纯 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 等数据库管理器中失败的查询,因此查询没有格式错误。
您不能将参数传递给匿名 do
块。它与 npgsql 无关,但与 Postgres 相关。
doc 说:
The code block is treated as though it were the body of a function
with no parameters, returning void. It is parsed and executed a single
time.
我正在尝试使用 Npgsql 中的事务执行查询,因为它使代码更加清晰,并且与其他系统中使用纯 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 等数据库管理器中失败的查询,因此查询没有格式错误。
您不能将参数传递给匿名 do
块。它与 npgsql 无关,但与 Postgres 相关。
doc 说:
The code block is treated as though it were the body of a function with no parameters, returning void. It is parsed and executed a single time.