1

私は VB6 と VB.NET の両方で開発を行い、VB6 で ADODB オブジェクトを使用してレコードセット ナビゲーション (MoveFirst、MoveNext などのメソッド) を処理し、ADO.NET を使用してクエリを行ごとの性質 (つまり、For Each Row In Table.Rows ...)

しかし今、私はジレンマに陥っているようです。現在、古い Recordset オブジェクトの Move コマンドと同等の機能を使用する必要があるプログラムを VB.NET で作成しています。VB.NET には、この機能をサポートするある種のオブジェクトがありますか? それとも、古い ADODB COM オブジェクトを使用する必要がありますか?

編集: 明確にするために、ユーザーがクエリを前後に移動できるようにしたいと考えています。行をループするのは簡単な作業です。

4

4 に答える 4

2

悪い昔に戻る必要はありません。疑似コードの例を示すことができれば、vb.net に変換できます。

これは一種の一般的な方法です。

Dim ds as DataSet

'populate your DataSet'

For each dr as DataRow in ds.Tables(<tableIndex>).Rows
  'Do something with the row'

Next

編集ごとに 1: ユーザーは、クエリではなく、結果をナビゲートします。したがって、あなたがしたいことは、a) 結果を取得して ds.Tables.Row() の現在の行インデックスのみをそれらに表示するか、b) ナビゲーションごとに新しいクエリを実行することです (実際にはうまく機能するオプションではありません)。

コメントごと: いいえ、ありません。しかし、ユーザーは通常、このようにデータベースをインタラクティブに操作することはありません。結果のデータセット/テーブルを取得し、ボタンを使用してデータセット/テーブルから関連する行を取得する必要があります。

  • 最初の行は DataTable.Rows(0) です
  • 最後の行は DataTable.Rows(DataTable.Rows.Count-1) です
    • 間にある任意の行に対して (現在表示されている行インデックスをアプリに保存します)、次に呼び出します
  • DataTable.Rows(currentRowIndex -1) 以前と
  • 次の DataTable.Rows(currentRowIndex +1)。
于 2008-11-07T17:58:08.177 に答える
2

それはすべて使用法に依存します。1 つ以上のクエリの結果を一覧表示するだけでよい場合は、datareader を使用する必要があります。DOKが指摘したように、読み取り専用で転送専用なので高速です。 http://www.startvbdotnet.com/ado/sqlserver.aspx

レコードをナビゲートする必要がある場合は、データセットを使用する必要があります。 http://www.c-sharpcorner.com/UploadFile/raghavnayak/DataSetsIn.NET12032005003647AM/DataSetsIn.NET.aspx

データセットには「切断された」作業という利点もあるため、すべてのロジックを構築し、データが必要な場合にのみ Fill メソッドを呼び出します。データセットが作成され、DB から切断されたデータの操作を開始できます。

ブルーノ・フィゲイレド http://www.brunofigueiredo.com

于 2008-11-07T18:08:47.983 に答える
0

.Net では、これを行う方法が多数あります。私が気に入っているのは、複数のレコードセットを返すことができる DataReader を使用することです。While DataReader.Read を使用して、そのレコードをループできます。

DataReader を使用する利点の 1 つは、転送専用で読み取り専用のオブジェクトであるため、高速で軽量であることです。

ユーザーが一度に 1 つずつすべてのレコードをナビゲートできるようにするには、ユーザーがナビゲートしている間、DataReader を開いたままにしないでください。DataReader レコードをオブジェクトに読み込むことができます。または、レコードを DataSet に取得し、DataTable から DataRows を一度に 1 つずつ表示することもできます。

可能であれば、レコードが多すぎない場合は、すべてのレコードを一度に取得することをお勧めします。これにより、データベースへの繰り返しの呼び出しが節約されます。

一方、多数のレコードがある場合は、最初のいくつか (たとえば 10 または 20) を取得し、ユーザーが最初のセットを超えてクリックした場合に、新しいデータベース呼び出しで次のレコード セットのみを取得できます。これは遅延読み込みです。

于 2008-11-07T17:56:50.300 に答える
0

以下は、datareader を使用した簡単な例です。

            Dim cmd As New OleDb.OleDbCommand(sql, Conn) 'You can also use command parameter here
            Dim dr As OleDb.OleDbDataReader
            dr = cmd.ExecuteReader

            While dr.Read

          ‘Do something with data
          ‘ access fields
          dr("fieldname")
          ‘Check for null
          IsDBNull(dr("fieldname"))

            End While

            dr.Close()
于 2008-11-07T18:04:37.960 に答える