TypeInitializationException

TypeInitializationException

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

我试图学习有关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

  <?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>

最佳答案

在您的情况下:

这意味着以下行将失败:

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


确保此处没有异常!由于此行是作为DB_Connection类型初始化的一部分执行的,因此在您首次访问DB_Connection时会发生异常,该异常发生在DB_Connection.getConnection()上-由于您没有DB_Connection的其他(关键)初始化逻辑,因此基本上必须是那条线。

我强烈建议将诸如初始化ConString的逻辑移至方法(类似于Init的方法),这样您将对发生的事情有更多的控制权-并且调试起来也更加容易!

从那里开始,我想ConnectionStrings["ConString"]返回null或本身引发异常-但是您会很容易发现这一点。 ;)

针对具有类似问题的人们的更一般的描述:

每当抛出TypeInitializationException时,请在引发异常的语句中首次检查您引用的所有初始化逻辑。

初始化逻辑包括:类型的静态构造函数和(在这种情况下)字段初始化。

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

10-07 19:48