Tshumore Ответов: 2

Как вернуть выходные данные хранимой процедуры в список


У меня есть программа, которая отображает список значений, соответствующих определенным условиям. Когда я запускаю SP для извлечения значений в консольном приложении C# , я получаю System.Коллекции.Generic.List'1[StringsTest.Models.Брокер] печатается вместо результирующего набора. Однако работает старпома getCOAgents в SSMS возвращает мой желаемый набор результатов.
Мой SP выглядит следующим образом :
 CREATE PROCEDURE [dbo].[getCOAgents]    
    AS
    BEGIN   
SET NOCOUNT ON;
SELECT         a.agent_shortname
    FROM            BrokerTest AS a INNER JOIN
                         (SELECT        agent_shortname, COUNT(*) AS Expr1
                           FROM            BrokerTest
                           GROUP BY agent_shortname
                           HAVING         (COUNT(*) > 1)) AS b ON a.agent_shortname = b.agent_shortname
    WHERE        (a.agent_shortname LIKE '_________C%') AND (a.term = 
    'NB')
    ORDER BY a.agent_shortname
            END
            GO


Что я уже пробовал:

Этот SP возвращает список значений с символом C в индексе 10 . Я вызываю GetData() в основном методе консольного приложения, как показано ниже:

	namespace StringsTest
{
   class Program
    {
        static void Main(string[] args)
        {
 Console.WriteLine(GetData());
} } }


И функция как :
public static List<Broker> GetData()
        {          
            List<Broker> details = new List<Broker>();
            using (SqlConnection conn = new SqlConnection(Helpers.DatabaseConnect))
            {
                conn.Open();
                DataTable dt = new DataTable();
                SqlCommand cmd = new SqlCommand("getCOAgents", conn);
                cmd.CommandType = CommandType.StoredProcedure;               
                cmd.ExecuteNonQuery();
           
                SqlDataAdapter da = new SqlDataAdapter(cmd);
                da.Fill(dt);
                foreach (DataRow dr in dt.Rows)
                {
                    Broker broker = new Broker();
                    broker.Code = Convert.ToString(dr["agent_shortname"]);
                    details.Add(broker);
                }
                conn.Close();
            }
           return  details;
        }


Ожидаемый вывод в консоли (пример результирующего набора)

ALID-HEA-CO-001
ALID-HEA-CO-001
ALID-HEA-CO-001
ЭМИЛЬ-MTR-CO-012
ЭМИЛЬ-MTR-CO-012

2 Ответов

Рейтинг:
12

Richard Deeming

Простой:

static void Main()
{
    List<Broker> data = GetData();
    foreach (Broker broker in data)
    {
        Console.WriteLine(broker.Code);
    }
}


Рейтинг:
11

MadMyche

GetData возвращает список типов брокера и вашей консоли.WriteLine отражает именно это и работает так, как задумано. То, что вы действительно хотите сделать, - это повторить этот список. И есть несколько способов сделать это

Первый будет находиться в вашем основном модуле

static void Main(string[] args) {
 	List<Broker> BrokerList = GetData();
	foreach(Broker b in BrokerList) {
		Console.WriteLine(b);
	}
}
Другим было бы передать это в другую пустоту
private void DisplayList(List<Broker> bl) {
	foreach(Broker b in BrokerList) {
		Console.WriteLine(b);
	}
}
// alter Main to use this display method
static void Main(string[] args) {
 	List<Broker> BrokerList = GetData();
	DisplayList(BrokerList);
}
Есть и другие способы вы могли сделать это также... Если вы хотите супер-инкапсулировать это, вы создаете оболочку для брокерского списка и даете ему собственное переопределение ToString (), которое в основном будет зависеть от той же самой процедуры итерации
public class BrokerListWrapper {
	List<Broker> BrokerList { get; set; }
	public BrokerListWrapper(){}

	public override string ToString() {
		StringBuilder sb = new StringBuilder();
		foreach(Broker b in BrokerList) {
			sb.AppendLine(b);
		}
		return sb.ToString();
	}
}

Короче говоря... есть множество способов сделать то, что вы хотите, вам просто нужно знать, что вы хотите и как заставить это работать с помощью любого вызывающего метода


Tshumore

Спасибо за понимание. Я внес поправки, чтобы
static void Main(string[] args) {
Список<брокер&ГТ; списка посредников. = метода GetData();
по каждому элементу(Брокер B В списка посредников.) {
Приставка.WriteLine(b);
}
}
как и выше .. Консоль выводит список, но неверные значения :
StringsTest.Models.Посредник.
StringsTest.Models.Посредник
StringsTest.Models.Посредник
StringsTest.Models.Посредник
..........................
Похоже, GetData() все еще не извлекает значения. Может быть, это потому, что мой SP не имеет выходного параметра.

MadMyche

Отладки будет сообщать вам, если метода GetData является получение значений... И я скучал по этому код недвижимость в брокере так и должно быть на самом деле Console.WriteLine(b.Code);