2012-02-06 22 views
1

私のEntitiesコレクションのストアドプロシージャの最初の列ForumGroupに問題があります。私はこのエラーが発生します。序数 '0'からの読み込みが無効です

序数 '0'からの読み込みは無効です。 CommandBehavior.SequentialAccessを使用すると、序数列 '3'以上からのみ読み取ることができます。

マイSQL:

DECLARE @Forums TABLE(ForumGroup nvarchar(100), Title varchar(100), Description varchar(100), ThreadCount int, LastPostBy nvarchar(50), 
LastPostDate datetime, LastPostTitle varchar(100)) 
INSERT INTO @Forums(ForumGroup, Title, Description, ThreadCount, LastPostBy, LastPostDate, LastPostTitle) 
SELECT 
(
    CASE WHEN F.ParentID IS NOT NULL THEN 
     (SELECT Title FROM Forums S WHERE S.ForumID = F.ParentID)   
    ELSE 
     (SELECT Title FROM Forums S WHERE S.ParentID IS NULL) 
    END) AS ForumGroup, 
Title, Description, 
ThreadCount = (SELECT COUNT(*) FROM Posts P WHERE P.ForumID = F.ForumID), 
LastPostBy = (SELECT TOP 1 AddedBy FROM Posts P WHERE P.ForumID = F.ForumID ORDER BY P.PostID DESC), 
LastPostDate = (SELECT TOP 1 AddedDate FROM Posts P WHERE P.ForumID = F.ForumID ORDER BY P.PostID DESC), 
LastPostTitle = (SELECT TOP 1 Title FROM Posts P WHERE P.ForumID = F.ForumID ORDER BY P.PostID DESC) 

FROM Forums F WHERE ParentID IS NOT NULL 

ORDER BY ForumGroup 

SELECT * FROM @Forums 

私のC#:

public class Forums 
{   
    public List<Forum> GetForums() 
    { 

     using (EntityConnection conn = new EntityConnection("name=CMSEntities")) 
     { 
      conn.Open(); 
      EntityCommand cmd = conn.CreateCommand(); 
      cmd.CommandText = "CMSEntities.sproc_Forums_GetForums"; 
      cmd.CommandType = System.Data.CommandType.StoredProcedure; 

      using (EntityDataReader reader = cmd.ExecuteReader(System.Data.CommandBehavior.SequentialAccess)) 
      { 
       List<Forum> forums = new List<Forum>(); 
       while (reader.Read()) 
       { 
        Forum forum = new Forum(
         1, 
         "", 
         DateTime.Now, 
         reader["Title"].ToString(), 
         reader["Description"].ToString(), 
         0, 
         false, 
         null, 
         null, 
         null, 
         true, 
         reader["ForumGroup"].ToString(), 
         (int)reader["ThreadCount"], 
         null, 
         DateTime.Now, 
         null); 
        forums.Add(forum); 
       } 
       return forums; 
      } 
     } 
    } 
} 

答えて

6

このblog post.を見てみましょう。

引用ポストブログに:

あなたはSequentialAccessでリーダーを開く場合は、列に 順番に読まなければならない、あなたは、列1を読み、あなたがそれを行うに を持って列0を読み取ることができません他の方法で。 CommandBehavior.SequentialAccessのドキュメントから

+0

いいえ、代わりに何を入れるのですか?そのエラーは発生しません。私はちょうど私がそれを行う方法すべての列を読み取るしたい – ONYX

3

「あなたはSequentialAccessを指定するときは、各列を読み取るために を必要はありませんが、あなたは、彼らが返される順序で 列から読み取ることが要求されます 返されたデータストリーム内の場所を一度読み取ると、その場所またはその前のデータは、もはや のDataReaderから読み取られることはありません。

あなたが過去TitleDescriptionを読んでたら、あなたは唯一の第四(インデックス3)のカラム以降から読み取ることができ、ForumGroupを読み取ることができません。

  • が異なるコマンドの動作を使用します。

    だから、あなたは基本的に3つのオプションがあります。

  • フィールドがコードに一致するようにストアドプロシージャからフィールドを返す順序を指定します。 (フィールドを指定して、とにかくselect *を使用しないでください)
  • 値を変数に読み込み、返された順序で値を読み取ってから、変数を使用してForumオブジェクトを作成します。
+0

代わりに何を代わりに置くので、私はそのエラーを取得しないでください。私はちょうどすべての列を読んでみたいです。それは、私がCommandBehavior.SequentialAccessプロパティをこのコマンドオブジェクトに指定しなければならないと言うExecuteReaderを使用すると、どうやって行うのですか? – ONYX

+0

CommandBehaviorを変更してもこのエラーが発生します。このコマンドオブジェクトにCommandBehavior.SequentialAccessプロパティを指定する必要があります。私は複雑な型に表示されているようにselect文の順序を変更しました – ONYX

+0

@KDM:そのコマンドの動作を必要とするデータ型があります。他の2つのオプションのいくつかを使用する必要があります。 – Guffa

0
Use below mentioned code. 

EntityCommand cmd = conn.CreateCommand(); 
      cmd.CommandText = "CMSEntities.sproc_Forums_GetForums"; 
      cmd.CommandType = System.Data.CommandType.StoredProcedure; 

      using (EntityDataReader reader = cmd.ExecuteReader(System.Data.CommandBehavior.Default)) 
      { 
       List<Forum> forums = new List<Forum>(); 
       while (reader.Read()) 
       { 
        Forum forum = new Forum(
         1, 
         "", 
         DateTime.Now, 
         reader["Title"].ToString(), 
         reader["Description"].ToString(), 
         0, 
         false, 
         null, 
         null, 
         null, 
         true, 
         reader["ForumGroup"].ToString(), 
         (int)reader["ThreadCount"], 
         null, 
         DateTime.Now, 
         null); 
        forums.Add(forum); 
       } 
       return forums; 
      } 
     } 
    } 
} 

Hope it helps. 
関連する問題