对象不能从DBNull转换为其他类型 [英] Object cannot be cast from DBNull to other types

查看:349
本文介绍了对象不能从DBNull转换为其他类型的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

对象不能从DBNull转换为其他类型。

我有一个下面的函数会抛出上述错误。我在处理存储过程,并在C#code所有空值。

所以它从哪儿得到这个错误?

我可以看到在catch块中的错误。但我不理解这行下面创建()得到的错误。

 公共布尔创建(DataTO DataTO)
{
    IDbTrans交易= NULL;
    IDbCmd IDbCmd;

    字符串EncryptedPassword =加密(DataTO.txtPwd);
    基地dataAccCom = NULL;

    尝试
    {
        dataAccCom = Factory.Create();
        dataAccCom.OpenConnection();
        交易= dataAccCom.BeginTransaction();
        IDbCmd = dataAccCom.CreateCommand(sp_Register,真正的);
        dataAccCom.AddParameter(IDbCmdop_Id,DbType.Int64,0,ParameterDirection.Output);
        dataAccCom.AddParameter(IDbCmdp_dlstTitle,DbType.String,ReplaceNull(DataTO.dlstTitle));
        dataAccCom.AddParameter(IDbCmdp_txtFirstName,DbType.String,ReplaceNull(DataTO.txtFirstName));
        dataAccCom.AddParameter(IDbCmdp_txtMiddleName,DbType.String,ReplaceNull(DataTO.txtMiddleName));
        dataAccCom.AddParameter(IDbCmdp_txtLastName,DbType.String,ReplaceNull(DataTO.txtLastName));
        dataAccCom.AddParameter(IDbCmd,p_txtDob,DbType.DateTime,DataTO.txtDob);
        dataAccCom.AddParameter(IDbCmdp_txtDesig,DbType.String,ReplaceNull(DataTO.txtDesig));
        dataAccCom.AddParameter(IDbCmdp_txtOFlatNo,DbType.String,ReplaceNull(DataTO.txtOFlatNo));
        dataAccCom.AddParameter(IDbCmdp_txtOBuild,DbType.String,ReplaceNull(DataTO.txtOBuild));
        dataAccCom.AddParameter(IDbCmdp_txtOPost,DbType.String,ReplaceNull(DataTO.txtOPost));
        dataAccCom.AddParameter(IDbCmdp_txtOArea,DbType.String,ReplaceNull(DataTO.txtOArea));
        dataAccCom.AddParameter(IDbCmdp_txtOCity,DbType.String,ReplaceNull(DataTO.txtOCity));
        dataAccCom.AddParameter(IDbCmdp_txtRBuild,DbType.String,ReplaceNull(DataTO.txtRBuild));
        dataAccCom.AddParameter(IDbCmdp_txtRPost,DbType.String,ReplaceNull(DataTO.txtRPost));
        dataAccCom.AddParameter(IDbCmdp_txtUserID,DbType.String,ReplaceNull(DataTO.txtUserID));
        dataAccCom.AddParameter(IDbCmdp_txtPwd,DbType.String,ReplaceNull(EncryptedPassword));
        dataAccCom.ExecuteNonQuery(IDbCmd);
        DataTO.Id = Convert.ToInt64(dataAccCom.GetParameterValue(IDbCmdop_Id));
        器transaction.commit();
        返回true;



    }
    赶上(System.Exception的前)
    {
        如果(交易!= NULL)
        {
            transaction.Rollback();
        }
        抛出前;
    }
    最后
    {
        交易= NULL;
        如果(dataAccCom!= NULL)
        {
            dataAccCom.CloseConnection();
        }
        dataAccCom = NULL;
        IDbCmd = NULL;
    }
}

公共字符串ReplaceNull(字符串值)
{
    如果(价值== NULL)
    {
        返回 ;
    }
    其他
    {
        返回值;
    }
}

公开日期时间ReplaceNull(DateTime值)
{
    如果(价值== NULL)
    {
        返回DateTime.Now;
    }
    其他
    {
        返回值;
    }
}

公共双ReplaceNull(double值)
{
    如果(价值== NULL)
    {
        返回0.0;
    }
    其他
    {
        返回值;
    }
}
 

解决方案

我在想,你的输出参数是回来了为DBNull值。添加一个检查,像这样

  VAR outputParam = dataAccCom.GetParameterValue(IDbCmd,op_Id);
 如果(!(outputParam是为DBNull))
     DataTO.Id = Convert.ToInt64(outputParam);
 

Object cannot be cast from DBNull to other types.

I have a following function which throws the above error. I am handling all nulls in store procedure and in the C# code.

So where is it getting this error?

I can see the error in the catch block. But i am not understanding which line in the following create() getting the error.

public Boolean Create(DataTO DataTO)
{
    IDbTrans transaction = null;
    IDbCmd IDbCmd;

    string EncryptedPassword = Encrypt(DataTO.txtPwd);
    Base dataAccCom = null;

    try
    {
        dataAccCom = Factory.Create();
        dataAccCom.OpenConnection();
        transaction = dataAccCom.BeginTransaction();
        IDbCmd = dataAccCom.CreateCommand("sp_Register", true);
        dataAccCom.AddParameter(IDbCmd, "op_Id", DbType.Int64, 0, ParameterDirection.Output);
        dataAccCom.AddParameter(IDbCmd, "p_dlstTitle", DbType.String, ReplaceNull(DataTO.dlstTitle));
        dataAccCom.AddParameter(IDbCmd, "p_txtFirstName", DbType.String, ReplaceNull(DataTO.txtFirstName));
        dataAccCom.AddParameter(IDbCmd, "p_txtMiddleName", DbType.String, ReplaceNull(DataTO.txtMiddleName));
        dataAccCom.AddParameter(IDbCmd, "p_txtLastName", DbType.String, ReplaceNull(DataTO.txtLastName));
        dataAccCom.AddParameter(IDbCmd, "p_txtDob", DbType.DateTime, DataTO.txtDob);
        dataAccCom.AddParameter(IDbCmd, "p_txtDesig", DbType.String, ReplaceNull(DataTO.txtDesig));
        dataAccCom.AddParameter(IDbCmd, "p_txtOFlatNo", DbType.String, ReplaceNull(DataTO.txtOFlatNo));
        dataAccCom.AddParameter(IDbCmd, "p_txtOBuild", DbType.String, ReplaceNull(DataTO.txtOBuild));
        dataAccCom.AddParameter(IDbCmd, "p_txtOPost", DbType.String, ReplaceNull(DataTO.txtOPost));
        dataAccCom.AddParameter(IDbCmd, "p_txtOArea", DbType.String, ReplaceNull(DataTO.txtOArea));
        dataAccCom.AddParameter(IDbCmd, "p_txtOCity", DbType.String, ReplaceNull(DataTO.txtOCity));
        dataAccCom.AddParameter(IDbCmd, "p_txtRBuild", DbType.String, ReplaceNull(DataTO.txtRBuild));
        dataAccCom.AddParameter(IDbCmd, "p_txtRPost", DbType.String, ReplaceNull(DataTO.txtRPost));
        dataAccCom.AddParameter(IDbCmd, "p_txtUserID", DbType.String,ReplaceNull(DataTO.txtUserID));
        dataAccCom.AddParameter(IDbCmd, "p_txtPwd", DbType.String, ReplaceNull(EncryptedPassword));
        dataAccCom.ExecuteNonQuery(IDbCmd);
        DataTO.Id = Convert.ToInt64(dataAccCom.GetParameterValue(IDbCmd, "op_Id"));
        transaction.Commit();
        return true;



    }
    catch (System.Exception ex)
    {
        if (transaction != null)
        {
            transaction.Rollback();
        }
        throw ex;
    }
    finally
    {
        transaction = null;
        if (dataAccCom != null)
        {
            dataAccCom.CloseConnection();
        }
        dataAccCom = null;
        IDbCmd = null;
    }
}

public string ReplaceNull(string value)
{
    if (value == null)
    {
        return "";
    }
    else
    {
        return value;
    }
}

public DateTime ReplaceNull(DateTime value)
{
    if (value == null)
    {
        return DateTime.Now;
    }
    else
    {
        return value;
    }
}

public double ReplaceNull(double value)
{
    if (value == null)
    {
        return 0.0;
    }
    else
    {
        return value;
    }
}

解决方案

I'm thinking that your output parameter is coming back with a DBNull value. Add a check for that like this

var outputParam = dataAccCom.GetParameterValue(IDbCmd, "op_Id");
 if(!(outputParam is DBNull))
     DataTO.Id = Convert.ToInt64(outputParam);

这篇关于对象不能从DBNull转换为其他类型的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
相关文章
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆