반응형
프로그램 처리중에 아래와 같이 "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 |