C# 中的 Cassandra select 查询
Cassandra select query in C#
首先,我是 Cassandra 的新手,我确实阅读了手册并做了一些关于如何设置它以及如何使用 C# 与其通信的(基本)教程。
我在按钮单击事件后得到一个 select 查询。当我执行查询时,出现以下错误:
An unhandled exception of type 'System.ArgumentOutOfRangeException' occurred in Cassandra.dll
Additional information: Value to add was out of range.
代码:
private void bt_select_Click(object sender, EventArgs e)
{
Connect();
Row result = session.Execute("select * from meters where id = 1 AND ConnectionMeterID = 2 ALLOW FILTERING").First();
CloseConnection();
}
注意*实际上存在一行id为1和ConnectionMeterID为2的行。
这是数据库:
Create table meters (
ID int,
ConnectionMeterID int,
ConnectionMeterRevision int,
PeriodStart timestamp,
PeriodEnd timestamp,
Volume1 float,Volume2 float,Volume3 float,
Volume4 float,Volume5 float,Volume6 float,
Volume7 float,Volume8 float,
DataTypeID int,
FileID int,
Remarks text,
QualityScore decimal,
LocationID int,
Removed int,
PRIMARY KEY (ID, ConnectionMeterID));
为什么会出现这个错误?
编辑:堆栈跟踪
<code> 'PloosCassandra.vshost.exe' (CLR v4.0.30319: PloosCassandra.vshost.exe): Loaded 'C:\WINDOWS\Microsoft.Net\assembly\GAC_MSIL\System.Numerics\v4.0_4.0.0.0__b77a5c5 61934e089\System.Numerics.dll'. Cannot find or open the PDB file.
A first chance exception of type 'System.ArgumentOutOfRangeException' occurred in Cassandra.dll
System.ArgumentOutOfRangeException: Value to add was out of range.
Parameter name: value
at System.DateTime.Add(Double value, Int32 scale)
at System.DateTimeOffset.AddMilliseconds(Double milliseconds)
at Cassandra.Serialization.Primitive.DateTimeOffsetSerializer.Deserialize(Byte[] buffer, Int32 offset)
at Cassandra.Serialization.Primitive.DateTimeOffsetSerializer.Deserialize(UInt16 protocolVersion, Byte[] buffer, Int32 offset, Int32 length, IColumnInfo typeInfo)
at Cassandra.Serialization.TypeSerializer 1.Cassandra.Serialization.ITypeSerializer.Deserialize(UInt16 protocolVersion, Byte[] buffer, Int32 offset, Int32 length, IColumnInfo typeInfo)
at Cassandra.Serialization.Serializer.Deserialize(Byte[] buffer, Int32 offset, Int32 length, ColumnTypeCode typeCode, IColumnInfo typeInfo)
at Cassandra.FrameReader.ReadFromBytes(Byte[] buffer, Int32 offset, Int32 length, ColumnTypeCode typeCode, IColumnInfo typeInfo)
at Cassandra.OutputRows.ProcessRowItem(FrameReader reader)
at Cassandra.OutputRows.ProcessRows(RowSet rs, FrameReader reader)
at Cassandra.OutputRows..ctor(FrameReader reader, Nullable 1 traceId)
at Cassandra.Responses.ResultResponse..ctor(Frame frame)
at Cassandra.Responses.ResultResponse.Create(Frame frame)
at Cassandra.FrameParser.Parse(Frame frame)
at Cassandra.Connection.<>c__DisplayClasse. <CreateResponseAction>b__d(MemoryStream stream)
at Cassandra.Tasks.TaskHelper.WaitToComplete(Task task, Int32 timeout)
at Cassandra.Tasks.TaskHelper.WaitToComplete[T](Task 1 task, Int32 timeout)
at Cassandra.Session.Execute(IStatement statement)
at Cassandra.Session.Execute(String cqlQuery)
at PloosCassandra.Form1.bt_select_Click(Object sender, EventArgs e) in c:\Users\rudi\Documents\Visual Studio 2013\Projects\PloosCassandra\PloosCassandra\Form1.cs:line 58
我猜这里的问题是您将它添加为 DateTime.Now.Ticks,在 .NET 中它是自 1/1/1900 00:00:00 以来 100 纳秒间隔的数量。在 Cassandra 中,Java 以及几乎所有其他内容通常代表自 Unix 纪元(1/1/1970 00:00:00)以来的时间。在插入数据之前尝试将时间戳转换为 Unix 时间,看看是否出现相同的错误。这是另一个 SO 问题的 link,向您展示了如何进行转换:
How to convert a Unix timestamp to DateTime and vice versa?
首先,我是 Cassandra 的新手,我确实阅读了手册并做了一些关于如何设置它以及如何使用 C# 与其通信的(基本)教程。
我在按钮单击事件后得到一个 select 查询。当我执行查询时,出现以下错误:
An unhandled exception of type 'System.ArgumentOutOfRangeException' occurred in Cassandra.dll
Additional information: Value to add was out of range.
代码:
private void bt_select_Click(object sender, EventArgs e)
{
Connect();
Row result = session.Execute("select * from meters where id = 1 AND ConnectionMeterID = 2 ALLOW FILTERING").First();
CloseConnection();
}
注意*实际上存在一行id为1和ConnectionMeterID为2的行。
这是数据库:
Create table meters (
ID int,
ConnectionMeterID int,
ConnectionMeterRevision int,
PeriodStart timestamp,
PeriodEnd timestamp,
Volume1 float,Volume2 float,Volume3 float,
Volume4 float,Volume5 float,Volume6 float,
Volume7 float,Volume8 float,
DataTypeID int,
FileID int,
Remarks text,
QualityScore decimal,
LocationID int,
Removed int,
PRIMARY KEY (ID, ConnectionMeterID));
为什么会出现这个错误?
编辑:堆栈跟踪
<code> 'PloosCassandra.vshost.exe' (CLR v4.0.30319: PloosCassandra.vshost.exe): Loaded 'C:\WINDOWS\Microsoft.Net\assembly\GAC_MSIL\System.Numerics\v4.0_4.0.0.0__b77a5c5 61934e089\System.Numerics.dll'. Cannot find or open the PDB file.
A first chance exception of type 'System.ArgumentOutOfRangeException' occurred in Cassandra.dll
System.ArgumentOutOfRangeException: Value to add was out of range.
Parameter name: value
at System.DateTime.Add(Double value, Int32 scale)
at System.DateTimeOffset.AddMilliseconds(Double milliseconds)
at Cassandra.Serialization.Primitive.DateTimeOffsetSerializer.Deserialize(Byte[] buffer, Int32 offset)
at Cassandra.Serialization.Primitive.DateTimeOffsetSerializer.Deserialize(UInt16 protocolVersion, Byte[] buffer, Int32 offset, Int32 length, IColumnInfo typeInfo)
at Cassandra.Serialization.TypeSerializer 1.Cassandra.Serialization.ITypeSerializer.Deserialize(UInt16 protocolVersion, Byte[] buffer, Int32 offset, Int32 length, IColumnInfo typeInfo)
at Cassandra.Serialization.Serializer.Deserialize(Byte[] buffer, Int32 offset, Int32 length, ColumnTypeCode typeCode, IColumnInfo typeInfo)
at Cassandra.FrameReader.ReadFromBytes(Byte[] buffer, Int32 offset, Int32 length, ColumnTypeCode typeCode, IColumnInfo typeInfo)
at Cassandra.OutputRows.ProcessRowItem(FrameReader reader)
at Cassandra.OutputRows.ProcessRows(RowSet rs, FrameReader reader)
at Cassandra.OutputRows..ctor(FrameReader reader, Nullable 1 traceId)
at Cassandra.Responses.ResultResponse..ctor(Frame frame)
at Cassandra.Responses.ResultResponse.Create(Frame frame)
at Cassandra.FrameParser.Parse(Frame frame)
at Cassandra.Connection.<>c__DisplayClasse. <CreateResponseAction>b__d(MemoryStream stream)
at Cassandra.Tasks.TaskHelper.WaitToComplete(Task task, Int32 timeout)
at Cassandra.Tasks.TaskHelper.WaitToComplete[T](Task 1 task, Int32 timeout)
at Cassandra.Session.Execute(IStatement statement)
at Cassandra.Session.Execute(String cqlQuery)
at PloosCassandra.Form1.bt_select_Click(Object sender, EventArgs e) in c:\Users\rudi\Documents\Visual Studio 2013\Projects\PloosCassandra\PloosCassandra\Form1.cs:line 58
我猜这里的问题是您将它添加为 DateTime.Now.Ticks,在 .NET 中它是自 1/1/1900 00:00:00 以来 100 纳秒间隔的数量。在 Cassandra 中,Java 以及几乎所有其他内容通常代表自 Unix 纪元(1/1/1970 00:00:00)以来的时间。在插入数据之前尝试将时间戳转换为 Unix 时间,看看是否出现相同的错误。这是另一个 SO 问题的 link,向您展示了如何进行转换:
How to convert a Unix timestamp to DateTime and vice versa?