C# IndexOutOfRangeException SqlDataReader从表中读取布尔值
我有3个表:users、feedid、body、title、link和userstofeedid、userid、feedid、isread,当我试图从userstofeed表读取bool值时,它会带来IndexOutOfRangeException。请告诉我我做错了什么C# IndexOutOfRangeException SqlDataReader从表中读取布尔值,c#,sql,sql-server,stored-procedures,sqldatareader,C#,Sql,Sql Server,Stored Procedures,Sqldatareader,我有3个表:users、feedid、body、title、link和userstofeedid、userid、feedid、isread,当我试图从userstofeed表读取bool值时,它会带来IndexOutOfRangeException。请告诉我我做错了什么 while (reader.Read()) { rssFeed.Title = reader["title"].ToString(); rssFeed.Body = reader["body"].ToStri
while (reader.Read())
{
rssFeed.Title = reader["title"].ToString();
rssFeed.Body = reader["body"].ToString();
rssFeed.Link = reader["link"].ToString();
rssFeed.IsRead = (bool) reader["isread"]; //IndexOutOfRangeException here
yield return rssFeed;
}
下面是sql存储过程:
create proc spGetItemsByUser
@userName nvarchar(50)
as
begin
declare @userId int
declare @feedId table (id int)
select @userId = id
from Users
where name = @userName
insert into @feedid (id)
select feedid, isread
from userstofeed
where userid = @userId
select * from feed where id in (select id from @feedId)
select isread from userstofeed where userid = @userId //Here I'm getting bit if it read or not
end
将存储过程中的选择更改为:
SELECT [feed].[title], [feed].[body], [feed].[link], [userstofeed].[isread]
FROM [feed]
INNER JOIN [userstofeed] ON ([userstofeed].userid = @userId)
WHERE [feed].[id] in (select id from @feedId)
我认为在您的版本中,isread不是第一个结果集的列。isread值作为行附加在标题、提要和正文的行之后
正如Zohar Peled所建议的,我尝试对整个存储过程进行重构:
CREATE PROC spGetItemsByUser
@userName nvarchar(50)
AS
BEGIN
SELECT [feed].[title], [feed].[body], [feed].[link], [userstofeed].[isread]
FROM [feed]
INNER JOIN [userstofeed] ON ([userstofeed].[feedid] = [feed].[id])
INNER JOIN [users] ON ([users].[id] = [userstofeed].[userid])
WHERE [users].[name] = @userName
END
将存储过程中的选择更改为:
SELECT [feed].[title], [feed].[body], [feed].[link], [userstofeed].[isread]
FROM [feed]
INNER JOIN [userstofeed] ON ([userstofeed].userid = @userId)
WHERE [feed].[id] in (select id from @feedId)
我认为在您的版本中,isread不是第一个结果集的列。isread值作为行附加在标题、提要和正文的行之后
正如Zohar Peled所建议的,我尝试对整个存储过程进行重构:
CREATE PROC spGetItemsByUser
@userName nvarchar(50)
AS
BEGIN
SELECT [feed].[title], [feed].[body], [feed].[link], [userstofeed].[isread]
FROM [feed]
INNER JOIN [userstofeed] ON ([userstofeed].[feedid] = [feed].[id])
INNER JOIN [users] ON ([users].[id] = [userstofeed].[userid])
WHERE [users].[name] = @userName
END
您的过程应生成错误,因为select语句中的值数与insert语句中的列数不同:列名或提供的值数与表定义不匹配。您的过程应生成错误,因为select语句中的值数与insert语句中的列数不同insert语句中的列数:提供的值的列名或数量与表定义不匹配。实际上,它们现在不是后面的一行-它们是第二个结果集,其中一行一列。它是可访问的,但需要不同的编码。实际上,它们现在不是一行接一行,而是一行一列的第二个结果集。它是可访问的,但需要不同的编码。