【问题标题】:Attempt to read from column ordinal '0' is not valid尝试从列序号“0”读取无效
【发布时间】:2012-02-27 15:05:12
【问题描述】:

我在我的实体集合中的存储过程中的第一列 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

我的 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;
            }
        }
    }
}

【问题讨论】:

  • 请注意,如果您在 Watch 窗口中有以下内容并调试逐步执行。它会在 Debug 中出错,但在 Release 模式下不会出错。 Watch and Code 中的“reader[0]”会导致这个错误。删除任何会使光标前进的“光标”读取。

标签: c# asp.net sql entity-framework


【解决方案1】:
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.

【讨论】:

    【解决方案2】:

    来自CommandBehavior.SequentialAccess的文档:

    "当您指定 SequentialAccess 时,您需要从 列按它们返回的顺序排列,尽管您不是必需的 阅读每一列。一旦你读过了 返回的数据流,该位置或之前的数据不能再 从 DataReader 中读取。”

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

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

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

    【讨论】:

    • 好的,然后放什么,所以我没有得到那个错误。我只想阅读所有列,当我只使用 ExecuteReader 时,它说必须为此命令对象指定 CommandBehavior.SequentialAccess 属性。
    • 我在更改 CommandBehavior 时不断收到此错误。必须为此命令对象指定 CommandBehavior.SequentialAccess 属性。我更改了 select 语句的顺序,因为它出现在我的复杂类型中
    • @KDM:那么您就有了需要该命令行为的数据类型。您必须使用其他两个选项中的一些。
    • @downvoter:为什么要投反对票?如果你不说出你认为错的地方,它就无法改善答案。
    【解决方案3】:

    看看这个blog post.

    引用博文:

    如果您使用 SequentialAccess 打开阅读器,则必须阅读列 按顺序,您不能先读取第 1 列,然后再读取第 0 列。您有 反过来做。

    【讨论】:

    • 好的,然后放什么代替,所以我没有得到那个错误。我只想阅读所有专栏我该怎么做
    猜你喜欢
    • 1970-01-01
    • 2018-09-05
    • 1970-01-01
    • 1970-01-01
    • 2015-07-05
    • 2017-02-13
    • 2011-08-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多