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

今天在调试代码的时候突然抛出了如下异常:“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异常。

 

转载于:https://www.cnblogs.com/SheepRunning/p/4452847.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: "Osgeo.gdal.gdalpinvoke"的类型初始值设定引发异常,一般是由以下几个原因引起的: 1. 缺少GDAL安装:如果没有正确安装GDAL库,该异常可能会被触发。请确保已经正确安装了GDAL库,并且相应的GDAL.dll文件位于正确的路径下。 2. 版本不兼容:如果使用的GDAL库的版本与代码中的版本不兼容,也会引发异常。请检查代码中对GDAL库的引用以及所使用的GDAL库的版本,确保它们是兼容的。 3. 缺少依赖:GDAL库可能依赖其他一些库文件或组件,如果缺少了这些依赖,也可能导致该异常。请检查系统中是否已正确安装了所需的依赖,并确保它们是最新的、完整的版本。 4. 环境配置错误:有时,异常可能是由于环境配置错误所致。检查是否设置了正确的环境变量,并且GDAL库的路径能够正确被找到。 如果经过以上检查后仍然无法解决该异常,建议参考GDAL官方文档或寻求相关开发者社区的帮助,以获取更具体的解决方案。 ### 回答2: "osgeo.gdal.gdalpinvoke"的类型初始值设定引发异常,可能是由于以下几个原因引起的: 1. GDAL库未正确安装:首先,请确保您已经正确安装了GDAL库。检查您的环境变量是否正确设置,并且库文件位于正确的路径下。 2. 版本不匹配:如果您的应用程序中使用的GDAL库版本与您安装的版本不匹配,可能会引发异常。请确保您的应用程序和GDAL库的版本一致。 3. 缺少依赖:GDAL库可能依赖于其他一些库或组件。请确保您在安装GDAL库时已经安装了所有的依赖,并且它们也正确地设置在环境变量中。 4. 平台不匹配:如果您的应用程序和GDAL库是在不同的平台上编译的,例如一个是在32位平台上编译,另一个是在64位平台上编译,可能会导致该异常。请确保您的应用程序和GDAL库的平台一致。 5. 资源冲突:如果您在应用程序中同时使用了其他库,可能会存在资源冲突导致该异常。请确保您的应用程序中没有其他库与GDAL库产生冲突。 如果以上方法都无法解决该异常,建议您查看异常的详细信息以获取更多的线索,并参考GDAL库的官方文档或社区来解决问题。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值