3

C# を使用して OleDbConnection を介して Access データベースで SQL コマンドを実行し、その情報を使用して Windows フォームの DataGridView に入力しようとしています。接続を開き、クエリを記述して実行しましたが、Windows フォーム (dataOutput という名前) の DataGridView に結果を出力する方法が見つかりません。

    private void Query()
    {
        string cmdText = "SELECT * FROM RetentionTable " +
            "WHERE [DateTime] BETWEEN '" + getDateTimeFrom("") + "' AND '" + getDateTimeTo("") + "'";

        string ConnectionPath = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=RetentionDB.mdb";

        try
        {
            OleDbConnection cn = new OleDbConnection(ConnectionPath);
            DataSet objDataSet = new DataSet();
            OleDbDataAdapter objDataAdapter = new OleDbDataAdapter();

            if (cn.State.Equals(ConnectionState.Closed))
            {
                cn.Open();
            }

            OleDbCommand OleDbSearch = new OleDbCommand(cmdText, cn);
            OleDbSearch.ExecuteNonQuery();

            objDataAdapter.Fill(objDataSet);
            dataOutput.DataSource = objDataSet;
            cn.Close();
        }
        catch (Exception ex)
        {
            MessageBox.Show(ex.Message.ToString());
            MessageBox.Show(ex.StackTrace.ToString());
        }

    }

私が見る限り、クエリは正しく実行されていますが、objDataAdapter.Fill を使用しようとすると問題が発生します。クエリからの出力で DataSet を埋める方法を理解していないと思います。どんな助けでも大歓迎です。ありがとう!

4

5 に答える 5

0

を使用して DataSet を取得する正しい方法は、 を OleDbDataAdapterのプロパティに関連付けることですOleDbDataAdapter。OleDbCommand を OleDbDataAdapter のコンストラクターに渡すだけです。 OleDbCommandSelectCommand

また、コードでは、文字列の連結ではなく、コマンドのテキストに対してパラメーター化されたクエリを使用する必要があります。パラメーター化されたクエリを使用すると、SQL インジェクションを回避でき、フレームワーク コードによってテキスト、日付、小数変数の正しい解析が行われます。

   string cmdText = "SELECT * FROM RetentionTable WHERE [DateTime] BETWEEN ? AND ?";
   string ConnectionPath = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=RetentionDB.mdb";
   try
   {
        using(OleDbConnection cn = new OleDbConnection(ConnectionPath))
        using(OleDbCommand OleDbSearch = new OleDbCommand(cmdText, cn))
        using(OleDbDataAdapter objDataAdapter = new OleDbDataAdapter(OleDbSearch))
        {
            OleDbSearch.Parameters.AddWithValue("@p1", getDateTimeFrom(""));
            OleDbSearch.Parameters.AddWithValue("@p2", getDateTimeTo(""));
            DataSet objDataSet = new DataSet();
            cn.Open();
            objDataAdapter.Fill(objDataSet);
            dataOutput.DataSource = objDataSet;
        }
    }
    catch (Exception ex)
    {
         MessageBox.Show(ex.Message.ToString());
         MessageBox.Show(ex.StackTrace.ToString());
    }

using ステートメントは、注意すべきもう 1 つのポイントです。これにより、例外が発生した場合でも、接続、コマンド、およびアダプターを正しく閉じて破棄することが保証されます。

于 2013-07-17T18:27:00.550 に答える