【转】类型初始值设定项引发异常的解决办法

类型初始值设定项引发异常的解决办法

转自:小羊快跑1  http://www.cnblogs.com/SheepRunning/p/4452847.html

今天在调试代码的时候突然抛出了如下异常:“XORM.Database”的类型初始值设定项引发异常。

顿时感觉很突兀,平常的时候一点问题没有,为什么今天调试就出问题了呢?测试了一下,发现在数据处理层的一条实例化代码处出错:

            //获取类型的映射信息
            MappingInfo mapInfo = xmlMapping.GetDataMapInfo(type);

            Database db = new Database();//出错代码
            db.CommandText = storageprocedure;

            //获取查询条件的映射信息

找了很久没有找到原因,后再网上搜索了下,是因为静态成员初始化异常引起的问题。我的Database类中只有一个静态成员。Database类如下:

using System;
using System.Collections.Generic;
using System.Text;
using System.Data.SqlClient;
using System.Data;
using System.Collections;
using System.Configuration;

namespace XORM
{
    internal class Database: IDisposable
    {
        private static string _connectionString = System.Configuration.ConfigurationManager.ConnectionStrings["TestForCSSConn"].ConnectionString;//静态成员
        private IDbConnection _connection = null;
        private string _commandText = null;
        private ArrayList _parameters = new ArrayList();
        private bool _disposed;

        public IDataReader GetDataReader()
        {
            using (IDbCommand cmd = getCommand())
            {
                return cmd.ExecuteReader();
            }
        }

        private ArrayList _inoutParameters = new ArrayList();

        private IDbCommand getCommand()
        {
            IDbCommand cmd = connection.CreateCommand();
            cmd.CommandText = _commandText;
            cmd.CommandType = CommandType.StoredProcedure;
            foreach (SqlParameter parm in _parameters)
            {
                cmd.Parameters.Add(parm);
            }
            //既能输入也能返回的参数
            foreach (SqlParameter parm in _inoutParameters)
            {
                parm.Direction = ParameterDirection.Output;
                cmd.Parameters.Add(parm);
            }

            return cmd;
        }

        public IDbCommand GetCommand()
        {
            return getCommand();
        }

        public string CommandText
        {
            set { _commandText = value; }
            get { return _commandText; }
        }

        private IDbConnection connection
        {
            get
            {
                if (_connection == null)
                {
                    _connection = new SqlConnection(_connectionString);
                    _connection.Open();
                }
                return _connection;
            }
        }

        public void AddParameters(string name, object obj)
        {
            if (name.StartsWith("@") == false)
            {
                name = "@" + name;
            }
            SqlParameter p = new SqlParameter(name, obj);
            _parameters.Add(p);
        }

        public void AddInOutParameters(string name, object obj)
        {
            if (name.StartsWith("@") == false)
            {
                name = "@" + name;
            }
            SqlParameter p = new SqlParameter(name, obj);
            _inoutParameters.Add(p);
        }

        public ArrayList Parameters
        {
            get { return _parameters; }
        }

        public void Dispose()
        {
            if (_disposed == true)
            {
                return;
            }
            //    Dispose and close the connection
            Close();
            // This object will be cleaned up by the Dispose method.
            // Therefore, you should call GC.SupressFinalize to
            // take this object off the finalization queue
            // and prevent finalization code for this object
            // from executing a second time.
            GC.SuppressFinalize(this);
            _disposed = true;
        }

        public void Close()
        {
            if (_disposed == true)
            {
                return;
            }

            if (_connection != null)
            {
                _connection.Close();
                _connection.Dispose();
            }
        }
    }
}

仔细对比了一下,发现确实是这条语句出了问题,在我的web.config配置文件中数据库连接字符串的没有名为TestForCSSConn的,这是因为今天修改了web.config文件,新的数据库连接字段如下:

 <add name="TestForCSS" connectionString="Server=(local);Database=BookExchange;User ID=sa;Password=123;Connection TimeOut=180"
         providerName="System.Data.SqlClient"/>

将此处的name="TestForCSS"修改为name="TestForCSSConn"就可以了。

通过在网上搜索归纳了一下可能的原因:

1. 访问类的某一静态成员,而其他静态成员的初始化(或静态构造函数)中产生异常。例如访问ClassHelper.StaticString,由于静态成员Field的初始化产生异常,因此调用ClassHelper.StaticString会抛出TypeInitializationException。
2. 访问类的某一静态成员,该静态成员的初始化(或静态构造函数)中产生异常。
3. 对该类进行初始化,而类中的某个静态成员初始化(或静态构造函数)中产生异常。

解决办法:

1、检查类中的静态字段或属性,确保其能够正常的完成初始化
2、在类的构造函数中,确保其访问的属性或字段都已经完成初始化
3、如果是WinForm中,将访问的窗体控件的语句写在初始化方法之后

同时,导致错误发生还可能是导入的引用sqlite.dll上,以下是这种情况的解决办法(引用自博友雪庭):

sqlite.dll分32位和 64位,以前用在32位下,开发换到win 7/x64下。在项目属性中,修改目平台,从Any CPU改为x86,重新运行正 常,sqlite.dll是32位的,但目标 平台是x64的,有关sqlite的静态变量初始化异常,引起sqlite类初始化错误,引发 TypeInitializationException异常。

时间: 2024-08-06 11:36:58

【转】类型初始值设定项引发异常的解决办法的相关文章

类型初始值设定项引发异常的解决办法

今天在调试代码的时候突然抛出了如下异常:“XORM.Database”的类型初始值设定项引发异常. 顿时感觉很突兀,平常的时候一点问题没有,为什么今天调试就出问题了呢?测试了一下,发现在数据处理层的一条实例化代码处出错: //获取类型的映射信息 MappingInfo mapInfo = xmlMapping.GetDataMapInfo(type); Database db = new Database();//出错代码 db.CommandText = storageprocedure; /

类型初始值设定项引发异常的解决方法

1.检查类中的静态字段或属性,确保其能够正常的完成初始化 2.在类的构造函数中,确保其访问的属性或字段都已经完成初始化 3.如果是WinForm中,将访问的窗体控件的语句写在初始化方法之后 实例 一个类有如下定义 private static readonly string path = ConfigurationManager.AppSettings["WebDAL"]; 但是在引用这个类的时候没有在Web.config里加如下配置时 <appSettings> <

“Spring.Context.Support.ContextRegistry”的类型初始值设定项引发异常。-解决方法

注释掉web/app.config中的:

“Oracle.DataAccess.Client.OracleConnection”的类型初始值设定项引发异常。

“Oracle.DataAccess.Client.OracleConnection”的类型初始值设定项引发异常. 被这个问题困扰了好长时间,终于找到了原因: 原来是本机安装的Oracle客户端版本与服务器不一致. 解决办法: 将以下的dll文件引用即可,dll分为两个版本,Windows7 32位系统亲测,不管安不安装Oracle客户端,都可以使用. 版本一:http://download.csdn.net/detail/zhzhx0318/9120651 版本二:http://downloa

System.Data.Entity.Internal.AppConfig 类型初始值设定项引发异常

在一开始时将connectionStrings 写在了configSections之上如下图一示,结果抛出:“System.Data.Entity.Internal.AppConfig”的类型初始值设定项引发异常. 图一:最初配置 图二:抛出异常 解决方法,是将connectionStrings 写在了configSections之下,如图三 图三:调整后的配置

&lt;转&gt;类型初始值设定项引发异常

类型初始值设定项引发异常 连续两天都为这个运行时错误“类型初始值设定项引发异常”而烦恼,调试也不知道哪里出 了问题.上网Google一下,一大堆相同的问题,可是按照那些方法折腾来折腾去,问题还是一样.最后在CSDN上发帖子问了,果然“重赏之下必有勇 夫”,很快就有高手回复了,问题也随着解决了.哈哈.在此写个随笔,以后如果大家遇到类似问题,也可参考一下,自己也做个备忘,不然放在电脑上,又找不 到,我的电脑文件到处乱放,有时连我自己都找不到^_^. 问题是这样嘀: 项目采用了三层架构和工厂模式,并借

“system.servicemodel.diagnostics.traceutility” 类型初始值设定项引发异常

在调试WCF服务时遇到“system.servicemodel.diagnostics.traceutility” 类型初始值设定项引发异常错误,仔细检查后发现是配置文件问题. ... <startup> <supportedRuntime version = "v4.0" sku =".NETFramework, Version = v4.0"/> </startup> ... 可能是因为引用服务导致NET版本不兼容.去掉这一句

c# 类型初始值设定项引发异常

今天使用VS2010编译c#程序,编译顺利通过,点击运行启动程序,弹框提示如题错误.断点调试,程序甚至都没有进入main函数!!查阅网上资料,几种分析如下(1)反射机制 (2)app.config文件格式不对  (3)程序集引用.经过判断,以上都不符合,最后发现是该64位启动工程的目标平台配的是x86,改为64位后启动成功.由于这个项目不是我自己创建的,所以本能的没有检查属性配置,在此记录,以供日后查阅,也便于帮助后来的人. c# 类型初始值设定项引发异常,布布扣,bubuko.com

“DBUtility.DbHelperSQL”的类型初始值设定项引发异常 “DBUtility.DbHelperSQL”的类型初始值设定项引发异常

今天遇到了一个这样的问题"DBUtility.DbHelperSQL"的类型初始值设定项引发异常"DBUtility.DbHelperSQL"的类型初始值设定项引发异常 也许有和我遇到这问题的人也在这个问题怎么解决,在没有解决这个问题的时候我也和你们现在的心情一样,也百度过了,goolge过但是还是没有解决,在这个时候我们需要冷静下来想想问什么会出现这个问题 分析一下问题出现的原因,现在我来解答为什么会出现这个错误,其实很简单就是你没有配置好web连接数据库的语句,