c# - npgsql.EntityFrameworkCore.PostgreSQL - 带有 json 参数的执行函数不起作用
问题描述
数据库:PostgreSQL
ORM:带有 Npgsql.EntityFrameworkCore.PostgreSQL 的实体框架核心
试图将下面的功能传递产品列表调用为 json
dbContext.product.FromSqlRaw("SELECT pa.usp_set_product({0})", productjson).ToList();
返回错误为:“42883:函数 pa.usp_set_product(text) 不存在”
然后在下面尝试
dbContext.product.FromSqlRaw(@"SELECT pa.usp_set_product('" + productjson+ "')").ToList();
返回错误:“输入字符串的格式不正确”
然后在下面试了下效果很好
using (var cmd = new NpgsqlCommand(@"SELECT pa.usp_set_product(@productjson)", conn))
{
cmd.Parameters.Add(new NpgsqlParameter("productjson", NpgsqlDbType.Json) { Value = productjson});
cmd.ExecuteNonQuery();
}
有什么想法,请-
- 为什么带有 JSON 参数的 FromSqlRaw 不起作用
- 使用 NpgsqlCommand 有什么缺点吗 - 它是否支持 Linux-container(docker)
谢谢,
@保罗
解决方案
当你在 FromSqlRaw 中包含一个参数值时,它将作为默认对应的 PG 类型发送;我假设你productjson
是一个 .NET 字符串,它映射到一个 PG text
,而不是json
. 结果与使用 NpgsqlCommand 的低级代码相同,但没有指定NpgsqlDbType.Json
.
EF Core 还允许您传递 DbParameter 实例而不是原始值,因此您应该能够执行以下操作:
var jsonParam = new NpgsqlParameter("productjson", NpgsqlDbType.Json); dbContext.product.FromSqlRaw("SELECT pa.usp_set_product(@jsonParam)", jsonParam).ToList();
此文档页面上提供了更多信息。
注意:永远不要将字符串连接或插入到 FromSqlRaw 的 SQL 中 - 这容易受到 SQL 注入的影响。仔细阅读EF 文档以获取更多信息。
注意 2:考虑使用 PostgreSQLjsonb
类型而不是json
. 您可以在此处阅读不同之处。
推荐阅读
- python - 如何在特定版本的 python 上使用 pip?
- python - 如何正确打包一个字符和一个数字?
- android - 重用连接如何在 android 上实现高效网络?
- android-studio - 无法在 AVD Manager 中选择系统映像
- javascript - 日期无法格式化(OOP)
- python - 如何根据以前的值填补数据中的空白
- php - Cakephp 2.x 电子邮件不起作用,为什么会出现此错误
- single-sign-on - 在拥有超过 100 万用户的 AEM 中使用 SAML_login 是否合适?
- ajax - 在单击 onclick="confirm(' ')" 消息的 OK 按钮之前如何防止 ajax 请求?
- pascal - 找不到数组声明有什么问题