C#中的TypeInitializationException

Sad*_*han 3 c# exception

我将基于教程创建学生信息系统.只要用户想要将新学生添加到数据库,就会发生以下异常.

我试着学习一些关于TypeInitializationException的东西,我对它的名字有点了解......但是我无法完全理解它.此外,我正在遵循的教程中没有例外.我是这种类型的OOP编程和处理错误的新手.我在下面包含了我的数据库连接和数据库访问类.

异常图片

我的DB_Connection班级

using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Data;
using System.Data.SqlClient;
using System.Configuration;

namespace studentInformationSystem
{
    class DB_Connection
    {
        public static SqlConnection NewConnection;
        public static string ConString = ConfigurationManager.ConnectionStrings["ConString"].ConnectionString;

        public static SqlConnection getConnection()
        {
            NewConnection = new SqlConnection(ConString);
            return NewConnection;
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

我的DB_Access班级

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Data;
using System.Data.SqlClient;

namespace studentInformationSystem
{
    class DB_Access
    {
        public SqlConnection conn;
        public DB_Access()
        {
            conn = DB_Connection.getConnection();
        }

        public void AddStudent(string regNo, string fName, string lName, string phoneNumber)
        {
            if(conn.State.ToString() == "Closed")
            {
                conn.Open();
            }

            SqlCommand newCommand = conn.CreateCommand();
            newCommand.Connection = conn; //why we use it..???
            newCommand.CommandType = CommandType.Text;
            newCommand.CommandText = "insert into student values('" + regNo + "','" + fName + "','" + lName + "','" + phoneNumber + "')";
            newCommand.ExecuteNonQuery();

        }
    }
}
Run Code Online (Sandbox Code Playgroud)

这是我的connectionString

  <?xml version="1.0" encoding="utf-8" ?>
<configuration>
    <startup> 
        <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5" />
    </startup>

  <configSections>

    <connectionStrings>
      <add name="ConString" connectionString="Data Source=SADID-PC\SQLEXPRESS;Initial Catalog=Test1;Integrated Security=True" 
           providerName="System.Data.sqlClient" />  
    </connectionStrings>

  </configSections>

</configuration>
Run Code Online (Sandbox Code Playgroud)

oly*_*dis 7

在你的情况下:

这意味着以下行失败:

public static string ConString = 
    ConfigurationManager.ConnectionStrings["ConString"].ConnectionString;
Run Code Online (Sandbox Code Playgroud)

确保这里没有异常!由于这一行是作为DB_Connection类型初始化的一部分执行的,因此当您第一次访问时会发生异常DB_Connection,DB_Connection.getConnection()因为您没有其他(关键)初始化逻辑DB_Connection,因此它基本上必须是该行.

我强烈建议将逻辑移动ConString到初始化方法(类似Init),这样你就可以更好地控制发生的事情 - 并且更容易调试!

从那里开始,我想自己会ConnectionStrings["ConString"]返回null或抛出异常 - 但你会很容易地发现它.;)

更一般的描述,对于有类似问题的人:

无论何时TypeInitializationException抛出,都会在抛出异常的语句中第一次检查所引用类型的所有初始化逻辑.

初始化逻辑包括:类型的静态构造函数和(在本例中)字段初始化.

如果此时您仍然不知道实际异常(然后触发TypeInitializationException)发生在哪里,您应该考虑将所有(或部分)初始化逻辑移动到额外的静态方法.现在,当您手动调用此方法时(当然,在您第一次访问该类型之前),您可以从IDE调试功能中受益,最重要的是,您将获得实际的异常.