C#中的TypeInitializationException

时间:2013-09-19 11:53:07

标签: 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();

        }
    }
}

这是我的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>

4 个答案:

答案 0 :(得分:6)

在您的情况下:

这意味着以下行失败:

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

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

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

从那里开始,我猜Init会返回ConnectionStrings["ConString"]或者自己抛出异常 - 但你很容易发现它。 ;)

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

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

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

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

答案 1 :(得分:3)

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

下面给出了一种方法。

<强>的app.config

<?xml version="1.0"?>
<configuration>
  <connectionStrings>
    <add name="XYZ" 
    connectionString="Data Source=.;Initial Catalog=NameOfYourDb;Integrated Security=True"/>
  </connectionStrings>
</configuration>

然后........

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

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

答案 2 :(得分:1)

假设所有这一切都是你的getConnection正在用你在字典中保存的连接字符串创建一个新的Sql连接。我猜它可能是:

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

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

答案 3 :(得分:0)

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

<?xml version="1.0"?>
<configuration>
  <configSections>
  </configSections>
    <connectionStrings>
      <add name ="ConString" connectionString="Data Source=SADA-PC;Initial Catalog=StudentTest;Integrated Security=True"
           providerName ="System.Data.sqlClient"/>
    </connectionStrings>
</configuration>