在SQL查询期间无效的Cast Exception

时间:2013-01-08 14:08:21

标签: c# sql

运营网站时出现异常消息

  

“无法将'System.DBNull'类型的对象强制转换为类型   'System.String'。“

从以下代码中'return (string)c.Parameters["@vat"].Value;'的'value'部分开始。我检查了存储过程以查看它是否执行查询,它确实并且它的输出也是一个字符串。任何人都可以帮忙.. ??

namespace CamOnlineAccess
{
  public class Utilities
  {
    public SqlConnection GetConnection()
    {
        SqlConnection c = new SqlConnection();
        c.ConnectionString = ConfigurationManager.ConnectionStrings["CamOnlineConnectionString"].ConnectionString;
        return c;
    }

    public SqlCommand GetCommandSP(string SPName)
    {
        SqlCommand c = new SqlCommand();
        c.Connection = GetConnection();
        c.CommandType = CommandType.StoredProcedure;
        c.CommandText = SPName;
        c.CommandTimeout = 150;

        return c;
    }
  }
}

public string ViewUserVat(string code)
{
    CamOnlineAccess.Utilities u = new CamOnlineAccess.Utilities();
    SqlCommand c = u.GetCommandSP("dbo.ViewUserVat");

    c.Parameters.AddRange(new System.Data.SqlClient.SqlParameter[] {
        new System.Data.SqlClient.SqlParameter("@code", System.Data.SqlDbType.VarChar,50),
            new System.Data.SqlClient.SqlParameter("@vat",SqlDbType.VarChar, 50, System.Data.ParameterDirection.Output, false, ((byte)(0)), ((byte)(0)), "", System.Data.DataRowVersion.Current, null)});
    c.Parameters["@code"].Value = code;
    c.Connection.Open();
    c.ExecuteScalar();//because we have output parameters
    c.Connection.Close();

    return (string)c.Parameters["@vat"].Value;
 }

简化程序

 ALTER PROCEDURE [dbo].[ViewUserVat] 
-- Add the parameters for the stored procedure here
@code varchar,
@vat varchar(50) output

    AS
SELECT top 1 @vat=vattable from dbo.portfolio 
where owner=@code

3 个答案:

答案 0 :(得分:2)

直接返回参数值,假设您的存储过程总是会找到参数@code的记录,而列vattable永远不会为空。

您可以看到并非如此,并且您获得DBNull作为回报 您应该将代码更改为

 return (c.Parameters["@vat"].Value == DBNull.Value ? 
              null : 
              c.Parameters["@vat"].Value.ToString());

当然,假设null是其余代码的允许/预期返回值 否则,您可以将null替换为另一个可接受的值(例如string.Empty)

答案 1 :(得分:0)

您可以使用:

return String.Format("{0}",c.Parameters["@vat"].Value);

代替。

答案 2 :(得分:0)

return (string)(c.Parameters["@vat"].Value == DBNull.Value
           ? null
           : c.Parameters["@vat"].Value);