【发布时间】:2011-09-14 20:42:52
【问题描述】:
因此,我的 SQL Server 管理员允许我访问具有 5 个参数的存储过程,该过程返回 15 列数据。
但是,如果我想过滤未参数化的列,我只有几个选项。创建 DataSet 没有帮助,因为对数据库的查询只能是存储的过程及其参数,而不是 Select 语句。
- 我可以创建一个 XML 文件并使用 Linq-to-XML 进行查询
- 我可以在另一个数据库中创建一些临时表并查询它们
我错过了什么?
【问题讨论】:
因此,我的 SQL Server 管理员允许我访问具有 5 个参数的存储过程,该过程返回 15 列数据。
但是,如果我想过滤未参数化的列,我只有几个选项。创建 DataSet 没有帮助,因为对数据库的查询只能是存储的过程及其参数,而不是 Select 语句。
我错过了什么?
【问题讨论】:
一些想法...
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
这并不理想,但考虑到局限性......
【讨论】:
创建数据集没有帮助,因为对数据库的查询可以 只能是存储过程及其参数,而不是 Select 语句。
可以使用存储过程填充数据集。当您填写数据集时,您可以使用您知道/喜欢的任何数据访问技术过滤记录。
marc_s 是对的,找一个新的 DBA。如果他不想创建存储过程或向现有过程添加参数,那么他可能不会介意您的应用程序在您每次调用该存储过程时获取 1,700 条记录,而您真正需要的只是这些记录的子集。
【讨论】:
您可以将数据带回 DataSet,然后使用 DataView 对象应用过滤器。简而言之,这将调用存储过程,将所有行收集到 DataSet 中,然后 DataView 会让您枚举数据,跳过与过滤器不匹配的行。
这是一个 C# 示例:C# DataView Usage
【讨论】:
如果您返回的记录数量不多,您可以这样做:
创建一个 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();
这基本上将在内存中完成所有操作,而无需中间位置来保存数据。但是,如果您希望从这个存储过程中接收到非常大的数字或记录,这将无法很好地扩展。
注意:以上代码未经测试,因此可能需要调整
【讨论】: