C#에서
using System.Data.OracleClient;
을 선언하여 데이터를 select하여 DataTable에 담던중... 오류가 나서 보니
null값에 대한 처리가 안되서 그랬다.

테이블예제
 SEQ  TITLE  주소
 1  제목입니다.  http://xxx.xxx/xxxx
 2  null  http://yyyy.yyy/yyyyy
 3  뇌이벌  http://zzzz.zzz/zzzz


처음에는 reader.GetString(1) == null 로 체크하면 될줄 알았으나... 그것은 아니었다. (모르는게 죄다 ;;;)
reader.IsDBNull(2) 같이 null인지 체크하는 기능이 있으니 체크를 해야했다.

[기존코드형식]
                while (reader.Read())
                {
                    row = table.NewRow();
                    row["SEQ"] = string.Format("{0}", reader.GetInt32(0));
                    row["TITLE"] = (string)reader.GetString(1);                             // <------ 요놈이 문제 (null데이터가 존재해서)
                    row["URL"] =    (string)reader.GetString(2)
                    table.Rows.Add(row);
                }


[해결방법]
 while (reader.Read())
                {
                    row = table.NewRow();
                    row["SEQ"]    = string.Format("{0}", reader.GetInt32(0));
                    row["TITLE"] =  getString(reader, 1, "제목없음");                             // <------ 요놈이 문제 (null데이터가 존재해서)
                    row["URL"]    =  getString(reader, 2, "");                                         //              그래서 null체크하는 함수를 편의상만듬
                    table.Rows.Add(row);
                }


.... 생략....

        // db널체크를 하는 함수를 만들자!!!
        private static string getString(OracleDataReader reader, int idx, string defaultstr)
        {
  //널체크
            if (reader == null)
                return defaultstr;

            if (reader.IsDBNull(idx) == true)                    // <---- DB값 null체크
                return defaultstr;
            else
                return reader.GetString(idx);
        }


뭐 일단 나의 착오였으나 까먹지 않게...정리..

참고로 Get관련 메소드에서 GetOraclexxx 형태로 가져올수도 있는데,
이 경우에서 null체크하기가 좀더 편하다 메소드가 따로 있는 구조가 아니라

reader.GetOracleString(1).Value
reader.GetOracleString(1).IsNull

같이 동일한 호출에서 .Value냐 IsNull이냐가 가능해서 좀더 편하게 쓸수 있을듯....







+ Recent posts