通过 VPN 而不是 LAN 进行连接时,Npgsql 事务中出现异常

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

当我的事务第二次更新同一个表时,它没有正确传递参数或其他东西。 从我的尝试中,我遇到了各种各样的错误:

  • 42846:无法将类型整数转换为带时区的时间戳
  • 22007:带有时区的时间戳类型的输入语法无效:@from

当我通过 LAN 连接时,来自同一台 PC 连接到同一数据库的相同代码有效,但当我从工作场所外部通过 VPN 连接时则无效。我想找出原因。

一个代码示例:

// In my case hostssl md5 sql user
using var Connection = new NpgsqlConnection(ConnectionString);
await Connection.OpenAsync(cancellationToken);
var transaction = Connection.BeginTransaction();
try
{
    const string updateOM = "UPDATE public.vyfakturovane_om SET \"BezDPH\" = @BezDPH, \"IbaDPH\" = @IbaDPH, \"PlusDPH\" = @PlusDPH, \"VT\" = @VT, \"NT\" = @NT WHERE \"id\" = @id AND \"ean\" = @ean AND \"from\" = @from AND \"to\" = @to;";
    using var cmdOM = new NpgsqlCommand(updateOM, Connection, transaction);
    foreach (var om in faktura.OM)
    {
        try
        {
            if (om.HladinaNapatia == HladinaNapeti.NN)
            {
                var f = faktura.NN[om.Key.From].Single(f => f.EAN == om.Key.EAN);
                cmdOM.Parameters.AddWithValue("BezDPH", NpgsqlDbType.Double, f.BezDPH);
                cmdOM.Parameters.AddWithValue("IbaDPH", NpgsqlDbType.Double, f.IbaDPH);
                cmdOM.Parameters.AddWithValue("PlusDPH", NpgsqlDbType.Double, f.PlusDPH);
                cmdOM.Parameters.AddWithValue("VT", NpgsqlDbType.Double, f.Obchod.MnozstvoVT);
                cmdOM.Parameters.AddWithValue("NT", NpgsqlDbType.Double, f.Obchod.MnozstvoNT);
            }
            else
            {
                var f = faktura.VN[om.Key.From].Single(f => f.EAN == om.Key.EAN);
                cmdOM.Parameters.AddWithValue("BezDPH", NpgsqlDbType.Double, f.BezDPH);
                cmdOM.Parameters.AddWithValue("IbaDPH", NpgsqlDbType.Double, f.IbaDPH);
                cmdOM.Parameters.AddWithValue("PlusDPH", NpgsqlDbType.Double, f.PlusDPH);
                cmdOM.Parameters.AddWithValue("VT", NpgsqlDbType.Double, f.ObchodVN.MnozstvoVT);
                cmdOM.Parameters.AddWithValue("NT", NpgsqlDbType.Double, f.ObchodVN.MnozstvoNT);
            }
            cmdOM.Parameters.AddWithValue("id", NpgsqlDbType.Bigint, faktura.Id);
            cmdOM.Parameters.AddWithValue("ean", NpgsqlDbType.Varchar, om.Key.EAN);
            cmdOM.Parameters.AddWithValue("from", NpgsqlDbType.TimestampTz, om.Key.From.UtcDateTime);
            cmdOM.Parameters.AddWithValue("to", NpgsqlDbType.TimestampTz, faktura.ToLocal.UtcDateTime);
            var omResult = await cmdOM.ExecuteNonQueryAsync(cancellationToken);
            if (omResult != 1)
            {
                throw new Exception("Failed to updated OM in DB.");
            }
            cmdOM.Parameters.Clear();
        }
        catch (Exception ex)
        {
            logger?.LogError("Failed to update '{ean}' for range '{from}' - '{to}'. {ex}", om.Key.EAN, om.Key.From, faktura.ToLocal, ex.Message);
            throw;
        }
    }
    transaction.Commit();
    logger?.LogInformation("Faktura {fakturaId} has been updated in the Database.", faktura.Id);
}
catch
{
    transaction.Rollback(); // Rollback the transaction in case of an exception
    throw;
}
finally
{
    transaction.Dispose();
}

在 PostgreSQL 服务器的日志中我发现了类似的内容:

2023-09-11 11:39:14.790 UTC [142287] tmp@tmp ERROR:  column "id" does not exist at character 137  
2023-09-11 11:39:14.790 UTC [142287] tmp@tmp HINT:  There is a column named "id" in table "vyfakturovane_om", but it cannot be referenced from this part of the query.  
2023-09-11 11:39:14.790 UTC [142287] tmp@tmp STATEMENT:  INSERT into public.vyfakturovane_om ("id","ean","to","from","BezDPH","IbaDPH","PlusDPH", "VT", "NT") VALUES (@id, $1, @to, $2, $3, $4, $5, $6, $7)

我可以看到,由于某种原因,参数 id 和 to 无法正常工作。

c# .net postgresql .net-6.0 npgsql
1个回答
0
投票

你的桌子看起来像这样

| "id" | "ean" | "to" | "from" | "CelkomBezDPH" | "CelkomIbaDPH" | "CelkomPlusDPH" | 
|---|---|---|---|---|---|---| 
| 205230110 | "123456789012345678" | "2023-07-31 21:59:59+00" | "2023-06-30 22:00:00+00" | 1 | 2 | 3 | 
| 205230111 | "123456789012345679" | "2023-07-31 21:59:59+00" | "2023-06-30 22:00:00+00" | NaN | NaN | NaN | 
| 205230111 | "123456789012345680" | "2023-07-31 21:59:59+00" | "2023-06-30 22:00:00+00" | NaN | NaN | NaN | 
| 205230112 | "123456789012345681" | "2023-07-31 21:59:59+00" | "2023-06-30 22:00:00+00" | 1 | 2 | 3 | 
| 205230113 | "123456789012345682" | "2023-07-31 21:59:59+00" | "2023-06-30 22:00:00+00" | NaN | NaN | NaN | 
| 205230113 | "123456789012345683" | "2023-07-31 21:59:59+00" | "2023-06-30 22:00:00+00" | NaN | NaN | NaN | 
| 205230114 | "123456789012345684" | "2023-07-31 21:59:59+00" | "2023-06-30 22:00:00+00" | 1 | 2 | 3 |

您确定是日期失败而不是由于其他原因吗?

© www.soinside.com 2019 - 2024. All rights reserved.