【问题标题】:Working with parameterized stored procedure in ASP.NET在 ASP.NET 中使用参数化存储过程
【发布时间】:2011-09-14 20:42:52
【问题描述】:

因此,我的 SQL Server 管理员允许我访问具有 5 个参数的存储过程,该过程返回 15 列数据。

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

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

我错过了什么?

【问题讨论】:

    标签: asp.net stored-procedures


    【解决方案1】:

    一些想法...

    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、2、3和4的答案都是否定的。
    【解决方案2】:

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

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

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

    【讨论】:

      【解决方案3】:

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

      这是一个 C# 示例:C# DataView Usage

      【讨论】:

        【解决方案4】:

        如果您返回的记录数量不多,您可以这样做:

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

        这基本上将在内存中完成所有操作,而无需中间位置来保存数据。但是,如果您希望从这个存储过程中接收到非常大的数字或记录,这将无法很好地扩展。

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

        【讨论】:

        • 大约有1700条记录。
        • 有多少用户?大约多久使用一次此功能?
        猜你喜欢
        • 2017-09-29
        • 1970-01-01
        • 1970-01-01
        • 2019-08-13
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-01-31
        • 2011-09-02
        相关资源
        最近更新 更多