Работа с параметризованной хранимой процедурой в ASP.NET - PullRequest
1 голос
/ 15 сентября 2011

Итак, мой администратор SQL Server предоставил мне доступ к хранимой процедуре с 5 параметрами, которая возвращает 15 столбцов данных.

Однако, если я хочу фильтровать столбцы, которые не параметризованы, у меня есть только несколько вариантов. Создание набора данных не помогает, поскольку запрос к базе данных может быть только сохраненным процессом и его параметрами, а не операторами Select.

  • Я могу создать файл XML и выполнить запрос, используя Linq-to-XML
  • Я могу создать несколько временных таблиц в другой базе данных и запросить их

Чего мне не хватает?

Ответы [ 4 ]

2 голосов
/ 15 сентября 2011

некоторые идеи ...

1) Можете ли вы запросить у вашей базы данных новую хранимую процедуру, которая фильтрует (используя дополнительные параметры) столбцы, по которым нужно фильтровать?

2) Можновы пишете свои собственные хранимые процедуры?Если это так, вы можете, например, объявить переменную таблицы, вставить в нее, используя exec, хранимую процедуру, написанную вашим dba, а затем выбрать из нее любые фильтры, которые вам нравятся.

3) re: your twoварианты - они будут работать - вы можете перетащить все данные в таблицу данных в asp.net или в файл xml, но это перемещение и демонстрация данных, которые вы знаете во время разработки, вам не понадобятся, поэтому не идеальное решение.

4) Можете ли вы непосредственно запросить таблицы (таблицы)?

РЕДАКТИРОВАТЬ

Вы можете перенести (все) данные вdatatable (asp.net), а затем отфильтруйте его там.Например (VB):

Dim myFilter as String
myFilter = "SomeField = SomeValue"

Dim myRows() as datarow
myRows = myDataSet.Tables(i).Select(myFilter)

For each myRow as datarow in myRows
   myNewDataTable.ImportRow(myRow)
Next

Это не идеально, но с учетом ограничений ...

1 голос
/ 15 сентября 2011

Вы можете вернуть данные обратно в DataSet, а затем использовать объект DataView для применения фильтра. Вкратце, это вызовет хранимую процедуру, соберет все строки в DataSet, а затем DataView позволит вам перечислить данные, пропускающие строки, которые не соответствуют фильтру.

Вот пример в C #: C # Использование DataView

1 голос
/ 15 сентября 2011

Создание DataSet не помогает, так как запрос к базе данных может только хранимый процесс и его параметры, а не операторы Select.

Набор данных может быть заполнен с использованием хранимой процедуры. Когда вы заполняете свой DataSet, вы фильтруете записи, используя любую доступную вам технологию доступа к данным.

marc_s прав, получите нового администратора БД. Если он не хочет создавать хранимую процедуру или добавлять параметры в существующую процедуру, то он, вероятно, не будет возражать против того, чтобы ваше приложение получало 1700 записей каждый раз, когда вы вызываете эту хранимую процедуру, когда все, что вам действительно нужно, это подмножество этих записей. 1007 *

0 голосов
/ 15 сентября 2011

Если количество возвращаемых вами записей невелико, вы можете сделать это:

Создать класс POCO для представления записи данных, возвращаемой из сохраненного процесса:

public class MyRecord
{
  Field1Name { get; set;}
  ...
  Field10Name { get; set;}
} 

Заполните List<MyRecord> результатами, возвращаемыми из вашего сохраненного процесса:

List<MyRecord> mylist = new List<MyRecord>();
foreach(record in collectionOfRecordsFromStoredProc)
{
  mylist.Add(new MyRecord {  
        Field1Name = "", /* retrieve your value from record here */
        ...
        Field10Name = "" /* retrieve your value from record here */
  });
}

Затем вы можете запросить эти результаты, используя стандартный Linq to Objects:

List<MyRecord> filteredRecords = mylist.Where(x => x.Field10Name.Contains("Smith")).ToList();

Это по существу будетделать все в памяти без промежуточного массива, чтобы сохранить данные.Но это не будет хорошо масштабироваться, если вы ожидаете получить очень большие числа или записи от этого сохраненного процесса.

ПРИМЕЧАНИЕ: приведенный выше код не проверен, поэтому, вероятно, потребуется подстройка

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