DOBON.NET DOBON.NETプログラミング掲示板過去ログ

ADO.NET テーブル情報だけをDataSetにセットするよい方法

環境/言語:[Windows7 VB.NET2008 SQLServer2008]
分類:[.NET]

SqlDataAdapterでデータベースの追加を行っています。
あるイベントで
特定のテーブルに追加のみする場合ですが、
DataSetへ追加を行う際に、
前もってDataSetに実際のデータベースのスキーマ情報(型・テーブル名)
を設定しておきたいのですが、よい方法はないでしょうか。

1.SELECT発行せずにできないか(存在しないデータをSELECTしてFILLはなんか変?)
2.addなどで項目を生成したくない。
3.型付DataSetは使いたくない。

イベント発生のときに、
実際のテーブルと同じDataSet(DataTable)を作って、
そこにNewRowしていき、最後にインサート
というイメージです。

このような方法をとること自体がおかしいのでしょうか。
アドバイスをお願い致します。
■No30594に返信(naoさんの記事)
> このような方法をとること自体がおかしいのでしょうか。
> アドバイスをお願い致します。

理由によりますが、

> 3.型付DataSetは使いたくない。

これがわからないです。
選択肢として型付 DataSet (TableAdapter) が使えるのならば使うべきだと思います。
なぜ「使いたくない」のか、お聞かせ願えますか?
とても早いご返信、どうもです。

> なぜ「使いたくない」のか、お聞かせ願えますか?

なぜ、は私にも実は(正確な理由は)わからないのです。
ただ、今いるプロジェクトで一切使っていないからなのか(予想ですが)
型付DataSetは使わない。という感じで全体がすすんでいるだけです。。。
■No30596に返信(naoさんの記事)

今、手元に実行環境がないので確かではないですが
以下のような感じでサーバーへのアクセスを最小限にしてテーブル構造を取得できるかと思います。

        Using con As New SqlClient.SqlConnection("〜")
            con.Open()
            Dim adp As New SqlClient.SqlDataAdapter()
            adp.SelectCommand = New SqlClient.SqlCommand("Select * From TableA", con)
            Dim tbl As New DataTable
            adp.FillSchema(tbl, SchemaType.Mapped)

            con.Close()
        End Using
shuさん

FillSchemaを使う場合もやはり
SELECT文("Select * From TableA")が必要ですよね。

存在しないデータをSELECTしてFILLするのと、
FillSchema("Select * From TableA")は、負荷は同じようなものなのでしょうか。
気にするまでもないのですかね。

ひとまず、FillSchemaでやってみます。
どうもありがとうございます。

他、私だったらこうやる、等ありましたら教えてください。
■No30601に返信(naoさんの記事)

> 存在しないデータをSELECTしてFILLするのと、
> FillSchema("Select * From TableA")は、負荷は同じようなものなのでしょうか。
> 気にするまでもないのですかね。
FillにてWhere 条件で一致レコードがなくても全件アクセスになりますが、
FillSchemaではテーブル構造へのアクセスしかしないので負荷は少ないです。

また
SET FMTONLY ON
Select文
SET FMTONLY OFF
とするとFillSchemaでなくてもデータの取得をせずに構造のみ取得できます。

> FillにてWhere 条件で一致レコードがなくても全件アクセスになりますが、
> FillSchemaではテーブル構造へのアクセスしかしないので負荷は少ないです。

なるほど、非常にすっきりしました。
ありがとうございました。

解決にします。

皆さんどうもありがとうございました。
解決済み!

DOBON.NET | プログラミング道 | プログラミング掲示板