npgsql 4.0 没有明确 return 字典参数

Npgsql 4.0 does not return dictionary parameter clearly

当我用字典参数插入值 table 并且发生了一些异常时,npgsql 没有 return 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 [=12=] null";

                cmd.ExecuteNonQuery();
            }
        }

然后我得到这样的错误:

Database Exception: 22021: invalid byte sequence for encoding "UTF8": 0x00. Query ==> insert into foo values ()

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

Database Exception: 22021: invalid byte sequence for encoding "UTF8": 0x00. Query ==> insert into foo values ('null [=14=] null')

如果我遇到 insert 语句的错误,例如 unicode 问题,我会得到这样的错误;

Database Exception: INSERT INTO bla Values ();

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

Database Exception: INSERT INTO bla Values ('bla bla');

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

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

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

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

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

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