如何在Npgsql 4.0通用参数中访问TypedValue

问题描述 投票:0回答:1

跟进以下主题:

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;
c# postgresql npgsql
1个回答
2
投票

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 });

0
投票

(添加答案因为我无法发表评论......)

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();
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.