프로그래밍/C#

[C#] 0 테이블을 찾을 수 없습니다

ss-pro 2022. 12. 26. 23:54
반응형

프로그램 처리중에 아래와 같이 "0 테이블을 찾을 수 없습니다" 라는 오류가 발생하는 경우가 있는데 발생한 원인과 해결방법에 대해 알아보겠습니다.  

테스트를 하기위해 uspSearchUser라는 프로시저를 아래와 같이 만들어 보겠습니다. 프로시저 내용은 간단하며 테이블이 존재할 경우 전체 데이터가 조회되도록 하겠습니다. 

1
2
3
4
5
6
7
8
9
10
CREATE  PROCEDURE [dbo].[uspSearchUser]
AS
BEGIN
    SET NOCOUNT ON;
 
    IF NOT EXISTS (SELECT * FROM sys.objects WHERE 
object_id = OBJECT_ID(N'[dbo].[UserInfo]') AND type in (N'U'))
    BEGIN
        select * from UserInfo 
    END
END

1. 발생원인 
발생원인은 여러 Case가  있겠지만 보통 데이터베이스 조회 후 DataSet정보를 할당하는 부분이  있는데 이때 관련 부분이 발생합니다. 아래 코드를 보면  25열에 dataGridView1.DataSource = ds.Table[0];라는 부분이 있는데 이 부분에서 "0테이블을 찾을 수 없습니다" 라는 오류가 발생합니다. 말그대로 테이블 ds.Table[0]에 정보가 없기 때문입니다. uspSearchUser부분을 보면 UserInfo테이블이 있을경우에만 결과값을 리턴하기때문에 해당테이블이 없을 경우에는 결과값이 없기 때문입니다. 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31

private
 DataSet GetUserInfoStoreProcedure()
{
    string connectString = string.Format("Server={0};Database={1};Uid ={2};Pwd={3};"
"127.0.0.1","sampledb""test""1234!");
    DataSet ds = new DataSet();
 
    string name = "";
    using (SqlConnection conn = new SqlConnection(connectString))
    {
        conn.Open();
 
        SqlCommand cmd = new SqlCommand("uspSearchUser", conn);
        cmd.CommandType = CommandType.StoredProcedure;
        SqlDataAdapter da = new SqlDataAdapter(cmd);
        da.Fill(ds);
    }
    return ds; 
}
 
private void btnSearch_Click(object sender, EventArgs e)
{
    try
    {
        DataSet ds = GetUserInfoStoreProcedure();
        dataGridView1.DataSource = ds.Tables[0];
    }
    catch (SqlException ex)
    {
        MessageBox.Show(ex.Message.ToString());
    }
}


2. 해결방법 
1) 소스코드 수정하기
Tables.Count값을 이용해서 실제 값이 있는 경우에만 테이블결과정보를 표시하면됩니다. 

1
2
3
4
5
6
DataSet ds = GetUserInfoStoreProcedure();
if (ds.Tables.Count > 0)
{
    dataGridView1.DataSource = ds.Tables[0];
}


2) 저장프로시저 수정하기 : select top 0 문을 이용해서 검색결과가 0 건인 조회값을 강제로 만듭니다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
ALTER  PROCEDURE [dbo].[uspSearchUser]
AS
BEGIN
    SET NOCOUNT ON;
 
    IF NOT EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[UserInfo]'
AND type in (N'U'))
    BEGIN
        select * from UserInfo 
    END
    ELSE 
    BEGIN
        select top 0 '' id , '' name  
    END 
END


해결방법이 2가지 정도 있는데 상황에 따라서 적절하게 해결하면됩니다. select top 0문을 사용하여 운영중에 갑자기 발생한 경우에 소스코드 수정,배포가 어려운상황에서는 유용하게 사용할 수 있습니다.

 

 

반응형

'프로그래밍 > C#' 카테고리의 다른 글

[C#] 설치파일 만들기  (0) 2023.01.16
[C#] 파일 전체 읽기 (File.ReadAllText)  (0) 2023.01.09
[C#] MSSQL 저장프로시저 사용하기  (0) 2022.12.26
[C#] MSSQL 연동방법  (0) 2022.12.16
[C#] WebClient 타임아웃 설정  (2) 2022.12.15