본 글에서는 C#에서 발생하는 TypeInitializationException 에러에 대한 원인 분석 및 해결 방법을 자세하게 소개하고 있습니다.
문제상황
public class DatabaseManager
{
private static SqlConnection _connection;
static DatabaseManager()
{
string connectionString = ConfigurationManager.ConnectionStrings["DefaultConnection"].ConnectionString;
_connection = new SqlConnection(connectionString);
}
public static DataTable ExecuteQuery(string query)
{
SqlDataAdapter adapter = new SqlDataAdapter(query, _connection);
DataTable result = new DataTable();
adapter.Fill(result);
return result;
}
}
이 코드는 데이터베이스에 연결하고 쿼리를 실행하는 간단한 DatabaseManager 클래스를 보여줍니다. 이 클래스는 정적 메서드를 사용하여 데이터베이스와 작업을 처리합니다.
에러로그 내용:
System.TypeInitializationException: 'The type initializer for 'DatabaseManager' threw an exception.'
Inner Exception: ConfigurationErrorsException: Error initializing the configuration system.
원인분석
TypeInitializationException 에러는 정적 클래스 또는 정적 멤버를 초기화하는 동안 오류가 발생했음을 나타냅니다. 이 에러는 주로 다음 상황에서 발생합니다:
- 정적 생성자에서 예외가 발생한 경우
- 정적 필드 초기화 중 예외가 발생한 경우
이 경우, 정적 생성자인 DatabaseManager() 에서 에러가 발생합니다. 이 에러는 ConfigurationManager.ConnectionStrings["DefaultConnection"].ConnectionString에서 발생한 ConfigurationErrorsException으로 인해 발생했습니다.
이 에러는 다음 원인으로 발생할 수 있습니다:
- app.config 또는 web.config 파일에 올바른 구성 섹션 정보가 없는 경우
- 구성 파일 자체에 문제가 있는 경우 (예: 올바르지 않은 XML 형식)
해결방법-1 (구성 파일 수정)
app.config 또는 web.config 파일에 올바른 구성 섹션 정보를 추가합니다.
예를 들어, 다음과 같은 구성 섹션을 추가하십시오:
<connectionStrings>
<add name="DefaultConnection" connectionString="Data Source=(LocalDB)\MSSQLLocalDB;AttachDbFilename=|DataDirectory|\MyDatabase.mdf;Integrated Security=True" providerName="System.Data.SqlClient" />
</connectionStrings>
그리고, 다음과 같이 DatabaseManager 클래스에서 SqlConnection 개체를 초기화하는 데 필요한 네임스페이스를 추가하십시오.
using System.Data.SqlClient;
using System.Configuration;
해결방법-2 (코드 수정)
예외 처리를 추가하여 정적 생성자에서 발생하는 예외를 처리하십시오.
public class DatabaseManager
{
private static SqlConnection _connection;
static DatabaseManager()
{
try
{
string connectionString = ConfigurationManager.ConnectionStrings["DefaultConnection"].ConnectionString;
_connection = new SqlConnection(connectionString);
}
catch (ConfigurationErrorsException ex)
{
Console.WriteLine("Error initializing the configuration system: " + ex.Message);
}
catch (Exception ex)
{
Console.WriteLine("Error initializing the database connection: " + ex.Message);
}
}
public static DataTable ExecuteQuery(string query)
{
SqlDataAdapter adapter = new SqlDataAdapter(query, _connection);
DataTable result = new DataTable();
adapter.Fill(result);
return result;
}
}
이제 정적 생성자에서 발생하는 예외를 처리하고 메시지를 출력합니다. 이렇게 하면 TypeInitializationException이 발생하지 않으며, 실제 원인에 대한 정보를 제공하는 예외 메시지를 볼 수 있습니다.