C# 행 또는 열에 대한 데이터가 없습니다. 해결 방법

SqlDataReader를 사용할 때 "행 또는 열에 대한 데이터가 없습니다."라는 오류는 reader.Read()를 호출하지 않거나, 데이터베이스에서 결과를 반환하지 않았을 때 발생할 수 있습니다. 아래에서 문제 원인과 해결 방법을 살펴보겠습니다.

1. 행 또는 열에 대한 데이터가 없습니다. 문제 원인

(1) reader.Read() 호출 누락

  • SqlDataReader는 기본적으로 첫 번째 행에 위치하지 않으며, 데이터를 읽으려면 반드시 reader.Read()를 호출해야 합니다.
  • reader.Read()를 호출하지 않고 데이터를 읽으려고 하면 오류가 발생합니다.

(2) 쿼리가 결과를 반환하지 않음

  • SQL 쿼리가 빈 결과를 반환하는 경우에도 오류가 발생할 수 있습니다.
  • 예를 들어, WHERE 조건이 일치하는 데이터를 찾지 못하면 결과 집합이 비어 있는 상태로 반환됩니다.

(3) 열 이름 또는 인덱스 잘못 참조

  • 반환된 데이터와 코드에서 참조하는 열의 순서나 이름이 일치하지 않으면 오류가 발생합니다.

2. 행 또는 열에 대한 데이터가 없습니다. 해결 방법

(1) reader.Read() 확인

reader.Read()가 호출되었는지 확인하고, 빈 결과를 처리할 수 있도록 코드를 작성합니다.

수정된 코드

if (reader.Read())
{
    int id = reader.GetInt32(0); // 첫 번째 열
    string name = reader.GetString(1); // 두 번째 열
    Console.WriteLine($"ID: {id}, Name: {name}");
}
else
{
    Console.WriteLine("결과가 없습니다."); // 데이터가 없는 경우 처리
}

while 루프를 사용하는 경우도 동일합니다

if (!reader.HasRows)
{
    Console.WriteLine("데이터가 없습니다."); // 결과 없음 처리
}
else
{
    while (reader.Read())
    {
        int id = reader.GetInt32(0);
        string name = reader.GetString(1);
        Console.WriteLine($"ID: {id}, Name: {name}");
    }
}

(2) SQL 쿼리 결과 확인

  • SQL 쿼리가 데이터베이스에서 데이터를 정확히 가져오는지 직접 실행하여 확인하세요.
  • WHERE 조건이 너무 엄격하거나 잘못 설정된 경우 데이터를 반환하지 못할 수 있습니다.
  • 예를 들어, 아래처럼 쿼리를 잘못 작성했다면 결과가 비어 있을 수 있습니다.
    SELECT Id, Name FROM Users WHERE Age < 0; -- 비정상적인 조건

참고

  • 쿼리 조건을 조정하거나 디버깅을 위해 데이터를 제한하지 않은 상태로 테스트 하기
    SELECT Id, Name, Age FROM Users;

(3) 열 이름 또는 인덱스 확인

  • SqlDataReader는 열 순서를 기준으로 데이터에 접근하거나, 열 이름을 정확히 지정해야 합니다.
  • 데이터베이스 테이블의 열 이름이 변경되거나, SELECT 문에 별칭이 적용되었을 경우 아래처럼 코드와 불일치할 수 있습니다:
    SELECT Id AS UserId, Name AS UserName FROM Users;
    

해결

  • 별칭을 사용했다면 열 이름을 업데이트하거나, 열 순서를 사용해 데이터에 접근합니다:
    int id = reader.GetInt32(reader.GetOrdinal("UserId"));
    string name = reader.GetString(reader.GetOrdinal("UserName"));
    

(4) 예외 처리 추가

  • 코드에서 예외 상황을 처리하도록 에러 메시지를 출력하거나 로그를 남기는 것이 좋습니다.

개선된 코드

try
{
    if (!reader.HasRows)
    {
        Console.WriteLine("결과가 없습니다.");
    }
    else
    {
        while (reader.Read())
        {
            int id = reader.GetInt32(0); // 인덱스를 기반으로 데이터 읽기
            string name = reader.GetString(1);
            Console.WriteLine($"ID: {id}, Name: {name}");
        }
    }
}
catch (IndexOutOfRangeException ex)
{
    Console.WriteLine("열 이름 또는 인덱스를 확인하세요. 오류 메시지: " + ex.Message);
}
catch (Exception ex)
{
    Console.WriteLine("알 수 없는 오류 발생: " + ex.Message);
}

3. 최종 체크리스트

  1. reader.Read()가 호출되었는지 확인.
  2. reader.HasRows로 결과가 있는지 확인.
  3. SQL 쿼리 결과가 데이터를 반환하는지 테스트.
  4. GetInt32, GetString 등 열 데이터 접근 방식이 올바른지 확인.
  5. 예외 처리를 추가하여 오류 원인을 정확히 파악.

이런 방법으로 문제를 해결할 수 있습니다. 😊

이전최근
댓글 쓰기
가져가실 때, 출처 표시 부탁드려요! 감사합니다. 💗