c# - C# 中的类型初始化异常

标签 c# exception

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

我试图学习一些关于 TypeInitializationException 的东西,我通过它的名字了解了一点......但我不能完全理解它。此外,我正在关注的教程中没有异常。我是这种 OOP 编程和处理错误的新手。我在下面包含了我的数据库连接和数据库访问类。

exception pic

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

        }
    }
}

这是我的连接字符串

  <?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 的调试能力中获益,最重要的是,您将得到抛出的实际异常。

关于c# - C# 中的类型初始化异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18893913/

相关文章:

c# - 处理 MDI 表单中的异常

java - 在 FileNotFoundException 的 catch 中嵌套 try-catch IOException

c# - 在此模式下不允许 Log4net 递归读取锁定获取

c# - C# 中的 Google 网站站长工具 API

用于检查重复行和重复列的 Python 错误日志记录

ruby - 如何向 Ruby 中的异常消息添加信息?

java - 在 java 中,为什么自定义异常也应该有一个参数为 'Throwable cause' 的构造函数

c# - Mahapps 1.3 对话框和 Avalon.Wizard

c# - Azure 存储表 : Is it okay to fire-and-forget async methods?

c# - BinaryReader 的 FillBuffer 方法有什么作用?