所以,我的SQL Server管理员让我可以访问带有5个参数的存储过程,这些参数返回15列数据。
但是,如果我想过滤非参数化的列,我只有几个选项。创建DataSet没有帮助,因为对数据库的查询只能是存储过程及其参数,而不是Select语句。
我错过了什么?
答案 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来保存数据。但是如果你期望从这个存储过程中收到非常大的数字或记录,这将无法很好地扩展。
注意:上面的代码未经测试,因此可能需要调整