我有一个存储过程,它根据特定条件返回标志值。存储过程不返回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;
非常感谢任何帮助!
答案 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);
非常感谢!