跟进以下线索:
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 });

10-02 01:27
查看更多