跟进以下主题:
Npgsql 4.0 Parameters and Null Values
对于允许强类型值的新通用参数,文档表明声明看起来像这样:
cmd.Parameters.Add(new NpgsqlParameter<int>("ID", 15));
这将在参数上设置TypedValue
属性。
但是,当我有相同命令的多个插入时,我似乎无法直接访问TypedValue
。有没有一个允许这个的结构?下面是我正在使用的示例,其中我将每个参数作为其类型对应项进行转换:
using (NpgsqlTransaction trans = conn.BeginTransaction(IsolationLevel.RepeatableRead))
{
using (NpgsqlCommand cmd = new NpgsqlCommand(sql, conn, trans))
{
cmd.Parameters.Add(new NpgsqlParameter<Int32>("ID",
NpgsqlTypes.NpgsqlDbType.Integer));
cmd.Parameters.Add(new NpgsqlParameter<String>("TRAY_CODE",
NpgsqlTypes.NpgsqlDbType.Varchar));
foreach (ReturnScrapDecision newRecord in NewRecords)
{
((NpgsqlParameter<Int32>)cmd.Parameters[0]).TypedValue = newRecord.Id;
((NpgsqlParameter<String>)cmd.Parameters[1]).TypedValue = newRecord.TrayCode;
cmd.ExecuteNonQuery();
}
}
trans.Commit();
}
顺便说一句,上面的代码编译,但我不知道它是否会运行。我还在测试。
我可以设置Value
罚款:
cmd.Parameters[0].Value = newRecord.Id;
但是如果没有施法,我不能这样做:
cmd.Parameters[0].TypedValue = newRecord.Id;
NpgsqlCommand.Parameters
是一种非常规的IList<NpgsqlParameter>
。因此当你做cmd.Parameters[0]
时,你会得到一个经典的NpgsqlParameter
而不是NpgsqlParameter<T>
。
您可以使用向下转换:
((NpgsqlParameter<int>)cmd.Parameters[0]).TypedValue = newRecord.Id;
或者更好的是,只需在分配参数时使用初始化程序:
cmd.Parameters.Add(new NpgsqlParameter<Int32>("ID", NpgsqlTypes.NpgsqlDbType.Integer) { TypedValue = newRecord.Id });
(添加答案因为我无法发表评论......)
TypedParameters
属性的问题是你最终得到了一个混合类型的集合,并且仍然需要转换它们。
这样的解决方案怎么样?
using (NpgsqlCommand cmd = new NpgsqlCommand(sql, conn, trans))
{
var idParam = new NpgsqlParameter<Int32>("ID", NpgsqlTypes.NpgsqlDbType.Integer);
cmd.Parameters.Add(idParam);
var trayCodeParam = new NpgsqlParameter<String>("TRAY_CODE", NpgsqlTypes.NpgsqlDbType.Varchar);
cmd.Parameters.Add(trayCodeParam);
foreach (ReturnScrapDecision newRecord in NewRecords)
{
idParam.TypedValue = newRecord.Id;
trayCodeParam.TypedValue = newRecord.TrayCode;
cmd.ExecuteNonQuery();
}
}