跟进以下线索:
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();
}
顺便说一下,上面的代码可以编译,但我还不知道它是否能运行。我还在测试。
我可以设置好:
cmd.Parameters[0].Value = newRecord.Id;
但我不能不施法:
cmd.Parameters[0].TypedValue = newRecord.Id;
最佳答案
NpgsqlCommand.Parameters
是一种非泛型的。所以当你这样做的时候,你得到的是一个经典的IList<NpgsqlParameter>
而不是cmd.Parameters[0]
。
您可以使用下推:
((NpgsqlParameter<int>)cmd.Parameters[0]).TypedValue = newRecord.Id;
或者更好的方法是,在分配参数时使用初始值设定项:
cmd.Parameters.Add(new NpgsqlParameter<Int32>("ID", NpgsqlTypes.NpgsqlDbType.Integer) { TypedValue = newRecord.Id });