프로그램을 개발하면서 데이터베이스(DB)에 연결해서 테이블(Table)의 데이터를 가져오는 작업은 정말 많이 하게 됩니다.
특히나 업무용 프로그램을 개발할 때는 테이블에 데이터를 저장하고, 저장된 데이터를 읽어와서 가공하여 화면으로 보여주는게 프로그램의 전부라고 할 수 있습니다.
데이터베이스 테이블에서 데이터를 가져오는 방법으로 DataReader를 사용하여 데이터를 한건씩 읽어오는 방법과 DataAdapter를 사용하여 한번에 DataSet(DataTable)으로 가져와서 사용하는 방법을 주로 사용하게 됩니다.
DB에서 가져온 실제 데이터를 읽기 하는 과정에서 아래와 같은 예기치 못한 에러가 발생할 때가 있습니다.
System.IndexOutOfRangeException: Unable to find specified column in result set
System.IndexOutOfRangeException: 결과 집합에서 지정된 열을 찾을 수 없습니다.
이번 글에서는 DataReader를 하는 과정에서 System.IndexOutOfRangeException: Unable to find specified column in result set 에러가 발생하는 원인과 해결 방법에 대해 알아보겠습니다.
Unable to find specified column in result set 오류 발생 원인
1. 아래 예제는 테이블에서 데이터를 가져오는 일반적인 쿼리문입니다.
SELECT문에서 num, name, sex 세개의 컬럼 데이터를 가져오도록 했습니다.
하지만 Read()하는 과정에서 grade라는 컬럼 데이터를 가져오는 구문이 포함된 것을 볼 수 있습니다.
이처럼 SELECT문에 포함되지 않은 컬럼을 읽으려고 할 때 ‘Unable to find specified column in result set’ 오류가 발생하게 됩니다.
2. 또 다른 원인은 ‘오타‘에 인해 발생하는 오류 입니다.
SELECT문에서 ‘name‘ 컬럼을 가져오도록 했지만 Read 하는 과정에서 ‘nmae‘와 같이 오타를 입력하게 되면 동일한 이유로 오류가 발생하게 됩니다. 실제 프로그래밍을 하다보면 오타에 의한 오류가 의외로 많이 발생합니다.
query = “SELECT num, name, sex FROM student WHERE num = ‘1000’ “;
//MS-SQL
System.Data.SqlClient.SqlConnection conn = new System.Data.SqlClient.SqlConnection(OraConnectionString);
System.Data.SqlClient.SqlCommand comm = new System.Data.SqlClient.SqlCommand(sQuery, conn);
System.Data.SqlClient.SqlDataReader dr = comm.ExecuteReader();
//ORACLE
Oracle.DataAccess.Client.OracleConnection conn = new Oracle.DataAccess.Client.OracleConnection(OraConnectionString);
Oracle.DataAccess.Client.OracleCommand comm = new Oracle.DataAccess.Client.OracleCommand(query, conn);
Oracle.DataAccess.Client.OracleDataReader dr = comm.ExecuteReader();
if (dr.HasRows)
{
dr.Read();
string num = dr[“num”].ToString();
string name = dr[“name”].ToString();
string sex = dr[“sex”].ToString();
string grade = dr[“grade”].ToString(); //<- 오류 발생
}
|
Unable to find specified column in result set 오류 해결 방법
오류 발생 원인을 알았다면 오류 해결 방법은 무척 간단해 집니다.
1. 오류를 해결하기 위해서는 SELECT문에 grade 칼럼을 추가해 주면 됩니다.
2. 만약 테이블에 해당 컬럼이 존재하지 않는다면 Read()에서 해당 컬럼을 가져오는 라인을 삭제해 주어야 합니다.
3. Read하는 컬럼이 SELECT문에 모두 존재한다면 ‘오타‘를 입력하지 않았는지 주의 깊게 확인해 봅니다.
query = “SELECT num, name, sex, grade FROM student WHERE num = ‘1000’ “;
//MS-SQL
System.Data.SqlClient.SqlConnection conn = new System.Data.SqlClient.SqlConnection(OraConnectionString);
System.Data.SqlClient.SqlCommand comm = new System.Data.SqlClient.SqlCommand(sQuery, conn);
System.Data.SqlClient.SqlDataReader dr = comm.ExecuteReader();
//ORACLE
Oracle.DataAccess.Client.OracleConnection conn = new Oracle.DataAccess.Client.OracleConnection(OraConnectionString);
Oracle.DataAccess.Client.OracleCommand comm = new Oracle.DataAccess.Client.OracleCommand(query, conn);
Oracle.DataAccess.Client.OracleDataReader dr = comm.ExecuteReader();
if (dr.HasRows)
{
dr.Read();
string num = dr[“num”].ToString();
string name = dr[“name”].ToString();
string sex = dr[“sex”].ToString();
string grade = dr[“grade”].ToString(); //SELECT 구문에 해당 컬럼을 추가하거나 현재 라인 삭제
}
|
※ 함께 읽으면 도움이 될 만한 다른 포스팅 글입니다.
이 글이 도움이 되었기를 바랍니다. ^-^