2016-03-23 5 views
1

Я 3 таблицы: users, feed(id,body,title,link) и userstofeed(id,userid,feedid,isread) в то время как я пытаюсь читать Ее значение из таблицы userstofeed это принесет IndexOutOfRangeException. Скажи мне, что, пожалуйста, что я делаю неправильноIndexOutOfRangeException SqlDataReader чтение булева значение из таблицы

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 
+0

Ваша процедура должна сгенерировать ошибку, поскольку число значений в операторе отбора отличается, то число столбцов в инструкции insert: 'Имя столбца или количество заданных значений не соответствует определению таблицы.' –

ответ

6

Изменить в SELECT с в хранимой процедуре это:

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 добавляются в виде строк после строк для title, feed и body.


Как предложил Зоар 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 
+0

Фактически они теперь не являются строкой после - это второй набор результатов с одной строкой из столбцов. Он доступен, но требует различного кодирования. – TomTom