【问题标题】:TypeInitializationException in C#C# 中的 TypeInitializationException
【发布时间】:2013-09-19 11:53:07
【问题描述】:

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

我试图了解一些关于 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();

        }
    }
}

这是我的连接字符串

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

【问题讨论】:

  • 您应该查看异常详细信息以及可能的内部异常,以更好地了解问题所在。
  • 显示连接字符串。你在那个表格上使用的是Comic Sans吗? :)
  • 最好删除那些图片,具体一点。与前 2 张图片无关。
  • 显示配置文件中的连接字符串
  • 它在 IntelliTrace 跟踪的屏幕截图中可见。你的 app.exe.config 文件搞砸了。

标签: c# exception


【解决方案1】:

在你的情况下:

这意味着以下行失败:

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 调试能力中受益,并且最重要的是,您会得到实际异常抛出。 p>

【讨论】:

    【解决方案2】:

    您的连接字符串似乎无效。我不知道你的 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

    【讨论】:

      【解决方案3】:

      假设正在发生的一切是您的 getConnection 正在使用您在字典中保存的连接字符串创建一个新的 Sql 连接。我猜它可能是:

      • ConString 在某些方面无效
      • 您的数据库未激活

      我会在抛出异常时使用调试器检查 ConString 的值(检查底部的“本地”选项卡)。如果您确信它是正确的,我猜您的 Sql 数据库没有运行或以某种方式无效。但是,我没有足够的经验来说明如何诊断。

      【讨论】:

      • 所有应该触发不同类型的异常 ;) 但非常好的调试建议!
      • @olydis 实际上所有这些问题都会引发TypeInitializationException,因为所有这些都会发生在静态字段初始化或静态构造函数中
      • 不,在类型初始化期间不会发生其他任何事情,请注意,例如,如果 ConString 无效或其他原因,这将导致 getConnection 内部出现异常 - DB_Connection 没有静态构造函数,所以不,在初始化期间除了字段 init 没有其他任何事情发生;)
      • @olydis 很抱歉,我看错了代码(认为getConnection 函数是静态构造函数),是的,你是对的
      • 呵呵呵呵不用担心,正是我首先想到的是阅读他的代码 - 当我已经在研究我的答案时,我突然意识到我在谈论一个实际上的构造函数是一种方法:)
      【解决方案4】:

      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>
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-11-07
        • 1970-01-01
        • 2016-09-10
        • 2017-03-23
        相关资源
        最近更新 更多