如何在C# Npgsql中执行PostgreSQL脚本查询

bf1o4zei  于 2023-03-22  发布在  PostgreSQL
关注(0)|答案(1)|浏览(141)

我有一个C#类,它在代码中存储PostgreSQL查询,如下所示:

public static partial class DbQuery
 {
        public static string PoliciesInsert() =>
        @$"DO $$
            DECLARE policy_text varchar(100);

            BEGIN
                INSERT INTO common_sch.policies(policy, description)
                VALUES(@_Policy,@_Description)
                ON CONFLICT ON CONSTRAINT policies_pk
                DO UPDATE SET is_deleted = false
                RETURNING policy INTO policy_text;
    
            INSERT INTO common_sch.policy_to_role(role_id, policy, created_by, updated_by)
                SELECT 
                    unnest(@_Roles) as role_id, 
                    policy_text as policy, 
                    @_UserId as created_by, 
                    @_UserId as updated_by
            ON CONFLICT ON CONSTRAINT policy_to_role_unique
                DO UPDATE SET is_deleted = false, updated_by = @_UserId;
        END $$;";

        public static string select_test(string parms, string schema) => @$"SELECT * FROM {schema} ";

 }

这个PoliciesInsert查询的执行方式如下:

var parms = new
            {
                _Policy = "TEST_TEST_ACTION",
                _Description = "Testing the policies",
                _Roles = new int[] { 1, 2, 3, 4 },
                _UserId = 15
            };
  var result = await _dataManager.Insert<int>(MaxRavQuery.PoliciesInsert(), parms, CommandType.Text);

以下是DataManager单例服务的Insert方法的实现方式:

public async Task<T> Insert<T>(string command, object parms, CommandType commandType)
        {
            T result;
            using (var dbConnection = await GetConnection())
            {
                using var transaction = await dbConnection.BeginTransactionAsync();
                try
                {
                    result = (await dbConnection.QueryAsync<T>(command, parms, transaction: transaction, 60, commandType)).FirstOrDefault();
                    transaction.Commit();

                }
                catch (Exception)
                {
                    await transaction.RollbackAsync();
                    throw;
                }
            }

            return result;
        }

这是在尝试执行这个时给出的错误。42703: column "_policy" does not exist我想是因为我使用了像DODECLARE这样的脚本关键字,所以失败了。此外,它似乎无法匹配查询中的输入参数。
如果我能得到一个解决方案,就如何运行这个,因为它是将是伟大的。但其他更好的解决方案或建议是受欢迎的!

ix0qys7i

ix0qys7i1#

您不能在PostgreSQL匿名DO块中使用参数。
你可以将代码定义为一个存储函数或过程,并使用参数调用它。如果你不想这样做,你必须将参数值作为文字插入DO块中(如果它们来自用户,请确保正确地清理它们)。

相关问题