[C#] 개체를 DBNull에서 다른 형식으로 캐스팅할 수 없습니다. 해결하기

C#에서 개체를 DBNull에서 다른 형식으로 캐스팅할 수 없습니다. 오류가 발생하였을 때 해결방법을 찾고 계신가요? 해당과 같은 현상이 발생하는 이유는 DataTable의 Compute같은 메서드의 반환 형식이 오브젝트이기 때문입니다. 계산 결과식이 null로 평가되는 경우 반환 값은 null이 아니라 DBNull.Value가 됩니다.

개체를 DBNull에서 다른 형식으로 캐스팅할 수 없습니다.
        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);            
        }

댓글