为什么TableAdapter无法识别@parameter

时间:2015-06-28 09:24:30

标签: asp.net sql-server tsql tableadapter

我在Visual Studio 2013中使用表适配器查询配置向导从我的数据库中获取数据。对于像这样的一些查询:

SELECT *
FROM ItemsTable
ORDER BY date_of_creation desc, time_of_creation desc
OFFSET (@PageNumber - 1) * @RowsPerPage ROWS
FETCH NEXT @RowsPerPage ROWS ONLY

它不能将@pageNumber识别为paremeter,它不能生成具有这些参数的函数,而它适用于以下查询:

Select Top (@count) * from items_table

为什么第一个查询tableadapter无法生成带有上述参数的函数,而它可以为第二个生成函数,例如:tableadapter.getDataByCount(?int count)

我是否被迫使用存储过程,如果是,因为我对它一无所知如何?

更新:问题在DataSet编辑器(VS 2013)中的TableAdapter配置向导中确实发生,并且它不会生成具有这些参数的函数,有时它应该声明@RowsPerPage!但它应该使用这些参数生成一个函数我发现当我们在SELECT和WHERE之外的子句中不使用@parameter_name时会发生这种情况,例如在我们在Offset子句中使用了这个查询。

1 个答案:

答案 0 :(得分:0)

我不能告诉你如何在ASP中修复它,但这是一个简单的存储过程应该做同样的事情:

CREATE PROCEDURE dbo.ReturnPageOfItems
(
    @pageNumber     INT,
    @rowsPerPage    INT
)
AS
BEGIN;
    SELECT  *
    FROM    dbo.ItemsTable
    ORDER BY    date_of_creation desc,
                time_of_creation desc
    OFFSET (@pageNumber - 1) * @rowsperpage ROWS
    FETCH NEXT @rowsPerPage ROWS ONLY;
END;

这也比简单地传递查询更好,因为SQL Server将利用在第一次执行时为该过程创建的缓存查询计划。最好不要使用SELECT *,因为如果对所涉及的表进行架构更改,可能会给您带来维护问题,因此我建议您拼出您真正感兴趣的列。 CREATE PROCEDURE命令的文档可用here,它详细说明了您拥有的各种选项。但是,上面的代码应该可以正常工作。

如果您需要授予对应用程序用户的访问权限,以便他们可以使用此proc,则该代码为

GRANT EXECUTE ON OBJECT::dbo.ReturnPageOfItems TO userName;