当C#使用输出参数调用存储过程时,没有数据查询

当C#使用输出参数调用存储过程时,没有数据查询,c#,sql-server,C#,Sql Server,我编写了一个带有输出参数的存储过程。我使用此存储过程执行查询操作 我想调用此存储过程从SQL Server获取数据,并使用C#获取输出参数的值 但我并没有得到数据和输出参数的值。我不知道为什么?你能帮我吗 存储过程代码: ALTER PROCEDURE [dbo].[SelectUserListProc] @pageSize int, @pageIndex int = 0, @newPageIndex int = -1 output AS BEGIN

我编写了一个带有输出参数的存储过程。我使用此存储过程执行查询操作

我想调用此存储过程从SQL Server获取数据,并使用C#获取输出参数的值

但我并没有得到数据和输出参数的值。我不知道为什么?你能帮我吗

存储过程代码:

ALTER PROCEDURE [dbo].[SelectUserListProc]
    @pageSize int,
    @pageIndex int = 0, 
    @newPageIndex int = -1 output 
AS
BEGIN       

    declare @recordsCount int;
    select @recordsCount = COUNT(ID) from [MyDB].[dbo].[UserList];
    declare @pageCount int;
    declare @mod int = @recordsCount % @pageSize;
    if (@mod = 0)
    begin
        set @pageCount = @recordsCount / @pageSize;
    end
    else if (@mod > 0)
    begin
        set @pageCount = @recordsCount / @pageSize + 1;
    end
    if (@pageIndex + 1 > @pageCount)
    begin
        set @newPageIndex = @pageIndex - 1;
        set @pageIndex = @newPageIndex;
    end
    else
    begin
        set @newPageIndex = -1;
    end
    select ID, 
           UserName, 
           Age, 
           Sex,
           Grade
    from [MyDB].[dbo].[UserList]
    order by ID
    offset @pageIndex * @pageSize rows
    fetch next @pageSize rows only;
END
C#代码


您应该在使用了SqlDataAdapter中的所有结果集(并将其处理掉)之后检索输出参数的值。尝试按如下方式重新构造代码:

DataTable=newdatatable();
使用(SqlDataAdapter SqlDataAdapter=newsqldataadapter(命令))
{
sqlDataAdapter.Fill(dataTable);
}
object value=command.Parameters[“@newPageIndex”].value;
newPageIndex=值!=空值&&value!=DBNull.Value?(int)值:-1;
返回数据表;

您应该在从SqlDataAdapter中使用所有结果集(并将其处理掉)之后检索输出参数的值。尝试按如下方式重新构造代码:

DataTable=newdatatable();
使用(SqlDataAdapter SqlDataAdapter=newsqldataadapter(命令))
{
sqlDataAdapter.Fill(dataTable);
}
object value=command.Parameters[“@newPageIndex”].value;
newPageIndex=值!=空值&&value!=DBNull.Value?(int)值:-1;
返回数据表;

您的意思是您没有在dataTable中获取任何数据?您是否测试了SP在SSMS中运行时是否按预期工作?您应该在使用了SqlDataAdapter中的所有结果集(并将其处理)后检索输出参数的值。尝试重新构造代码,以便在使用SqlDataAdapter之前创建DataTable,在using()块之后获取输出参数值,然后最终将DataTable返回给调用者。@AlwaysLearning相当肯定
Fill
也会加载输出参数。@DaleK SqlDataAdapter非常有趣和古怪,例如:.FillSchema()方法是已知的。您的意思是您没有在dataTable中获取任何数据?您是否测试了SP在SSMS中运行时是否按预期工作?您应该在使用了SqlDataAdapter中的所有结果集(并将其处理)后检索输出参数的值。尝试重新构造代码,以便在使用SqlDataAdapter之前创建DataTable,在using()块之后获取输出参数值,然后最终将DataTable返回给调用者。@AlwaysLearning相当肯定
Fill
也会加载输出参数。@DaleK SqlDataAdapter非常有趣和古怪,例如:.FillSchema()方法是已知的。
string selectSql = "[dbo].[SelectUserListProc]";

SqlParameter[] parameters = new SqlParameter[]
    {
        new SqlParameter("@pageSize", PageSize),
        new SqlParameter("@pageIndex", pageIndex),
        new SqlParameter("@newPageIndex", SqlDbType.Int){ Value = -1, Direction = ParameterDirection.Output }
    };

int newPageIndex;

DataTable dataTable = sqlHelper.SelectData(selectSql, out newPageIndex, parameters);

public DataTable SelectData(string sql, out int newPageIndex, params SqlParameter[] sqlParameters)
{
    try
    {
        string connStr = stringBuilder.ToString();

        using (SqlConnection connection = new SqlConnection(connStr))
        {
            connection.Open();

            using (SqlCommand command = new SqlCommand(sql, connection))
            {
                command.CommandType = CommandType.StoredProcedure;

                if (sqlParameters.Length > 0)
                {
                    command.Parameters.AddRange(sqlParameters);
                }

                using (SqlDataAdapter sqlDataAdapter = new SqlDataAdapter(command))
                {
                    DataTable dataTable = new DataTable();
                    sqlDataAdapter.Fill(dataTable);

                    //更新pageIndex
                    object value = command.Parameters["@newPageIndex"].Value;
                    newPageIndex = value != null && value != DBNull.Value ? (int)value : -1;
                    return dataTable;
                }
            }
        }
    }
    catch (SqlException e) 
    {
        throw e;
    }
    catch (Exception e)
    {
        throw e;
    }
}