gpt4 book ai didi

c# - Npgsql 4.0 参数和空值

转载 作者:行者123 更新时间:2023-11-29 11:44:23 25 4
gpt4 key购买 nike

使用 Npgsql 传递空值看起来像这样:

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

cmd.ExecuteNonQuery();
}

效果很好。

新的 Npgsql 4.0 文档建议使用强声明参数数据类型,像这样:

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

cmd.ExecuteNonQuery();
}

当传递 DBNull.Value 时,抛出一般异常:

Unable to cast object of type 'System.DBNull' to type 'System.String'.

一切仍然适用于新的无装箱参数,但新语法似乎很有意义,我们想使用它......但如何解决此数据类型断开连接?

上面的例子是一个字符串。我认为这也会影响数字和日期。

最佳答案

新的通用参数 API 确实有问题 - 它应该接受常规 .NET null (而不是 DBNull.Value ),我打开了 this issue为了跟踪这个问题,它将在 4.0.3 中修复。

请注意,作为 the documentation note说,通用 API 的重点是避免使用 Value属性,类型为 object .如果您使用通用 NpgsqlParameter<int>但分配Value ,您的 int 将被装箱,从而违背了 API 的目的。您应该分配给 TypedValue , 类型为 int而且不会装箱。这也是为什么您不能分配 DBNull.Value 的原因指示空值(它是不同的 .NET 类型)。

关于是否应该使用这个新的通用 API 的一些注意事项:

  • 如果您正在编写大量值类型(例如 intDateTime ...),这将删除所有装箱分配。这是否重要取决于您的应用 - 仔分割析。
  • 一般而言,当类型在编译时已知时,通用 API 应始终优先于非通用 API。这允许编译器及早检查类型正确性并使您的代码更清晰 - 我们使用 List<string>而不是 ArrayList作为一个好的编码问题,即使性能不是问题
  • 通用 API 的主要(唯一?)缺点是它是特定于 Npgsql 的,使您的代码无法移植到其他数据库驱动程序(尽管 an issue exists 使这个(或类似的东西)成为 ADO.NET 的一部分) .

关于c# - Npgsql 4.0 参数和空值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51501878/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com