1

単一行のデータを含む単純な列ファミリーがあります。テーブルがクエリされたときの CQL シェルの結果は次のとおりです。

Connected to Test Cluster at localhost:9160.
[cqlsh 3.1.6 | Cassandra 1.2.8 | CQL spec 3.0.0 | Thrift protocol 19.36.0]

cqlsh:system> use cache

cqlsh:cache> SELECT locationid, payload FROM yellowbotcache;

 locationid | payload
------------+------------------
  f~123456x | This is a test 3

cqlsh:cache>

テーブル データを挿入し、行をクエリするために使用された C# コードを次に示します。

        Cluster cluster = Cluster.Builder().AddContactPoint("127.0.0.1").Build();
        using (Session sess = cluster.Connect())
        {
            sess.Execute("INSERT INTO cache.yellowbotcache (locationid, payload) VALUES ('f~123456x', 'This is a test 3');");

            RowSet result = sess.Execute("SELECT locationid,payload FROM cache.yellowbotcache WHERE locationid = 'f~123456x';");
            var rows = result.GetRows();
            if (rows.Count() > 0)
            {
                foreach (Row row in rows)
                {
                    string payLoad = row.GetValue<string>("payload");
                }
            }
        }

Rows は、長さ = 0 の単一の行を返します。ペイロード = ... ステートメントは、'index out of bounds' エラーになります。locationid を間違った値に変更すると、クエリは行を返しません。

ここで何が起こっているかについてのアイデアはありますか? 先週、DataStax サイトから Cassandra とドライバーをダウンロードしました。

4

1 に答える 1

5

データを 2 回取得しようとしています。最初に呼び出すときrows.Count() > 0、次に反復中に。

実行されて反復されると、Rows 疑似コレクションは無効になります。したがって、最も簡単な解決策は、最初にすべての結果をリストにコピーすることです。

これを試して、

var rows = rowSet.GetRows().ToList();

そして、リストを反復処理します。

于 2013-09-03T05:31:34.207 に答える