C#에서 개체를 DBNull에서 다른 형식으로 캐스팅할 수 없습니다. 오류가 발생하였을 때 해결방법을 찾고 계신가요? 해당과 같은 현상이 발생하는 이유는 DataTable의 Compute같은 메서드의 반환 형식이 오브젝트이기 때문입니다. 계산 결과식이 null로 평가되는 경우 반환 값은 null이 아니라 DBNull.Value가 됩니다.
void BeomSang()
{
DataTable dataTable = new DataTable();
dataTable.Columns.Add("ColumnName", typeof(decimal));
dataTable.Rows.Add(DBNull.Value);
DataColumn dataCol = dataTable.Columns["ColumnName"];
object o = dataTable.Compute("SUM(" + dataCol.ColumnName + ")", string.Empty);
//'System.InvalidCastException' 형식의 예외가 mscorlib.dll에서 발생했지만 사용자 코드에서 처리되지 않았습니다.
//추가 정보: 개체를 DBNull에서 다른 형식으로 캐스팅할 수 없습니다.
decimal d = Convert.ToDecimal(o);
}
그리하여 개체를 DBNull에서 다른 형식으로 캐스팅할 수 없습니다. 를 해결하려면 반환값에 대한 DBNull.Value 여부를 체크하거나, Compute 등의 메서드에 대해 확장 메서드 등 예외처리를 추가하는 부분을 점검하셔야 합니다.
다음은 삼항연산자를 통해 DBNull.Value인 경우, 0으로 설정하고 나머지는 해당 값을 컨버트 하도록 진행한 예제자료입니다.
void BeomSang()
{
DataTable dataTable = new DataTable();
dataTable.Columns.Add("ColumnName", typeof(decimal));
dataTable.Rows.Add(DBNull.Value);
DataColumn dataCol = dataTable.Columns["ColumnName"];
object o = dataTable.Compute("SUM(" + dataCol.ColumnName + ")", string.Empty);
decimal d = o == DBNull.Value ? decimal.Zero : Convert.ToDecimal(o);
}