当C#使用输出参数调用存储过程时,没有数据查询
我编写了一个带有输出参数的存储过程。我使用此存储过程执行查询操作 我想调用此存储过程从SQL Server获取数据,并使用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
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;
}
}