OUTPUT子句值与SQL Server中的另一个数据:C#

时间:2015-02-19 07:57:21

标签: c# sql-server

我使用下面的查询来获取另一个数据的OUTPUT子句值。

@PageIndex bigint=1,
@PageSize bigint=5,
@RecordCount bigint=0 OUTPUT,

Select ROW_NUMBER() OVER (ORDER BY EmpId ASC) AS RowNumber, 
        EmpId, 
        (Salutation + ' ' + FirstName + ' ' + LastName) as Name, 
        Specialties, 
        EmpPhoto 
INTO #Results 
from tblEmployee 
Where EmpType='Doctor'

Select @RecordCount = COUNT(*) from #Results

Select * 
from #Results 
Where RowNumber BETWEEN(@PageIndex -1) * @PageSize + 1 
AND(((@PageIndex -1) * @PageSize + 1) + @PageSize) - 1

DROP TABLE #Results

现在,我希望@RecordCount值与另一个Select查询数据相关联。如何在C#中获取它?我正在使用3层架构,因此我创建了具有DataTable数据类型的方法。那么,我需要做些什么改变?

2 个答案:

答案 0 :(得分:1)

// 1. Create the output parameter
var p = new SqlParameter("RecordCount", 0) { Direction = ParameterDirection.Output };

// 2. Make the SQL call
using (var con = new SqlConnection(connString))
using (var cmd = con.CreateCommand())
{
    cmd.Parameters.Add(p);

    using (var reader = cmd.ExecuteReader())
    {
        // Retrieve reader values from query
    }
}

// 3. Retrieve the value of the output parameter
var recordCount = (long)p;

另一种选择是重构SQL并执行

RETURN @@ROWCOUNT

可以使用以下内容在C#中检索(请注意,返回值仅限于int类型)

cmd.Parameters["@RETURN_VALUE"]

另外,避免像这样使用TempDb。这是不必要的。使用内置SQL分页

,更好的页面方式就是这样
SELECT ...
FROM ...
WHERE ...
ORDER BY ...
OFFSET (@PageIndex - 1) * @PageSize ROWS
FETCH NEXT @PageSize ROWS ONLY

答案 1 :(得分:0)

由于您没有显示您的c#代码 - 很难说您应该做什么更改

但基本上 - 您无法在脚本中使用output关键字。它应该是存储过程的输出参数 - 所以你必须将你的逻辑包装到存储过程中并从c#代码中调用它。

在这种情况下,您应该使用ParameterDirection.Output向SqlCommand添加参数。执行命令后,您可以从SqlParameter.Value属性中获取参数的返回值。