尝试从列序号'0'读取无效

ONY*_*NYX 1 c# sql asp.net entity-framework

我的Entities集合中的存储过程中的第一列ForumGroup出现问题.我收到这个错误.

尝试从列序号'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
Run Code Online (Sandbox Code Playgroud)

我的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;
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

ada*_*ost 6

看一下这篇博客文章..

引用博文:

如果您使用SequentialAccess打开阅读器,则必须按顺序读取列,不能读取第1列,然后阅读第0列.您必须以相反的方式执行此操作.


Guf*_*ffa 5

来自CommandBehavior.SequentialAccess的文档:

“当您指定 SequentialAccess 时,您需要按照返回的顺序从列中读取数据,尽管您不需要读取每一列。一旦您读取了返回的数据流中的某个位置,则该位置或之前的数据无法再从 DataReader 读取位置。”

一旦你读完了TitleDescription,你就不能读ForumGroup,你只能从第四列(索引 3)及以后读取。

所以,你基本上有三个选择:

  • 使用不同的命令行为。
  • 指定从存储过程返回字段的顺序,以便它们与代码匹配。(您应该指定字段并且select *无论如何都不要使用。)
  • 首先将值读入变量,以便您可以按照返回的顺序读取它们,然后使用这些变量创建对象Forum