在我的存储过程中,我有 4 个不同的表选择查询,我必须将所有表数据存储在 c# List 中<>



我的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

最新更新