我有一个非常简单的课程,我添加了方法GetConnectionString()
。在每次从Settings类访问任何值时添加它都会引发异常The type initializer for 'NameSpace.Settings' threw an exception.
只要我删除GetConnectionString()程序就可以正常工作。
using System.Data.EntityClient;
using System.Data.SqlClient;
namespace CRM {
static class Settings {
public static bool userAuthenticated = false;
public static string userGroup = "";
public static Klienci currentlySelectedClient;
public static string sqlDataConnectionDetailsCRM = GetConnectionString();
public static string GetConnectionString() {
string connection = "";
SqlConnectionStringBuilder sqlBuilder = new SqlConnectionStringBuilder();
sqlBuilder.InitialCatalog = dbInitialCatalog;
sqlBuilder.DataSource = dbServer;
sqlBuilder.IntegratedSecurity = false;
sqlBuilder.UserID = dbUserName;
sqlBuilder.Password = dbPasswWord;
sqlBuilder.MultipleActiveResultSets = true;
EntityConnectionStringBuilder entity = new EntityConnectionStringBuilder();
entity.Metadata = @"res://*/Data.System.csdl|res://*/Data.System.ssdl|res://*/Data.System.msl";
entity.Provider = "System.Data.SqlClient";
entity.ProviderConnectionString = sqlBuilder.ToString();
connection = entity.ToString();
return connection;
}
}
}
如果我注释掉sqlBuilder和实体。它工作正常..
public static string GetConnectionString() {
string connection = "";
SqlConnectionStringBuilder sqlBuilder = new SqlConnectionStringBuilder();
//sqlBuilder.InitialCatalog = dbInitialCatalog;
//sqlBuilder.DataSource = dbServer;
//sqlBuilder.IntegratedSecurity = false;
//sqlBuilder.UserID = dbUserName;
//sqlBuilder.Password = dbPasswWord;
//sqlBuilder.MultipleActiveResultSets = true;
EntityConnectionStringBuilder entity = new EntityConnectionStringBuilder();
//entity.Metadata = @"res://*/Data.System.csdl|res://*/Data.System.ssdl|res://*/Data.System.msl";
//entity.Provider = "System.Data.SqlClient";
//entity.ProviderConnectionString = sqlBuilder.ToString();
connection = entity.ToString();
return connection;
}
发生了什么事?对我来说似乎很好..
编辑:
的InnerException:
exception =“System.ArgumentNullException:值不能 null。\ r \ nParameter name:Initial Catalog \ r \ n at System.Data.SqlClient.SqlConnectionStringBuilder.set_InitialCatalog(字符串 价值)\ r \ n在CRM.Settings.GetConnectionString()中 C:\项目\ Project.C.S ...
虽然在“设置”类中设置了public static string dbInitialCatalog = "BazaCRM";
。
答案 0 :(得分:2)
根据您的错误,dbInitialCatalog
的值似乎为null,因此连接字符串构建器会抛出错误。因为这是在类的静态构造函数中,所以无法加载类型本身并且整个事情都失败了。
您是否尝试过亲自手动提供连接字符串?
答案 1 :(得分:2)
无法保证正在初始化的字段的顺序。这里发生的是sqlDataConnectionDetailsCRM
正在dbInitialCatalog
字段之前进行初始化。
如果您将其他静态字段更改为const
,则应修复它。
或者更好的方法可能是删除公共静态字段,并从方法中检索连接字符串,或者您可能还想调查Lazy<T>
类,并使用它来构建连接字符串第一次需要它。