DBNull에서 다른 유형으로 개체를 캐스트할 수 없습니다.
DBNull에서 다른 형식으로 개체를 캐스트할 수 없습니다.
저는 위의 오류를 발생시키는 다음과 같은 기능을 가지고 있습니다.저는 스토어 프로시저와 C# 코드의 모든 null을 처리하고 있습니다.
그렇다면 어디서 이런 오류가 발생하는 것일까요?
나는 캐치 블록에서 오류를 볼 수 있습니다.하지만 다음의 create() 행 중 어느 쪽에 오류가 발생하는지 이해할 수 없습니다.
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;
}
}
저는 당신의 출력 파라미터가 DBNull 값으로 되돌아오고 있다고 생각합니다.다음과 같은 항목에 대한 체크 추가
var outputParam = dataAccCom.GetParameterValue(IDbCmd, "op_Id");
if(!(outputParam is DBNull))
DataTO.Id = Convert.ToInt64(outputParam);
그 선은 아마
DataTO.Id = Convert.ToInt64(dataAccCom.GetParameterValue(IDbCmd, "op_Id"));
문제의 원인이 되고 있습니다.그것이 가능합니까?op_Id
저장 프로시저에서 값을 null로 설정하고 있습니까?
이를 방지하려면 다음을 사용합니다.Convert.IsDBNull
방법.예:
if (!Convert.IsDBNull(dataAccCom.GetParameterValue(IDbCmd, "op_Id"))
{
DataTO.Id = Convert.ToInt64(dataAccCom.GetParameterValue(IDbCmd, "op_Id"));
}
else
{
DataTO.Id = ...some default value or perform some error case management
}
다음을 확인해야 합니다.DBNull
,것은 아니다.null
추가로, 당신의 세 명 중 두 명이ReplaceNull
방법은 말이 안 됩니다. double
그리고.DateTime
취소할 수 없습니다. 그래서 그것들을 확인하세요.null
항상 그럴 것입니다.false
...
TryParse는 일반적으로 이러한 유형의 작업을 처리하는 가장 우아한 방법입니다.
long temp = 0;
if (Int64.TryParse(dataAccCom.GetParameterValue(IDbCmd, "op_Id").ToString(), out temp))
{
DataTO.Id = temp;
}
오류의 이유:객체 지향 프로그래밍 언어에서 null은 객체에 대한 참조가 없음을 의미합니다.DBNull은 초기화되지 않은 변형 또는 존재하지 않는 데이터베이스 열을 나타냅니다.출처:MSDN
오류가 발생한 실제 코드:
코드를 변경하기 전:
if( ds.Tables[0].Rows[0][0] == null ) // Which is not working
{
seqno = 1;
}
else
{
seqno = Convert.ToInt16(ds.Tables[0].Rows[0][0]) + 1;
}
코드 변경 후:
if( ds.Tables[0].Rows[0][0] == DBNull.Value ) //which is working properly
{
seqno = 1;
}
else
{
seqno = Convert.ToInt16(ds.Tables[0].Rows[0][0]) + 1;
}
결론: 데이터베이스 값이 null 값을 반환하는 경우 C# 언어와 같이 null로 지정하는 대신 DBNull 클래스를 사용하는 것이 좋습니다.
Google에서 이 페이지에 도착한 다른 사용자의 경우
DataRow에는 다음과 같은 기능이 있습니다..IsNull("ColumnName")
public DateTime? TestDt;
public Parse(DataRow row)
{
if (!row.IsNull("TEST_DT"))
TestDt = Convert.ToDateTime(row["TEST_DT"]);
}
저는 오늘 이 문제에 직면했고 매핑 수업을 확인하여 해결했습니다.저장 프로시저에서 반환된 5개의 열이 매핑되는 5개의 속성을 가진 클래스가 있었습니다.이러한 속성은 무효화할 수 없으며 이로 인해 오류가 발생했습니다.저는 그것들을 무효로 만들었고 문제는 해결되었습니다.
public int? Pause { get; set; }
public int? Delay { get; set; }
public int? Transition { get; set; }
public int? TransitionTime { get; set; }
public int? TransitionResolution { get; set; }
데이터 형식을 "?"로 추가하여 이들을 null로 만들었습니다.
두 번째로 저장 프로시저에 다음과 같이 null 검사도 추가했습니다.
isnull(co_pivot.Pause, 0) as Pause,
isnull(co_pivot.Delay, 0) as Delay,
isnull(co_pivot.Transition, 0) as Transition,
isnull(co_pivot.TransitionTime, 0) as TransitionTime,
isnull(co_pivot.TransitionResolution, 0) as TransitionResolution
이것이 누군가에게 도움이 되기를 바랍니다.
그것은 저에게도 효과가 있었습니다.
- 예약.IsFull = rdr["isfull"]이(가) DBNull입니까? false : (bool)rdr["isfull"];
언급URL : https://stackoverflow.com/questions/6098646/object-cannot-be-cast-from-dbnull-to-other-types
'programing' 카테고리의 다른 글
Spring Bean을 다시 초기화하는 방법은 무엇입니까? (0) | 2023.07.01 |
---|---|
ORA-00947 유형을 전역으로 선언하는 동안 값이 충분하지 않음 (0) | 2023.07.01 |
LIKE가 없는 Oracle 문자열에서 하위 문자열 확인 (0) | 2023.07.01 |
Mongoose FindOneAndUpdate 및 실행 Validator가 작동하지 않습니다. (0) | 2023.07.01 |
구조 패킹은 결정론적입니까? (0) | 2023.06.26 |