如何修复“ConnectionString属性未初始化”的错误。

59

启动应用程序时,我收到以下错误提示:The ConnectionString property has not been initialized.

Web.config 文件:

<connectionStrings>
    <add name="MyDB"
         connectionString="Data Source=localhost\sqlexpress;Initial Catalog=mydatabase;User Id=myuser;Password=mypassword;" />
</connectionStrings>

堆栈包括:

System.Data.SqlClient.SqlConnection.PermissionDemand() +4876643
System.Data.SqlClient.SqlConnectionFactory.PermissionDemand(DbConnection outerConnection) +20
System.Data.ProviderBase.DbConnectionClosed.OpenConnection(DbConnection outerConnection, DbConnectionFactory connectionFactory) +117
System.Data.SqlClient.SqlConnection.Open() +122

我对.NET比较陌生,不太理解这个问题。在谷歌上找到了很多答案,但没有一个能真正解决我的问题。

这是什么意思?我的web.config文件有问题吗?我的函数有问题吗?我的SQL配置没有正确工作(我正在使用sqlexpress)?

我的主要问题是我不确定从哪里开始调试......任何帮助都将是有益的。

编辑:

失败的代码:

MySQLHelper.ExecuteNonQuery(
ConfigurationManager.AppSettings["ConnectionString"],
CommandType.Text,
sqlQuery,
sqlParams);

sqlQuery 是一个类似于 "select * from table" 的查询语句。这里与 sqlParams 无关。

另一个问题在于,我的公司使用 MySQLHelper,但我没有对其进行任何可见性的控制(只有帮助库的 dll)。在其他项目中,它一直运行良好,所以我99%确定错误不是来自此处。

我猜如果没有看到代码就无法进行调试,那么我将不得不等待与创建此帮助程序的人取得联系以获取代码。


1
你能发布一下webconfig中的连接字符串以及使用它失败的代码吗? - kscott
15个回答

45

引用连接字符串应该像这样进行:

MySQLHelper.ExecuteNonQuery(
ConfigurationManager.ConnectionStrings["MyDB"].ConnectionString,
CommandType.Text,
sqlQuery,
sqlParams);
ConfigurationManager.AppSettings["ConnectionString"] 将在 AppSettings 中查找名为 ConnectionString 的内容,但没有找到。这就是为什么你的错误消息指出 "ConnectionString" property has not been initialized,因为它正在寻找一个已初始化的 AppSettings 属性,其名称为 ConnectionStringConfigurationManager.ConnectionStrings["MyDB"].ConnectionString 指示查找名为 "MyDB" 的连接字符串。 这里有人谈论如何使用 web.config 连接字符串

20

如果数据源试图绑定数据但找不到连接字符串,就会出现此错误。根据我的经验,这通常不是因为web.config中的错误(尽管我不能100%确定)。

如果您正在以编程方式分配数据源(例如SqlDataSource)或创建查询(即使用SqlConnection / SqlCommand组合),请确保将其分配给ConnectionString。

var connection = new SqlConnection(ConfigurationManager.ConnectionStrings[nameOfString].ConnectionString);
如果您正在将一个数据绑定元素(例如GridView或ComboBox)连接到数据源(例如SqlDataSource),请确保数据源已分配给您的连接字符串之一。
请发布您的代码(包括数据绑定元素和web.config文件,以确保安全性),我们可以查看一下。
编辑:我认为问题在于您试图从AppSettings领域获取连接字符串,在编程中这不是它存在的位置。尝试用 ConfigurationManager.ConnectionStrings["ConnectionString"].ConnectionString 替换它(如果 ConnectionString 是您的连接字符串名称)。

我不确定是否理解了,我应该将连接字符串的位置移动到web.config文件中吗? - marcgg
顺便说一下,它不在AppSettings中。 - marcgg
不,没关系。只需更改MySQLHelper的代码,以获取连接字符串,就像我在我的编辑中所做的那样。 - Matthew Jones
更改为 ConfigurationManager.ConnectionStrings["ConnectionString"].ConnectionString 不起作用,但你接近了。kscott 的解决方案是有效的,我只需要使用 MyDB 字符串。 - marcgg

3

连接字符串不在AppSettings中。

您需要查找的内容在以下位置:

System.Configuration.ConfigurationManager.ConnectionStrings["MyDB"]...

1

在开发 Asp Net Core web api 项目时,我遇到了同样的问题。 我按照建议修改了代码中的引用:

ConfigurationManager.ConnectionStrings["NameOfTheConnectionString"].ConnectionString

但是将对 System.Configuration.dll 的引用添加到代码中会导致错误“引用无效或不受支持”。

Configuration manager error

为了解决这个问题,我需要使用NuGet下载包System.Configuration.ConfigurationManager(工具 -> Nuget Package->管理解决方案的Nuget包)。

0

这是对我有效的方法:

var oSQLConn = new 
SqlConnection(
System.Configuration.ConfigurationManager.ConnectionStrings["Conn1"].ToString()
);

0

如果您尝试了上面提到的每个答案,那么有可能是基于错误的sqlconnection检查条件创建了新的SQL连接。 以下是情况:

如果先前未初始化,则返回新的SQL连接的常见方法,否则将返回现有连接。

public SqlConnection GetSqlconnection()
{
    try
    {
        if(sqlConnection!=null)
        {
            sqlConnection = new SqlConnection(WebConfigurationManager.ConnectionStrings["ConnectionString"].ConnectionString);

        }
        return sqlConnection;
    }catch(Exception e )
    {
        WriteLog.WriteErrorLog(log, "GetSqlconnection() | ", e.Message, e.StackTrace);
        throw e;
    }
    // return sqlConnection;
    
}

//here two methods which are using above GetSqlconnection() method 

public void getUser()
{
//call to GetSqlconnection() method to fetch user from db 
//connection.open() 
//query execution logic will be here 
//connection.close() <---here is object state changed --->
}

public void getProduct()
{
//call to GetSqlconnection() method with no connection string properties
//connection.open() ; <--- here exception will be thrown as onnectionstring-property-has-not-been-initialized
//query execution logic will be here .
//connection.close(). 
}

一旦在getUser()方法中关闭连接,sqlconnection对象将发生两个变化: 1.状态从“Open”更改为“Close” 2.ConnectionString属性将更改为“”

因此,当您在getProduct()中调用GetSqlconnection()方法时, 根据GetSqlconnection()中的if条件,它将返回具有状态为“Closed”和ConnectionString为“”的现有sqlConnection对象。 因此,在connection.open()处会抛出异常,因为connectionstring为空。

为了解决这个问题,在重用sqlConnection时,我们应该在GetSqlconnection()方法中进行如下检查:

try
{
    if(sqlConnection==null || Convert.ToString(sqlConnection.State)=="Closed") 
    {
        sqlConnection = new SqlConnection(WebConfigurationManager.ConnectionStrings["ConnectionString"].ConnectionString);

    }
    return sqlConnection;
}catch(Exception e )
{
    WriteLog.WriteErrorLog(log, "GetSqlconnection() | ", e.Message, e.StackTrace);
    throw e;
}

0
我发现当我创建Sqlconnection = new SqlConnection()时,我忘记传递我的connectionString变量。所以我改变了初始化connectionString的方式(但什么也没改变)。
如果你和我一样,请不要忘记将你的字符串连接传递给SqlConnection参数。 Sqlconnection = new SqlConnection("ConnString")

0
在startup.cs文件中提供ConnectionStrings,例如: services.Configure<Readconfig>(Configuration.GetSection("ConnectionStrings"));

1
您的答案可以通过添加更多的支持信息来改进。请[编辑]以添加更多细节,例如引用或文档,以便他人可以确认您的答案是否正确。您可以在帮助中心中找到有关编写好答案的更多信息。 - Community

0

在我的情况下,我使用了 .json 文件中的连接字符串来连接到数据库。不知何故,我将

ConnectionString

改成了

ConnectionStrings(多加了一个 's'),一切都正常。


0

我无法解决这个确切的问题,也没有时间进行调查,但在我的情况下,它与Windows Server 2012 R2或框架版本有关。完全相同的代码、应用程序和配置文件在其他运行其他Windows版本的机器上运行得非常顺畅。至少尝试了消费者版本(Windows 8、10和11)。只有Windows Server 2012拒绝执行并显示错误信息。

System.Data.SqlClient.SqlConnection.PermissionDemand()


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接