1

受験票を作ろうとしています。ファイル内のさまざまなテーブルから質問を取得し、クリックQ1buttonして回答を確認し、適切なメッセージを出力することを想定しています。さらに、ユーザーに 8 つの質問をし、(正しく答えられた場合) で答えを更新することを想定していますcounterCorrectAns。クリックQ1buttonすると、特定のテーブルからランダムな質問のテキスト ボックスが更新されます。

private int randomQues=0,number=1,counterCorrectAns=0;
private string correctAns = "";

void SetQues1Box(int number)
{
    string whatTake="",fromWhere="",autoNum="";

    from.Text =""+ number;
    to.Text = "" + 8;
    string connectionString = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=C:\\Users\\hodaya\\Desktop\\Project.accdb";

    using (OleDbConnection connection = new OleDbConnection(connectionString))
    {
        switch (number)
        {
            case 1: whatTake = "misHQueA, mishAnsA"; fromWhere = "mishvaotA"; autoNum = "mishAnum"; break;
            case 2: whatTake = "misHQueB, mishAnsB"; fromWhere = "mishvaotB"; autoNum = "mishBnum"; break;

        }
        string sql = "SELECT " + whatTake + " FROM " + fromWhere + " WHERE " + autoNum + "=?";

        Random r = new Random();
        randomQues=r.Next(1, 25);
        using (OleDbCommand command = new OleDbCommand(sql, connection))
        {
            connection.Open();
            command.Parameters.AddWithValue(autoNum, randomQues);
            OleDbDataReader reader = command.ExecuteReader();
            reader.Read();
            q1Box.Text = reader.GetString(0);
            correctAns = ("" + reader.GetInt32(1));
            connection.Close();
    //**// }
        }
    }
}

private void Q1Button_Click(object sender, EventArgs e)
{
    string exp;

    if (number <= 8)
    {
        if (ans1Box.Text == correctAns)
        {
            counterCorrectAns++;
            exp = "correct answer";
        }
        else
            exp = "'wrong answer";
        MessageBox.Show(exp);
        number = number + 1;
        SetQues1Box(number);
    }
    else
    {
        if (counterCorrectAns >= 4)
            MessageBox.Show("your great");
        else
            MessageBox.Show("you are need more practice");
        this.Close();
    }

}

私が得るエラー:COM object that has been separated from its underlying RCW cannot be used.先頭に //**// がある行。

4

1 に答える 1

1

を使用してすでに管理しconnection.close()ます。

MSDNのドキュメントでは、connection.close()命令を使用してコードをラップするかどうかは記載されていません。

何が起こっているのかというと、usingはすでに閉じている接続を閉じようとします。

ただし、readerusingブロックが終了する前に閉じる必要があります

于 2012-04-26T13:35:00.923 に答える