2016-03-23 10 views
1

Ich habe 3 Tabellen: users, feed(id,body,title,link) und userstofeed(id,userid,feedid,isread) während ich versuche, Bool Wert von userstofeed Tabelle zu lesen es IndexOutOfRangeException bringen. Sagen Sie mir bitte, was ich falschIndexOutOfRangeException SqlDataReader Lesen Bool Wert aus der Tabelle

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

Und hier SQL-store Verfahren so mache:

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

Ihre Prozedur sollte einen Fehler, da die Anzahl der Werte in der select-Anweisung ist dann die Anzahl unterschiedlicher erzeugen der Spalten in der INSERT-Anweisung: 'Spaltenname oder Anzahl der übergebenen Werte stimmt nicht mit der Tabellendefinition überein. –

Antwort

6

Ändern der SELECT s in Ihrer gespeicherten Prozedur dazu:

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) 

Ich denke, in Ihre Version isread ist keine Spalte der ersten Ergebnismenge. Die isread Werte werden als Zeilen nach den Zeilen für title, feed und body angefügt.


Als Zohar Peled vorgeschlagen, ich versuche, ein Refactoring für die gesamte gespeicherte Prozedur zu geben:

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

Eigentlich sind sie jetzt keine Zeile danach - sie sind eine zweite Ergebnismenge mit einer Zeile von einer Spalte. Es ist zugänglich, erfordert aber eine andere Codierung. – TomTom

Verwandte Themen