Cassandra在C#中选择查询

时间:2016-05-03 09:21:25

标签: c# cassandra cql

首先,我是Cassandra的新手,我确实阅读了手册,并做了一些关于如何设置并与C#进行通信的基本教程。

我在按钮点击事件后面有一个选择查询。当我执行查询时,我收到以下错误:

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));

为什么会出现这种错误?

编辑:Stacktrace

<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

1 个答案:

答案 0 :(得分:2)

我猜这里的问题是你把它添加为DateTime.Now.Ticks,它在.NET中是自1/1/1900 00:00:00以来100纳秒间隔的数量。在Cassandra,Java以及其他所有其他内容中,这通常代表自Unix时代(1970年1月1日00:00:00)以来的时间。在插入数据之前尝试将时间戳转换为Unix时间,看看是否收到相同的错误。以下是另一个SO问题的链接,向您展示如何进行转换:

How to convert a Unix timestamp to DateTime and vice versa?