我有一个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
我想是因为我使用了像DO
和DECLARE
这样的脚本关键字,所以失败了。此外,它似乎无法匹配查询中的输入参数。
如果我能得到一个解决方案,就如何运行这个,因为它是将是伟大的。但其他更好的解决方案或建议是受欢迎的!
1条答案
按热度按时间ix0qys7i1#
您不能在PostgreSQL匿名DO块中使用参数。
你可以将代码定义为一个存储函数或过程,并使用参数调用它。如果你不想这样做,你必须将参数值作为文字插入DO块中(如果它们来自用户,请确保正确地清理它们)。