Npgsql 4.0 没有清楚地返回字典参数



当我插入带有字典参数的表的值并且发生了一些异常时,npgsql 没有清楚地返回 SQL 查询。 例:

伪代码:

Dictionary<string, object> params = new Dictionary <string, object>();
string sql: "insert into bla values (:item1)";
params.Add ("item1", 'bla bla');
ExecuteNonQuery (sql);

示例代码块:

using (NpgsqlCommand cmd = new NpgsqlCommand("insert into foo values (:TEST)",conn))
{
cmd.Parameters.Add(new NpgsqlParameter<string>("TEST",
NpgsqlDbType.Varchar));
cmd.Parameters[0].Value = "null  null";
cmd.ExecuteNonQuery();
}
}

然后我收到这样的错误:

数据库异常:22021:编码"UTF8"的字节序列无效:0x00。查询 ==>插入 foo 值 ($1(

在使用 npgsql 2.2.5 之前,我遇到了这样的错误:

数据库异常:22021:编码"UTF8"的字节序列无效:0x00。查询 ==>插入到 foo 值中('null \0 null'(

如果我收到插入语句的错误,例如 unicode 问题,我会收到这样的错误;

数据库异常:插入 INTO bla 值 ($1(;

当我使用 npgsql 2.2.5 时,出现如下错误:

数据库异常:插入 INTO bla 值('bla bla'(;

为什么 npgsql 对我隐藏字典参数值? :)

Npgsql 2.x(非常旧(通过将参数内联到 SQL 查询("客户端参数绑定"(来发送参数,除非在准备命令时。Npgsql 3.x 切换到始终在 SQL 本身之外以二进制格式发送参数,这在性能、安全性等方面都更胜一筹。这就是异常消息不包含实际参数值的原因。

请注意,在某些情况下,在异常消息中包含参数值可能被视为不安全。

您必须像这样为查询提供列和值。

使用foreach为字典中的每个项目运行类似的代码

String sql = "INSERT INTO TableName(ColumName) VALUES (:value)";

最新更新