Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/postgresql/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# Npgsql:准备好的声明_p1";不存在_C#_Postgresql_Npgsql - Fatal编程技术网

C# Npgsql:准备好的声明_p1";不存在

C# Npgsql:准备好的声明_p1";不存在,c#,postgresql,npgsql,C#,Postgresql,Npgsql,我正在尝试使用以下方法将EOD库存数据加载到表中: public async Task<long> BulkInsertEodData(IEnumerable<EodData> records, string symbol) { var recordsProcessed = 0L; using (var conn = await OpenConnection()) using (var trans = con

我正在尝试使用以下方法将EOD库存数据加载到表中:

    public async Task<long> BulkInsertEodData(IEnumerable<EodData> records, string symbol)
    {
        var recordsProcessed = 0L;
        using (var conn = await OpenConnection())
        using (var trans = conn.BeginTransaction())
        using (var comm = _factory.CreateCommand())
        {
            try
            {
                comm.Connection = conn;
                comm.Transaction = trans;
                comm.CommandText = INSERT_EOD;
                var ps = AddParametersToInsertEodQuery(comm);
                foreach (var p in ps) comm.Parameters.Add(p);
                comm.Prepare();

                foreach (var record in records)
                {
                    comm.Parameters["@date_id"].Value = record.DateId;
                    comm.Parameters["@symbol"].Value = symbol.ToUpper();
                    comm.Parameters["@eod_close"].Value = record.EodClose;
                    comm.Parameters["@eod_high"].Value = record.EodHigh;
                    comm.Parameters["@eod_low"].Value = record.EodLow;
                    comm.Parameters["@eod_volume"].Value = record.EodVolume;
                    comm.Parameters["@eod_open"].Value = record.EodOpen;
                    comm.Parameters["@eod_split"].Value = record.EodSplit;
                    comm.Parameters["@eod_dividend"].Value = record.EodDividend;
                    comm.Parameters["@last_modified"].Value = DateTime.UtcNow;
                    await comm.ExecuteNonQueryAsync();
                    recordsProcessed++;
                }

                trans.Commit();
            }
            catch (Exception ex)
            {
                _logger.LogError(ex, "BulkInsertEodData(IEnumerable<EodData>)");
                trans.Rollback();
            }
        }

        return recordsProcessed;
    }
这不是我第一次准备好陈述的竞技表演,但这次我做了一些不同的事情(.NET Core,使用DbProviderFactory),我得到了奇怪的结果

通过这个方法的前几次,我得到了一个错误,其效果是
Npgsql.postgresception(0x80004005):42601:syntax error在“$1”处或附近
,这本身就相当神秘,但最神秘的是,在调用了两个方法之后,错误实际上消失了,我开始得到
Npgsql.postgresception(0x80004005):26000:准备好的语句“\u p1”不存在


有人能解释这种行为吗?我做错了什么?我从哪里可以获得更多关于“$1”的详细信息?

插入的值周围缺少括号。遗憾的是,博士后不会告诉你,它期望1美元之前有一个括号

正确语法:

values (
    @date_id, 
    (select s.id from stocks s where s.symbol = @symbol limit 1), 
    @eod_open, 
    @eod_clos, 
    @eod_low, 
    @eod_high, 
    @eod_volume, 
    @eod_dividend, 
    @eod_split, 
    current_timestamp)
on conflict (date_id, stock_id)

您正在传入
@last_modified
参数,但没有在SQL中使用它,对吗?是的,这是一些实验的产物。这会导致我看到的问题吗?不知道,从未使用过Postgresql,但这是可能的。Npgsql将命名参数占位符(@date_id)转换为Postgresql本机位置参数($1,$2…)。你最好的办法是检查PG日志,看看到底收到了什么查询,然后从那里开始(请发帖)顺便说一句,对于这种工作负载,你可能想看一下,它可能会更有效。
values (
    @date_id, 
    (select s.id from stocks s where s.symbol = @symbol limit 1), 
    @eod_open, 
    @eod_clos, 
    @eod_low, 
    @eod_high, 
    @eod_volume, 
    @eod_dividend, 
    @eod_split, 
    current_timestamp)
on conflict (date_id, stock_id)