为什么会出现这个错误:ConnectionString属性尚未初始化。

8
我已经搜索并尝试了一切,但无法解决这个问题。我想做的事情很简单,但似乎我做错了什么。基本上,任何存款用户,如果他们已经存款,我想返回true,如果没有,则返回false。我想这应该很容易,但我对此感到困惑。
以下是错误信息:
ConnectionString属性未初始化。
说明:在当前Web请求的执行过程中发生了一个未处理的异常。请查看堆栈跟踪以获取有关错误和代码中的来源的更多信息。
异常详细信息:System.InvalidOperationException: ConnectionString属性未初始化。
源错误:
Line 59:         Cmd.Parameters.AddWithValue("@UserID", userId);
Line 60:         con.Open();
Line 61: 
Line 62:         result = (int)Cmd.ExecuteScalar();

以下是堆栈跟踪的顶部:

[InvalidOperationException: ConnectionString属性尚未初始化。] System.Data.SqlClient.SqlConnection.PermissionDemand() +4879939 System.Data.SqlClient.SqlConnectionFactory.PermissionDemand(DbConnection outerConnection) +20 System.Data.ProviderBase.DbConnectionClosed.OpenConnection(DbConnection outerConnection, DbConnectionFactory connectionFactory) +117 System.Data.SqlClient.SqlConnection.Open() +122

这是我的方法,用于返回真或假:

public static bool HasDeposit(int userId)
{
    int result = 0;
    //since executeScalar is intended to retreive only a single value
    //from a query, we select the number of results instead of the email address
    //of each matching result.
    string queryTransaction = "SELECT COUNT(UserID) FROM Transaction WHERE TransactionTypeID = 6 AND UserID = @UserID";
    string constr = System.Configuration.ConfigurationManager.AppSettings["ConnectionString"];
    SqlConnection con = new SqlConnection(constr);

    SqlCommand Cmd = new SqlCommand(queryTransaction, con);

    Cmd.Parameters.AddWithValue("@UserID", userId);
    con.Open();

    result = (int)Cmd.ExecuteScalar();

    //returning a boolean comparator works like this :
    //will return true if the result is greater than zero, but false if it is not.
    con.Close();
    return result > 0;
}

任何关于此事的帮助/指导将不胜感激。

1
尝试检查变量"constr"中的内容。 - Mitch Wheat
您正在检查“AppSettings”,正如Kane所指出的那样,在配置文件中放置连接字符串的位置通常不是这里。 - HABO
展示你的应用程序设置。 - R.C
@HABO AppSetting出了什么问题?这也是代码无法正常工作的原因吗? - Muflix
1
@Muflix AppSettings 并没有错,只是通常情况下连接字符串在 ConnectionStrings 中,就像 Kane 的回答中所示。只要代码在配置文件的相应部分查找定义的值,一切都匹配。 - HABO
2个回答

12

如果你的连接字符串在配置文件中像这样

<connectionStrings>
    <add name="ConnectionString" connectionString="data source=.;Initial Catalog=MyDatabase;Integrated Security=SSPI" providerName="System.Data.SqlClient" />
</connectionStrings>

那么您需要使用以下方法来访问它:System.Configuration.ConfigurationManager.ConnectionStrings["ConnectionString"].ConnectionString

您还应该将数据访问包装在using语句中,以避免泄漏连接并淹没池。以下是使用using语句的更新示例。

public static bool HasDeposit(int userId)
{
    //since executeScalar is intended to retreive only a single value
    //from a query, we select the number of results instead of the email address
    //of each matching result.
    const string queryTransaction = "SELECT COUNT(UserID) FROM Transaction WHERE TransactionTypeID = 6 AND UserID = @UserID";

    var constr = System.Configuration.ConfigurationManager.ConnectionStrings["ConnectionString"].ConnectionString;

    using (var con = new SqlConnection(constr))
    {
        using (var cmd = new SqlCommand(queryTransaction, con))
        {
            cmd.Parameters.AddWithValue("@UserID", userId);
            con.Open();

            var result = (int)cmd.ExecuteScalar();

            //returning a boolean comparator works like this :
            //will return true if the result is greater than zero, but false if it is not.
            return result > 0;
        }
    }
}

3
在 web.config 文件中:
<appSettings>
    <add key="ConnectionString" value="Data Source=.\SQLEXPRESS;AttachDbFilename=|DataDirectory|\Database.mdf;Integrated Security=True;User Instance=True"/>
</appSettings>

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