C# 如何在读取带有三个select语句的存储过程时创建列表c

C# 如何在读取带有三个select语句的存储过程时创建列表c,c#,stored-procedures,C#,Stored Procedures,我正在尝试创建一个从存储过程中的列中获取的信息列表。我在存储过程中运行了三条select语句。返回一行6列。另外两个返回3列8行 例如: A B C D E F//select one one row of results G H I//select two 8 rows of results G H I//select three 8 rows of results 问题是我得到了一个索引超出范围的异常,我给列表赋值。我猜这是因为它返回的两个语句,因为它们都说FaultStart?我想把我的

我正在尝试创建一个从存储过程中的列中获取的信息列表。我在存储过程中运行了三条select语句。返回一行6列。另外两个返回3列8行

例如:

A B C D E F//select one
one row of results
G H I//select two
8 rows of results
G H I//select three
8 rows of results
问题是我得到了一个索引超出范围的异常,我给列表赋值。我猜这是因为它返回的两个语句,因为它们都说FaultStart?我想把我的阅读器限制在前8行,但是我需要的最后8行呢。如何获得具有相同行名称的两个select语句的返回

SqlCommand cmd = new SqlCommand("L_getDownTimeByLine", conn);
cmd.Parameters.Add("@startTime", SqlDbType.DateTime, 30).Value = RadDateTimePicker2.SelectedDate;
cmd.Parameters.Add("@endTime", SqlDbType.DateTime, 30).Value = RadDateTimePicker3.SelectedDate;
cmd.Parameters.Add("@line", SqlDbType.Int, 2).Value = 1;
cmd.CommandType = CommandType.StoredProcedure;
conn.Open();

List<string> test = new List<string>();

SqlDataAdapter da = new SqlDataAdapter(cmd);

SqlDataReader dr = cmd.ExecuteReader();

while (dr.Read())
{
    Line1ADT = dr["A Line Down Time"].ToString();
    Line1ADP = dr["A Line Percentage"].ToString();
    Line1BDT = dr["B Line Down Time"].ToString();
    Line1BDP = dr["B Line Percentage"].ToString();
    Line1TDT = dr["Total Down Time"].ToString();
    Line1TDP = dr["Total Percentage"].ToString();
    test.Add((dr["FaultStart"].ToString()));//here is where my problem is.

}
dr.Close();
存储过程

    SET @QueryA = N'
select min(DateAndTime) as FaultStart, max(DateAndTime) as FaultEnd, cast(max(DateAndTime) - min(DateAndTime) as time) as DownTime
from (select pt.*,
             sum(case when datediff(second, prevdt, DateAndTime) <= 1 then 0 else 1 end) over 
                 (order by DateAndTime) as grp
      from (select pt.*, lag(DateAndTime) over (order by DateAndTime) as prevdt
            from IncomingProductTracker pt
            where ' + @lineAvariable + ' = 1 and
                 DateAndTime > @startTime1 and
                  DateAndTime < @endTime1
           ) pt
     ) pt
     group by grp
having cast(max(DateAndTime) - min(DateAndTime) as time) < @breakAllowance1
order by FaultStart';

SET @ParamsA = N'@startTime1 datetime, @endTime1 datetime, @breakAllowance1 time(0)';

SET @QueryB = N'
select min(DateAndTime) as FaultStart, max(DateAndTime) as FaultEnd, cast(max(DateAndTime) - min(DateAndTime) as time) as DownTime
from (select pt.*,
             sum(case when datediff(second, prevdt, DateAndTime) <= 1 then 0 else 1 end) over 
                 (order by DateAndTime) as grp
      from (select pt.*, lag(DateAndTime) over (order by DateAndTime) as prevdt
            from IncomingProductTracker pt
            where ' + @lineBvariable + ' = 1 and
                 DateAndTime > @startTime1 and
                  DateAndTime < @endTime1
           ) pt
     ) pt
     group by grp
having cast(max(DateAndTime) - min(DateAndTime) as time) < @breakAllowance1
order by FaultStart';

SET @ParamsB = N'@startTime1 datetime, @endTime1 datetime, @breakAllowance1 time(0)';

declare @tempA table (
    FaultStart datetime,
    FaultEnd datetime,
    DownTime time(0))

declare @tempB table (
    FaultStart datetime,
    FaultEnd datetime,
    DownTime time(0))

insert into @tempA (FaultStart, FaultEnd, DownTime)
    EXEC sp_executesql @QueryA, @ParamsA, @startTime1 = @startTime, @endTime1 = @endTime, @breakAllowance1 = @breakAllowance;
insert into @tempB (FaultStart, FaultEnd, DownTime)
    EXEC sp_executesql @QueryB, @ParamsB, @startTime1 = @startTime, @endTime1 = @endTime, @breakAllowance1 = @breakAllowance;

select @aLineDownTime as [A Line Down Time], convert(nvarchar, @aLinePercentage) + '%' as [A Line Percentage], @bLineDownTime as [B Line Down Time], convert(nvarchar, @bLinePercentage) + '%' as [B Line Percentage], @totalDownTime as [Total Down Time], convert(nvarchar, @totalPercentage) + '%' as [Total Percentage]

--Here's what we return, 3 different select statements
select *
FROM @tempA

select *
FROM @tempB

你能在你的帖子中添加exception.Message或stack trace吗?我有一些关于出错原因的想法,但是如果没有看到你返回的sql,推测就没有意义了。你能发布你的狂欢吗?或者至少是正在进行的相关sqlreturned@Brandon“是的,等等。”布兰登追查。是的,我从来没有试过做你在这里做的事,所以这是一个危险信号。这可能更适合于两种不同的存储过程,一种使用临时表,另一种使用linedowntime。至少,将这些列放入一个union all可以解决您的问题,因为您将被迫为所有5列创建一个值。
    SET @QueryA = N'
select min(DateAndTime) as FaultStart, max(DateAndTime) as FaultEnd, cast(max(DateAndTime) - min(DateAndTime) as time) as DownTime
from (select pt.*,
             sum(case when datediff(second, prevdt, DateAndTime) <= 1 then 0 else 1 end) over 
                 (order by DateAndTime) as grp
      from (select pt.*, lag(DateAndTime) over (order by DateAndTime) as prevdt
            from IncomingProductTracker pt
            where ' + @lineAvariable + ' = 1 and
                 DateAndTime > @startTime1 and
                  DateAndTime < @endTime1
           ) pt
     ) pt
     group by grp
having cast(max(DateAndTime) - min(DateAndTime) as time) < @breakAllowance1
order by FaultStart';

SET @ParamsA = N'@startTime1 datetime, @endTime1 datetime, @breakAllowance1 time(0)';

SET @QueryB = N'
select min(DateAndTime) as FaultStart, max(DateAndTime) as FaultEnd, cast(max(DateAndTime) - min(DateAndTime) as time) as DownTime
from (select pt.*,
             sum(case when datediff(second, prevdt, DateAndTime) <= 1 then 0 else 1 end) over 
                 (order by DateAndTime) as grp
      from (select pt.*, lag(DateAndTime) over (order by DateAndTime) as prevdt
            from IncomingProductTracker pt
            where ' + @lineBvariable + ' = 1 and
                 DateAndTime > @startTime1 and
                  DateAndTime < @endTime1
           ) pt
     ) pt
     group by grp
having cast(max(DateAndTime) - min(DateAndTime) as time) < @breakAllowance1
order by FaultStart';

SET @ParamsB = N'@startTime1 datetime, @endTime1 datetime, @breakAllowance1 time(0)';

declare @tempA table (
    FaultStart datetime,
    FaultEnd datetime,
    DownTime time(0))

declare @tempB table (
    FaultStart datetime,
    FaultEnd datetime,
    DownTime time(0))

insert into @tempA (FaultStart, FaultEnd, DownTime)
    EXEC sp_executesql @QueryA, @ParamsA, @startTime1 = @startTime, @endTime1 = @endTime, @breakAllowance1 = @breakAllowance;
insert into @tempB (FaultStart, FaultEnd, DownTime)
    EXEC sp_executesql @QueryB, @ParamsB, @startTime1 = @startTime, @endTime1 = @endTime, @breakAllowance1 = @breakAllowance;

select @aLineDownTime as [A Line Down Time], convert(nvarchar, @aLinePercentage) + '%' as [A Line Percentage], @bLineDownTime as [B Line Down Time], convert(nvarchar, @bLinePercentage) + '%' as [B Line Percentage], @totalDownTime as [Total Down Time], convert(nvarchar, @totalPercentage) + '%' as [Total Percentage]

--Here's what we return, 3 different select statements
select *
FROM @tempA

select *
FROM @tempB