我有一张这样的桌子:
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`
)
如何将空值发送到数据库?
您收到的错误消息是由于选择此函数来处理
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);