【问题标题】:Exception thrown when ExecuteScalar returns NULLExecuteScalar 返回 NULL 时抛出异常
【发布时间】:2013-09-19 05:32:06
【问题描述】:

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

任何帮助将不胜感激!

【问题讨论】:

  • 你能用你的存储过程更新问题吗?

标签: c# ado.net


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    如果结果类似于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();
    }
    

    【讨论】:

      【解决方案3】:

      我错了

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

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

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

      还是谢谢!

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-12-22
        • 2012-06-08
        • 1970-01-01
        • 1970-01-01
        • 2017-03-10
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多