执行标量返回 NULL 时引发的异常

本文关键字:异常 标量 返回 NULL 执行 | 更新日期: 2023-09-27 18:31:58

>我有一个存储过程,它根据某些条件返回标志值。存储过程不返回 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;

任何帮助将不胜感激!

执行标量返回 NULL 时引发的异常

> ExecuteScalar 用于返回包含一行和一列的结果集的存储过程,而不是获取存储的过程通过 return 语句返回的值。 因此,您必须在存储的进程中有一个Select语句。 是吗?

如果结果像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();
}

我犯了一个错误

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

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

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

无论如何,谢谢!