質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
.NET Framework 3.5

.NET Framework-3.5は、NET Framework 2.0にアセンブリを追加(3.0も含む)したものをベースにしています。

VB.NET

Microsoft Visual Basic .NETのことで、Microsoft Visual Basic(VB6)の後継。 .NET環境向けのプログラムを開発することができます。 現在のVB.NETでは、.NET Frameworkを利用して開発を行うことが可能です。

Q&A

解決済

1回答

7375閲覧

OleDbDataAdapter.Fill の仕様

ARADDIO

総合スコア160

.NET Framework 3.5

.NET Framework-3.5は、NET Framework 2.0にアセンブリを追加(3.0も含む)したものをベースにしています。

VB.NET

Microsoft Visual Basic .NETのことで、Microsoft Visual Basic(VB6)の後継。 .NET環境向けのプログラムを開発することができます。 現在のVB.NETでは、.NET Frameworkを利用して開発を行うことが可能です。

0グッド

1クリップ

投稿2016/08/29 09:04

お世話になります。

現在、VB.NETで作成中の画面にて
ストアドプロシージャから取得したADODB.Recordset型のデータを
DataTable型に変換しようとしています。

そこで、OleDbDataAdapter.Fill メソッド (DataTable, Object) を使用しようと考えています。

変換部分のロジックは↓のようなイメージです。

VB.NET

1 Public Function ConvRsToDt(ByVal rsIn As ADODB.Recordset) As DataTable 2 3 ' 変換用の変数を宣言する 4 Dim Adp As OleDbDataAdapter = New OleDbDataAdapter 5 Dim dtConv As DataTable = New DataTable 6 7 ' レコードセットのデータをデータテーブルに格納する 8 Adp.Fill(dtConv, rsIn) 9 10 Return dtConv 11 12 End Function

★背景、前提等
今回の画面はDBからデータ検索後、帳票出力が可能な画面です。
検索→印刷というオペレーションを行う場合、検索時/印刷時 で計2回上記の変換部品を呼び出しており、
DataTableをGrapeCity.spread.DataSource、GrapeCity.ActiveReport.DataSouce
にそれぞれ連携しています。

検索を行わず印刷を行うことはできず、印刷時には検索ボタン押下時に取得したRecordSetを
そのまま使いまわしています。

★発生している問題
検索時(1回目のConvRsToDt呼び出し)では、ConvRsToDtの戻り値であるDataTableに値が入っている。
印刷時(2回目のConvRsToDt呼び出し)では、ConvRsToDtの戻り値であるDataTableに値が入っていない。

★試したこと・調べたこと
・検索時、印刷時 それぞれの ConvRsToDtの呼び出し直前で 引数となるRecordsetには値が入っていることを確認。(ほかの処理で初期化等されていないことを確認)

・印刷時、検索時に取得したRecordSetを使いまわさず、再度検索処理を行い、Recordsetを取得しなおした場合、ConvRsToDtの戻り値(DataTable)に値が入ることを確認。

・印刷時(2回目のConvRsToDt呼び出し)では、DataTableにデータはできていないが、カラム情報は作成されていることを確認。

★質問内容

OleDbDataAdapter.Fillを使用した際の上記動作は、OleDbDataAdapter.Fillの仕様なのでしょうか?
使用方法が間違っているのでしょうか。

ご存知の方いらっしゃいましたらご教示お願いします。

(質問内容長くなり申し訳ありません。 わかりにくい部分、不足情報ありましたらご指摘いただけたら可能な範囲で追記させていただきますのでよろしくお願いいたします。)


DB:SQL Server 2008 R2
言語:VB.NET(.Net Framework 3.5)
IDE:Visual Studio 2015

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

OleDbDataAdapter.Fill の仕様を分かる範囲で確認しましたので、回答させて頂きます。

まず、RecordSet の仕様について、RecordSet は接続型のカーソルを持つ結果セットであり、
レコード1件を読み込んだ後、次のレコードに進む操作を末尾まで繰り返して使用します。

Recordset オブジェクトの基本

この事から1度目の Fill メソッドで末尾までカーソルが進んでおり、2度目の Fill メソッドで
末尾以降にデータが無いため、0件になっているのではないでしょうか。

Fill メソッドのソースを確認したところ、RecordSet を OleDbDataReader で読み込んで
いるところまで確認できました。おそらく Open 済みの RecordSet を現在のカーソル位置から
末尾まで読み込んでいると思われます。

OleDbDataAdapter.Fill のソース

RecordSet を再取得するか、前方スクロールカーソル以外なら先頭までカーソルを戻す
ことで解決すると考えられます。

投稿2016/09/03 09:25

Tipo

総合スコア239

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

ARADDIO

2016/09/05 09:38

回答ありがとうございます! 解決できました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問