我将基于教程创建学生信息系统.只要用户想要将新学生添加到数据库,就会发生以下异常.
我试着学习一些关于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)
在你的情况下:
这意味着以下行失败:
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调试功能中受益,最重要的是,您将获得实际的异常.