在ASP.NET中使用参数化存储过程

时间:2011-09-14 20:42:53

标签: asp.net stored-procedures

所以,我的SQL Server管理员让我可以访问带有5个参数的存储过程,这些参数返回15列数据。

但是,如果我想过滤非参数化的列,我只有几个选项。创建DataSet没有帮助,因为对数据库的查询只能是存储过程及其参数,而不是Select语句。

  • 我可以使用Linq-to-XML
  • 创建XML文件和查询
  • 我可以在另一个数据库中创建一些临时表并查询那些

我错过了什么?

4 个答案:

答案 0 :(得分:2)

一些想法......

1)你能问你的dba一个新的存储过程是否过滤(使用附加参数)你需要过滤的列?

2)你能编写自己的存储过程吗?如果是这样,你可以,例如声明一个表变量,使用你dba写的存储过程的exec插入它,然后使用你喜欢的任何过滤器从中选择。

3)重新:你的两个选项 - 那些将起作用 - 你可以把所有的数据都放到asp.net或xml文件中的数据表中,但是这会移动并暴露你在设计时知道的数据不需要,所以不是理想的解决方案。

4)您可以自己直接查询表格吗?

修改

您可以将(所有)数据带入数据表(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 :(得分:1)

  

创建DataSet没有帮助,因为对数据库的查询可以   只是存储过程及其参数,而不是Select语句。

可以使用存储过程填充DataSet。当您填满DataSet时,您可以使用您知道/喜欢的任何数据访问技术过滤记录。

marc_s是对的,得到一个新的DBA。如果他不想创建存储过程或向现有过程添加参数,那么当您真正需要的只是这些记录的子集时,他可能不会介意您的应用程序每次调用该存储过程时会获得1,700条记录。 / p>

答案 2 :(得分:1)

您可以将数据带回DataSet,然后使用DataView对象应用过滤器。简而言之,这将调用存储过程,将所有行收集到DataSet中,然后DataView将允许您枚举跳过与过滤器不匹配的行的数据。

以下是C#中的示例:C# DataView Usage

答案 3 :(得分:0)

如果您获得的记录数量不是很大,您可以这样做:

创建一个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();

这基本上可以在内存中完成所有操作,而不需要使用intermediaray来保存数据。但是如果你期望从这个存储过程中收到非常大的数字或记录,这将无法很好地扩展。

注意:上面的代码未经测试,因此可能需要调整