ExecuteScalar返回NULL时抛出异常

时间:2013-09-19 05:32:06

标签: c# ado.net

我有一个存储过程,它根据特定条件返回标志值。存储过程不返回NULL值,它根据某些条件返回1,2或3。但是当我调试时,我的ADO.NET代码抛出异常,因为ExecuteScalar正在返回NULL

这是我的ADO.NET代码:

SqlCommand cmd = new SqlCommand("sp_checkifexists", con);
cmd.CommandType = System.Data.CommandType.StoredProcedure;
cmd.Parameters.AddWithValue("@Name",name);
cmd.Parameters.AddWithValue("@Regno",regno);
cmd.Parameters.Add("@flag", System.Data.SqlDbType.VarChar, 40);
cmd.Parameters["@flag"].Direction = System.Data.ParameterDirection.Output;
con.Open();

// Error occcurs here

int NoOfRows = Convert.ToInt16(cmd.ExecuteScalar());
con.Close();
int flag = (int)cmd.Parameters["@flag"].Value;
return flag;

非常感谢任何帮助!

3 个答案:

答案 0 :(得分:0)

ExecuteScalar用于存储过程,它返回带有一行的结果集,以及一列 not ,以获取存储过程通过return语句返回的值。所以你必须在存储过程中有一个Select语句。你呢?

答案 1 :(得分:0)

如果结果与1,2,3相似,则Convert.ToInt16将失败。你需要有1

之类的值
//check what you have return from  `ExecuteScalar` 

var obj = cmd.ExecuteScalar();

if(obj  != DBNull.Value)
{
  //if you have received obj as `1` or `2` etc
  int NoOfRows = Convert.ToInt16(obj) ;
  if you have received obj as `1,2,3`
  List<Int16> valueList = obj.ToString().Split(',').Select(x => Convert.ToInt16(x)).ToList();
}

答案 2 :(得分:0)

我在

中犯了错误
cmd.Parameters.Add("@flag", System.Data.SqlDbType.VarChar, 40);

它是一个整数值,所以必须是

 cmd.Parameters.Add("@flag", System.Data.SqlDbType.Int);

非常感谢!