2

VisualStudio2010のボタンの後ろに次のコードがあります

private void button1_Click(object sender, EventArgs e)
{
    SqlCeConnection Con = new SqlCeConnection();

    Con.ConnectionString = "Data Source = 'DB.sdf';" + "Password='my Password';";

    SqlCeCommand Query = new SqlCeCommand("SELECT Password FROM Admin");

    try        
    {
       Con.Open();
    }
    catch(Exception ex)
    {
       MessageBox.Show(ex.Message);
    }

    SqlCeDataReader Reader=Query.ExecuteReader();
    MessageBox.Show(Reader["Password"].ToString());
}

正常に動作し、接続に例外はありませんが、ボタンを押すと例外が発生します。

エラー:リーダー接続プロパティの実行が初期化されていません

4

3 に答える 3

2

UIイベントハンドラーのデータベースアクセスコードについてコメントするつもりはありません。答えを大きく損なうことになります。私が言うのは、それをしないようにすることだけです。

コマンドコンストラクターまたは関連するConnectionプロパティのいずれかで、接続をコマンドに関連付けていません


メソッド全体を次のように書き直して、危険なトライキャッチ(すべてをキャッチする、非常に悪い習慣)を排除し、ファクトusingステートメントを利用してオブジェクトの破棄も処理します。

string password = null;

using (var conn = new SqlCeConnection("Data Source = 'AlviMBRental.sdf'; Password='my Password';"))
using (var comm = new SqlCeCommand("SELECT Password FROM Admin", conn))
{
    conn.Open();

    using (var reader = comm.ExecuteReader())
    {
        password = (string)reader["Password"];

    } // Dispose reader

    // Alternatively, if the resultset is single column and single row, you can do:
    var passwordScalar = (string)comm.ExecuteScalar();

} // Dispose command, close / dispose connection.

MessageBox.Show(password ?? "No password found.");
于 2012-06-12T14:01:03.617 に答える
1

コマンドを接続に関連付けていません-これを試してください:

SqlCeConnection Con = new SqlCeConnection("Data Source = 'AlviMBRental.sdf';Password='my Password';";

SqlCeCommand Query = new SqlCeCommand("SELECT Password FROM Admin", Con);  //   <== specify "Con" here!

それ以外の場合は、SqlCeCommand作業するための接続がありません...。

于 2012-06-12T14:01:29.467 に答える
0

このようにしてみてください:

private void button1_Click(object sender, EventArgs e)
{
    var connectionString = "Data Source='AlviMBRental.sdf';Password='my Password';";
    using (var con = new SqlCeConnection(connectionString))
    using (var cmd = con.CreateCommand())
    {
        con.Open();
        cmd.CommandText = "SELECT Password FROM Admin";
        using (var reader = cmd.ExecuteReader())        
        {
            if (reader.Read())
            {
                MessageBox.Show(reader["Password"].ToString())
            }
        }
    }
}

接続がコマンドオブジェクトに関連付けられていることを確認してください。また、私の例に示すように、IDisposableオブジェクトをusingステートメントでラップしていることを確認してください。

于 2012-06-12T14:03:08.997 に答える