В моей хранимой процедуре у меня есть 4 разные таблицы, выберите запрос, я должен сохранить все эти данные таблицы в C # List <> - PullRequest
1 голос
/ 21 марта 2012

Моя хранимая процедура 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, это означает, что я должен хранить 4 табличных значения в C # List<>.Я пытался, но он хранит только данные первой таблицы.

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 табличных значения, но сначалатолько табличное значение, я должен хранить все 4 табличных значения, любое помогает мне, ....

Ответы [ 5 ]

1 голос
/ 21 марта 2012

Если вы собираетесь вернуть несколько таблиц, лучше использовать адаптер для заполнения набора данных вместо command.execute reader.

для вашего сценария набор данных будет лучшим вариантом.

SqlDataAdapter adp = new SqlDataAdapter(cmd);
DataSet ds=new DataSet();
adp.Fill(ds);

Затем вы можете перемещаться через ds.tables [1] или ds.tables [2].

1 голос
/ 21 марта 2012

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

0 голосов
/ 21 марта 2012

Хранимые процедуры с несколькими наборами результатов - это функция, которую многие каркасы персистентности вообще не поддерживают (что обидно).Я не уверен, что это можно сделать с помощью классических читателей ADO.NET, но Linq2Sql полностью поддерживает этот сценарий:

http://blogs.microsoft.co.il/blogs/bursteg/archive/2007/10/05/linq-to-sql-stored-procedures-with-multiple-results-imultipleresults.aspx

0 голосов
/ 21 марта 2012

Том сказал тебе правду.Это никогда не сработает. Можете ли вы показать свою базу данных и написать, какие данные вам нужны?

0 голосов
/ 21 марта 2012

Это никогда не сработает

Ваш SqlDataReader для уровня 1 только увидит

select s.* from STORE s join REGION r on s.RegionID=r.RegionId

т.е. последний оператор выбора, выполненный в этом логическом пути.

Либо есть один sp на набор результатов, добавьте еще один параметр, чтобы получить результат 1-го уровня, и т. Д. Я бы сказал вам, если бы вы сделали это на работе ...

Или, если применимо, вы можете попробовать какое-нибудь соединение / объединение.

Вернуться к чертежной доске.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...