SqlDataReader.ExecuteReader();即使提供了所有参数,也会返回空对象

时间:2019-02-12 06:46:05

标签: c# sql-server sqldatareader sqlconnection executereader

SqlConnection connection = Connect();

SqlCommand command = new SqlCommand();
command.CommandType = CommandType.StoredProcedure;
command.CommandText = sprocName;
command.Connection = connection;
//loop through the dictionary
foreach (string key in paramList.Keys)
{
        command.Parameters.AddWithValue(key, paramList[key]);
}
SqlDataReader dataReader = command.ExecuteReader();

我正在尝试从数据库读取数据,当我传递相同的参数并执行SP时,我会得到正确的结果。但是在SqlDataReader dataReader = command.ExecuteReader();处,当我检查(dataReader.HasRows)时,它返回false!

2 个答案:

答案 0 :(得分:0)

您的密钥是否包含'@',例如,如果密钥参数名称 EmployeeId 然后需要添加以下参数

commnad.Parameters.AddWithValue('@EmployeeId', 1);

答案 1 :(得分:0)

  

执行up_GetAtt @ pageNumber = 1,@ pagesize = 10,@ PID = 1000,@ DeID = NULL,   @DeName = NULL,@ SortByColumn ='ReleaseDate',@ SortOrder ='DESC'这是   我要传递的参数

您需要将C#空值转换为DBNull

SqlConnection connection = Connect();

SqlCommand command = new SqlCommand();
command.CommandType = CommandType.StoredProcedure;
command.CommandText = sprocName;
command.Connection = connection;
//loop through the dictionary
foreach (string key in paramList.Keys)
{
        command.Parameters.AddWithValue(key, paramList[key] == NULL? DBNull.Value : paramList[key]);
}
SqlDataReader dataReader = command.ExecuteReader();

鉴于缺少信息可以帮助您更好,请检查常见错误

  • proc和参数名称中的错字
  • 使用CommandType.StoredProcedure发送查询:sprocName值必须仅为“ up_GetAtt”,这是包含EXEC字或参数的常见错误。
  • 检查值类型,您的paramList应该是一个字典,并且您放入该列表中的项目的值类型应该与sql等效类型匹配,并非所有类型都具有隐式转换。
  • 检查paramList项的可空性,使用可空的int和datetime
  • 检查参数名称是否以@
  • 开头
  • 省略参数并不意味着它为空,除非您的存储过程定义将其默认为空
  • 在过程定义中省略没有默认值的参数
  • 不必要的值引号,您正在发送参数值,它不是concat