通过 NpgsqlConnection::ExecuteAsync 使用纯查询文本创建存储过程

问题描述 投票:0回答:1

我正在尝试通过 C# 的 Npsql 创建一个 stpored 过程

    private async Task TestExecute(string cmdQuery)
    {
        var cnnString = $"Server=localhost;User Id=admin;Password=somepass;Database=MyTestdatabase";
        NpgsqlConnection connection = new NpgsqlConnection(cnnString);
        await connection.OpenAsync();

        var cmdQuery2 = "CREATE OR REPLACE PROCEDURE public.select_data()" +
            " LANGUAGE sql" +
            " BEGIN ATOMIC" +
            " SELECT tbl.id," +
            "     tbl.val" +
            "    FROM tbl;" +
            " END";

        // All of these fails
        var r0 = await connection.ExecuteScalarAsync(cmdQuery2);
        var r1 = await connection.ExecuteAsync(cmdQuery2);
        var r2 = await connection.QueryAsync(cmdQuery2);
    }

这是脚本:

CREATE OR REPLACE PROCEDURE public.select_data()
 LANGUAGE sql
BEGIN ATOMIC
 SELECT tbl.id,
     tbl.val
    FROM tbl;
END

从 pgAdmin 执行时效果非常好。但是,当我尝试使用任何执行/查询方法执行它时,出现此错误。

enter image description here

enter image description here

更有趣的是,我没有通过执行此脚本看到来自 pg 活动的命令:

SELECT query, * FROM pg_stat_activity 
where query <> ''
order by query_start desc; 

所以看起来 CREATE OR REPLACE 过程甚至在到达 Postgre 服务器之前就在某些验证级别失败。

顺便说一句,即使使用“ExecuteReaderAsync”,用于创建函数的类似脚本也能正常工作

CREATE OR REPLACE FUNCTION public.fn_add_values(a integer, b integer)
 RETURNS integer
 LANGUAGE sql
RETURN (a + b)
c# postgresql dapper npgsql npgsqlconnection
1个回答
0
投票

分号...一切都与分号有关。

你的sql看起来像这样:

CREATE OR REPLACE PROCEDURE public.select_data()
LANGUAGE sql
BEGIN ATOMIC
SELECT tbl.id,
    tbl.val
    FROM tbl

所以它是无效的。分号结束语句。

告诉 Npgsql 不要解析你的语句,或者只使用 Dollar-Quoted String Constants

CREATE OR REPLACE PROCEDURE ...
LANGUAGE plpgsql
AS $$
BEGIN
    ...
END;
$$
© www.soinside.com 2019 - 2024. All rights reserved.