Попытка чтения из порядкового номера столбца '0' недопустима - PullRequest
1 голос
/ 06 февраля 2012

У меня проблема с моей первой колонкой ForumGroup в моей хранимой процедуре в моей коллекции Entities.Я получаю эту ошибку.

Попытка чтения из порядкового номера столбца '0' недопустима.С CommandBehavior.SequentialAccess вы можете читать только из порядкового номера столбца «3» или выше.

My 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

my 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;
            }
        }
    }
}

Ответы [ 3 ]

6 голосов
/ 06 февраля 2012

Посмотрите на это сообщение в блоге. .

Цитата к сообщению в блоге:

Если вы открываете программу чтения с помощью SequentialAccess, вы должны прочитать столбцыпоследовательно вы не можете прочитать столбец 1, а затем прочитать столбец 0. Вы должны сделать это наоборот.

3 голосов
/ 06 февраля 2012

Из документации CommandBehavior.SequentialAccess :

"Когда вы указываете SequentialAccess, вам необходимо читать из столбцов в порядке их возврата, хотя выне требуется читать каждый столбец. После того, как вы прочитали место в возвращаемом потоке данных, данные в этом месте или перед ним больше не могут считываться из DataReader. "

После того, как вы прочиталипосле Title и Description вы не можете читать ForumGroup, вы можете читать только из четвертого (индекс 3) столбца и далее.

Итак, у вас есть три основных варианта:

  • Используйте другое поведение команды.
  • Укажите порядок возврата полей из хранимой процедуры, чтобы они соответствовали коду.(Вы должны указать поля и не использовать select * в любом случае.)
  • Сначала считайте значения в переменные, чтобы вы могли прочитать их в порядке их возврата, а затем используйте переменные для создания Forum объект.
0 голосов
/ 08 февраля 2012
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.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...