我的SQL存储过程如下:
CREATE PROCEDURE [dbo].[GetTradeByLevel](
@LevelId INT
)
AS
BEGIN
if(@LevelId=1)
BEGIN
select * from CHANNELCLASS
select a.* from accountmaster a join CHANNELCLASS b on a.ChannelClassificationId=b.ChannelClassificationId
select r.* from REGION r join accountmaster a on r.Accountid=a.AccountID
select s.* from STORE s join REGION r on s.RegionID=r.RegionId
END
else if(@LevelId=2)
BEGIN
select a.* from accountmaster a join CHANNELCLASS b on a.ChannelClassificationId=b.ChannelClassificationId
select r.* from REGION r join accountmaster a on r.Accountid=a.AccountID
select s.* from STORE s join REGION r on s.RegionID=r.RegionId
END
else if(@LevelId=3)
BEGIN
select r.* from REGION r join accountmaster a on r.Accountid=a.AccountID
select s.* from STORE s join REGION r on s.RegionID=r.RegionId
END
else if(@LevelId=4)
BEGIN
select s.* from STORE s join REGION r on s.RegionID=r.RegionId
END
END
GO
我必须在C#控制台应用程序中调用这个存储过程。如果我的参数值为1,则意味着我必须在C#List<>
中存储4个表值。我试过了,但它只存储第一个表的数据。
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data;
using System.Data.SqlClient;
namespace ConsoleApplication3
{
class Program
{
static void Main(string[] args)
{
int v = 1;
int cl;
SqlConnection con = new SqlConnection("Data Source=CTSINDLFVMOSS;Initial Catalog=DB_CGTPO_DEVE;User ID=DB_CGTPO_DEVE;Password=cgtpo");
con.Open();
SqlCommand cmd = new SqlCommand("GetTradeByLevel", con);
cmd.CommandType = CommandType.StoredProcedure;
cmd.Parameters.AddWithValue("@LevelId", v);
List<string> customers = new List<string>();
using (SqlDataReader dr = cmd.ExecuteReader())
{
cl = dr.FieldCount;
while (dr.Read())
{
for (int i = 0; i < cl; i++)
{
customers.Add(dr[i].ToString());
//customers.Add(dr[1].ToString());
//customers.Add(dr[2].ToString());
}
}
}
for (int i = 0; i < customers.Count; i++) // Loop through List with for
{
Console.WriteLine(customers[i]);
}
con.Close();
}
}
}
这是我的控制台应用程序页面。。。如果我的参数值为1,则意味着它必须存储4个表值,但它将只获取第一个表值任何人帮我,。。。。
yupes NextResult()
示例:
dim dr as sqldatareader = <your command that will return data>
while dr.read
'do stuff
end while
dr.NextResult()
while dr.read...
如果您在存储过程中执行多个选择,则所有选择都将包含在SqlDataReader
中,这只是您推进读取器的方法。。。
http://www.mindfiresolutions.com/NextResult-in-C-or-ADONET-data-reader-705.php
如果要返回多个表,最好使用适配器来填充数据集,而不是使用command.execute reader。
对于您的场景,数据集将是最佳选择。
SqlDataAdapter adp = new SqlDataAdapter(cmd);
DataSet ds=new DataSet();
adp.Fill(ds);
然后,您可以通过ds.tables[1]或ds.tables[2]进行检索。
这永远不会工作
级别1的SqlDataReader只会看到
select s.* from STORE s join REGION r on s.RegionID=r.RegionId
即在该逻辑路径中执行的最后一个选择语句。
每个结果集有一个sp,添加另一个参数,以获得1级结果1等。如果你在工作中这样做,我会让你大吃一惊。。。
或者,如果适用的话,你可以尝试某种形式的加入/联合。
回到绘图板上。
具有多个结果集的存储过程是许多持久性框架根本不支持的功能(这很遗憾)。我不确定使用经典的ADO.NET阅读器是否可以做到这一点,但Linq2Sql确实完全支持这种情况:
http://blogs.microsoft.co.il/blogs/bursteg/archive/2007/10/05/linq-to-sql-stored-procedures-with-multiple-results-imultipleresults.aspx