如何使用 C# ILP 客户端向 QuestDB 提交空值?

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

我有一张这样的桌子:

CREATE TABLE 'trades' (
    symbol SYMBOL,
    side SYMBOL,
    price DOUBLE,
    revised_price DOUBLE,
    amount DOUBLE,
    timestamp TIMESTAMP
) timestamp (timestamp) PARTITION BY DAY WAL;

我正在尝试使用 C# 客户端 (net-questdb-client) 发送数据。第一次,我知道所有领域,除了

revised_price
。如果需要,我可能会在以后填充此列。因此,我需要向数据库发送一个空值来代替它。

我尝试过这样做:

using var sender =  Sender.New("http::addr=localhost:9000;");
await sender.Table("trades")
    .Symbol("symbol", "ETH-USD")
    .Symbol("side", "sell")
    .Column("price", 2615.54)
    .Column("amount", 0.00044)
    .Column("revised_price", null)
    .AtAsync(new DateTime(2021, 11, 25, 0, 46, 26));
await sender.SendAsync();

但是当我运行它时,出现错误:

Unhandled exception. QuestDB.Utils.IngressError: ServerFlushError : Bad request. 
Server Response (
        Code: `invalid`
        Message: `failed to parse line protocol:errors encountered on line(s):
error in line 1: table: storage path, column: state; cast error from protocol type: STRING to column type: DOUBLE`
        Line: `1`
        ErrorId: `c8712c23edc1-1` 
)

如何将空值发送到数据库?

c# database time-series questdb
1个回答
0
投票

您收到的错误消息是由于选择此函数来处理

revised_price
列:

public ISender Column(ReadOnlySpan<char> name, ReadOnlySpan<char> value);

不幸的是,这会尝试向数据库发送

STRING
,而数据库需要
DOUBLE
,因此数据库拒绝该请求。

要发送 null,只需从代码中省略该列即可:

using var sender =  Sender.New("http::addr=localhost:9000;");
await sender.Table("trades")
    .Symbol("symbol", "ETH-USD")
    .Symbol("side", "sell")
    .Column("price", 2615.54)
    .Column("amount", 0.00044)
    .AtAsync(new DateTime(2021, 11, 25, 0, 46, 26));
await sender.SendAsync();

如果您不确定该值是否为 null,那么您可以使用

if
语句:

using var sender =  Sender.New("http::addr=localhost:9000;");
await sender.Table("trades")
    .Symbol("symbol", "ETH-USD")
    .Symbol("side", "sell")
    .Column("price", 2615.54)
    .Column("amount", 0.00044);

if (revised_price != null) {
    sender.Column("revised_price", revised_price);
}
    
await sender.AtAsync(new DateTime(2021, 11, 25, 0, 46, 26));
await sender.SendAsync();

API 将来可能会通过支持可空类型来改进,其函数签名如下:

public ISender Column(ReadOnlySpan<char> name, double? value);
© www.soinside.com 2019 - 2024. All rights reserved.