【问题标题】:Limit rows returned using TableAdapter (typed DataSets)限制使用 TableAdapter 返回的行(类型化数据集)
【发布时间】:2009-11-04 13:26:28
【问题描述】:

有谁知道使用类型化 TableAdapter 时限制返回的行数的最佳方法?选项似乎是:

  1. 将“top X”作为参数传递(在我们使用 SQLS2008 之前不能这样做
  2. 在调用我的 tableadapter 方法之前发出动态 SQL 语句:set rowcount X,然后是set rowcount 0
  3. 其他我没想到的东西:)。

非常感谢。

【问题讨论】:

    标签: .net sql tableadapter rowcount


    【解决方案1】:

    你可以使用 TOP n,但你必须像这样在它周围加上括号:

    SELECT TOP (100) * FROM ...
    

    您也可以按如下方式对其进行参数化:

    DECLARE @count INT
    SET @count = 100
    SELECT TOP (@count) * FROM field_company
    

    【讨论】:

    • 如果你可以更新它以使值 100 参数化,你可以有一点:P
    【解决方案2】:

    这对我来说很好。

    SELECT DISTINCT TOP (@count) FLD1, FLD2 FROM mytable WITH (nolock)
    

    该参数与 TableAdapter 中的任何其他参数一起生成。

    【讨论】:

      【解决方案3】:

      我使用参数化存储过程来实现这一点。

      创建过程 dbo.spFoo @NoOfRows 整数 = 200 作为 声明@sql varchar(2000) 选择@sql = '选择顶部' + Cast(@NoOfRows as varchar) + ' * FROM Foo' 执行(@sql)

      【讨论】:

      • 嗯,很遗憾,我不会使用存储过程。此外,您确定可以在 SQL Server 2005 中参数化“TOP”的值,即使在存储过程中也是如此?
      【解决方案4】:

      我找到了更好的方法。

      您无法参数化“TOP”值,但您可以参数化“SET ROWCOUNT X”值。

      因此,这是可行的:

      create procedure test_SelectTopFromTable (@rowCount int) as
      begin
          set rowcount @rowCount
          select * from table
          set rowcount 0
      end
      
      exec test_SelectTopFromTable 100
      

      但是我确实需要处理发生的异常,这将阻止 set rowcount 0 语句运行。我会继续挖掘。

      更新
      我的老板告诉我如何让它发挥作用(它是如此简单,我有点尴尬)但我会让他发布他的答案,而不是让它看起来像是我自己找到的。 :)

      【讨论】:

        【解决方案5】:

        TableadApter 使用 SqlDataAdapter,已经有了这个功能

        做什么:

        点击Fill()FillByXXX()方法

        myTradesTableAdapter.Fill(...)
        

        然后按 F12 - 它会将您带到设计师生成的源代码复制这个方法。

        转到 DataSet 设计器,点击 table adapter 并按 F7 - 它会为 TableAdapters 命名空间创建/打开代码

        在此处粘贴 Fill() 方法修改如下例所示:

        namespace MyApp.DsMyDataTableAdapters {
        
        public partial class MyTradesTableAdapter
        {
            //// copy-paste method from generated Fill()
            //// and make new name: Fill() ==> FillTop()
            //// use the same params and add new one: int topN
            public virtual int FillTop(             //
                 DsMyData.MyTradesDataTable dataTable,
                 int someParameterId,
                 // ...
                 int topN)  // add new param
            {
                // original code:
                this.Adapter.SelectCommand = this.CommandCollection[0];
                this.Adapter.SelectCommand.Parameters[1].Value = someParameterId;
        
                if ((this.ClearBeforeFill == true))
                {
                    dataTable.Clear();
                }
        
        
                // modified code
                int returnValue = 0;
                if (topN > 0)                  // validate topN
                {
                    // get topN rows
                    returnValue = this.Adapter.Fill(0, topN, dataTable);   
        
                }
                else 
                {
                    // get all rows (original code) in case topN = 0 or negative
                    returnValue = this.Adapter.Fill(dataTable);
                }
                return returnValue;
            }
        
            // ....
        }
        

        然后你可以使用它

        int somePrm = 123;
        myTradesTableAdapter.Fill(ds.myTradesTable, somePrm) // original - get all rows
        myTradesTableAdapter.FillTop(ds.myTradesTable, somePrm, 100) // new - get 100 rows
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2011-01-05
          • 2021-02-05
          • 2015-05-09
          • 2012-10-18
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多