C# 如何在读取带有三个select语句的存储过程时创建列表c
我正在尝试创建一个从存储过程中的列中获取的信息列表。我在存储过程中运行了三条select语句。返回一行6列。另外两个返回3列8行 例如: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?我想把我的
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