Передача результата хранимой процедуры в список в C # - PullRequest
0 голосов
/ 06 марта 2012

У меня есть хранимая процедура, которая возвращает список.Теперь я пытаюсь написать функцию, которая передаст хранимой процедуре правильный параметр, а затем вернет список, чтобы его можно было использовать на веб-странице asp.Я полностью потерян.

Я пробовал это до сих пор безрезультатно

public static List<RetrieveActiveMuseumByMuseumID_Result> GetActiveMuseum()
{
     using (MuseumDB db = new MuseumDB(ConfigurationManager.ConnectionStrings["MuseumDB"].ConnectionString))
     {
          List<RetrieveActiveMuseumByMuseumID_Result> listOrdered = new List<RetrieveActiveRigsWithEquipmentByOffice_Result>();
     }
  return listOrdered;
 }

Но это ничего не делает и не передает параметр SP, которыйis @ MuseumID

Помогите, пожалуйста, я не знаю, куда идти.

1 Ответ

3 голосов
/ 06 марта 2012

Для источников данных Asp.net: Список == плохо, Enumerable == хорошо.Оба могут быть использованы в качестве источника данных, но перечислимые, как правило, работают лучше, особенно для asp.net, где использование памяти так важно.Списки заставляют вас сохранить весь результат в памяти.Играйте в свои карты с перечисляемым количеством, и вам может понадобиться только одна запись в памяти за раз.

public static IEnumerable<RetrieveActiveMuseumByMuseumID_Result> GetActiveMuseum()
{
     using (var cn = new SqlConnection(ConfigurationManager.ConnectionStrings["MuseumDB"].ConnectionString))
     using (var cmd = new SqlCommand("StoredProcedureName", cn)
     {
          cmd.CommandType = CommandTypes.StoredProcedure;
          //you need to supply some of the information for this line: you didn't include it in your question
          cmd.Parameters.Add("@ParameterName", SqlDbTypes.???).Value = ParameterValue;

          cn.Open();
          using (var rdr = cmd.ExecuteReader())
          {
               while (rdr.Read())
               {  //you'll need to implement the static create method I used here
                   yield return new RetrieveActiveMuseumByMuseumID_Result.Create(rdr);
               }
          }
     }
 }

Для этого вашему типу RetrieveActiveMuseumByMuseumID_Result необходим статический метод Create(), который принимает IDataRecord и возвращает новый объект RetrieveActiveMuseumByMuseumID_Result (это соответствует шаблону Factory).

Я склонен абстрагировать этот шаблон от «мини-ORM», используя универсальный метод, который выглядит следующим образом:

public static IEnumerable<IDataRecord> GetData(string command, Action<SqlParameterCollection> addParameters)
{
    using (var cn = new SqlConnection( /* generic code for connection string here */ ));
    using (var cmd = new SqlCommand(command, cn))
    {
        addParameters(cmd.Parameters);

        cn.Open();
        using (var rdr = cmd.ExecuteReader())
        {
            while (rdr.Read())
            {
                yield return rdr;
            }
        }
    }
}

И тогда я бы назвал это для вашего запроса следующим образом:

public static IEnumerable<RetrieveActiveMuseumByMuseumID_Result> GetActiveMuseum()
{ 
     return GetData("exec StoredProcedureName @ParameterName", p => 
          {
             p.Add("@ParameterName", SqlDbTypes.???).Value = ParameterValue;
          }).Select(r => RetrieveActiveMuseumByMuseumID_Result.Create(r));
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...