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文件参数错误如果您这样提供它将起作用:我已经尝试过并且它已正确执行:)