C#中的TypeInitializationException

我将基于教程创建学生信息系统。 只要用户想要将新学生添加到数据库,就会发生以下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; } } } 

我的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(); } } } 

这是我的connectionString

             

在你的情况下:

这意味着以下行失败:

 public static string ConString = ConfigurationManager.ConnectionStrings["ConString"].ConnectionString; 

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

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

从那里开始,我猜ConnectionStrings["ConString"]返回null或者自己抛出一个exception – 但你会很容易地发现它。 ;)

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

每当抛出TypeInitializationException时,在抛出exception的语句中第一次检查所引用类型的所有初始化逻辑。

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

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

您的连接字符串似乎无效。 我不知道你的app.config文件中有什么。

下面给出了一种方法。

的app.config

       

然后 ……..

 var connection = System.Configuration.ConfigurationManager.ConnectionStrings["XYZ"]; 

并且不要忘记提供对System.Configuration.dll的引用

假设正在进行的是你的getConnection正在创建一个新的Sql连接,其中包含你在字典中保存的连接字符串。 我想它可能是:

  • ConString在某种程度上无效
  • 您的数据库未激活

抛出exception时我会使用调试器来检查ConString的值(查看底部的’locals’选项卡)。 如果你说服它是正确的,我猜你的Sql数据库没有运行或者某种程度上无效。 但是,我没有足够的经验说明如何诊断。

App.config文件参数错误如果您这样提供它将起作用:我已经尝试过并且它已正确执行:)