5

私はすべてを検索して試しましたが、これを理解できません。簡単なことをしようとしていますが、何か間違っているようです。基本的に、入金したユーザーは 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

true または false を返す方法は次のとおりです。

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;
}

これに関するヘルプ/ガイダンスは大歓迎です。

4

2 に答える 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;
        }
    }
}
于 2013-08-17T01:34:20.383 に答える
3

web.config で:

<appSettings>
    <add key="ConnectionString" value="Data Source=.\SQLEXPRESS;AttachDbFilename=|DataDirectory|\Database.mdf;Integrated Security=True;User Instance=True"/>
</appSettings>
于 2013-08-17T01:39:21.130 に答える