множественный набор результатов asp.net из proc: необходимо ли отображать результаты в класс?Если так, то как? - PullRequest
1 голос
/ 26 ноября 2010

Пожалуйста, рассмотрите следующий сценарий.

У вас есть сохраненный процесс, возвращающий множество результатов для Запросы выполняются в целях отчетности.

В процедуре также используются табличные параметры (SQL 2008). http://www.sommarskog.se/arrays-in-sql-2008.html#LINQ_EF

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

Эти наборы результатов не отображаются ни в одну таблицу в базе данных; это отчеты о результатах, а не зеркала таблиц базы данных.

Теперь, мой фон - классика Аспа, и пока я пытаюсь прочитать кажется, что для всех стратегий доступа к данным .NET: (1) MS продвигает Entity Framework (2) MS обладает множеством стратегий доступа к данным / архитектуры (3) вся тема является постоянным предметом обсуждения (4) обстоятельства проекта помогают определить правильную стратегию доступа к данным, и ORM не кажется оптимизированным для этого сценария доступа к данным (5) не существует готового решения для отображения нескольких сохраненных процедур с наборами результатов

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

Я считаю, что программная модель Web Forms не обеспечивает полного разделения кода и контента, и могут быть такими же «спагетти», как классика жереха. (MVC подход кажется гораздо более похожим на asp classic, но этот проект уже является WebForms.)

Я думаю, что это было бы довольно легко реализовать, если бы доступ к данным и встроенные сценарии <%%> были на одной странице. Вот пример кода, который может привести:

<%
' data access (skipping a bunch of code)....
Dim myDataSet As New DataSet()
myCommand.Fill(myDataSet)
'...etc.    

Teachers = myDataSet.Tables(0).Rows
Students = myDataSet.Tables(1).Rows
'... etc.%>

затем

<%  If Teachers.Count > 0 Then%>
<table><%  For Each _Teachers In Teachers%>
    <tr>
        <td><%= _Teachers(0)%></td>
        <td><%= _Teachers(1)%></td>
    </tr><% Next %>    
</table>
<%  Else%>Hey, there's no records.<% End If %> 

(Когда я пытаюсь разделить доступ к данным в программном коде под «Protected Sub Page_Load ...» переменные в коде, который я использую на странице .aspx, продолжают выдавать ошибку: «[переменная] не объявлена. Может быть недоступна из-за уровня защиты.»)

Если наборы результатов из процедуры не являются строго типизированными, это конец света, ужасная практика программирования, кошмар ремонтопригодности, худший из возможных вариантов и т. д.?

Если наборы результатов из хранимого процесса должны быть строго напечатаны, тогда какой самый эффективный способ сделать это? (Я не найти простые учебники по этой теме.)

Заранее спасибо за любую помощь.

1 Ответ

0 голосов
/ 26 ноября 2010

Звучит так, будто вы спрашиваете, следует ли вам продолжать использовать контейнеры ADO.NET или классы пользовательских доменов для ваших данных.

Если вы чувствуете, что вам требуется строгая типизация класса и некоторая проверка ввода или другой логики, примененной к вашим данным перед отображением, тогда подумайте о написании метода для преобразования DataTable в коллекцию YourClass. В противном случае, если это для отображения, то нет ничего плохого в том, чтобы придерживаться DataTable. Если вы предоставляете интерфейс для других компонентов или вам нужны функции, которые дает вам класс, используйте строгую типизацию класса.

public IEnumerable<Teacher> ConvertToTeachers(DataTable dt)
{
    foreach (var row in dt.Rows.AsEnumerable())
    {
        //create a teacher from this row. modify row indexers as required.
        yield return new Teacher{ TeacherName = row["Name"].Value,
                                  Location = row["Location"].Value };
    }   
}

На уровне представления рассмотрите возможность использования серверных элементов управления, предоставляемых веб-формами ASP.NET. Они предоставляют возможности привязки данных, которые устраняют все эти циклы.

  • Убедитесь, что ваш gridview разработан так, как вам нравится. Правильные столбцы, содержащие нужные данные: обычные связанные поля и гиперссылки.

  • привязать ваши данные к сетке.

 gridViewTeachers.DataSource = myDataSet.Tables(0).Rows
 gridViewTeachers.DataBind
...