none
データセットでパラメータを指定する方法 RRS feed

  • 質問

  • データーソースをaccessにして、データセットを定義し、その中でデータテーブルおよびパラメータクエリーを定義しました。
    コードの中でパラメータ値を渡す方法がわかりません。

    データセットを使わない場合は、connectionを確立し、cmdオブジェクトで
    cmd.Parameters.AddWithValue
    で引き渡す方法で可能ですが、データセットを使う場合の渡し方がわかりません。

    データテーブル名.テーブルアダプター名.メソッド名(パラメータ値)という構文(”プログラミングADO.NET2.0” 509P)は、データソースがSQLサーバーの場合は有効ですが、アクセスの場合は列指定を意味しエラーが発生します。

    どなたか解決法をご存じの方御教示をお願いします。

    2010年3月6日 9:28

回答

  • データテーブル名.テーブルアダプター名.メソッド名(パラメータ値)という構文(”プログラミングADO.NET2.0” 509P)は、データソースがSQLサーバーの場合は有効ですが、アクセスの場合は列指定を意味しエラーが発生します。
    mdbの場合でも問題ないはずですが、どのようなエラーが発生するのでしょうか?

    ★良い回答には回答済みマークを付けよう! わんくま同盟 MVP - Visual C# http://blogs.wankuma.com/trapemiya/
    • 回答としてマーク matushiro97 2010年3月6日 17:42
    2010年3月6日 13:42
    モデレータ
  • Access に対して Visual Studio のウィザードで型付 DataSet + TableAdapter を作
    ったというのはわかりました(それを最初に書いておいてほしかったです)。

    以下のページの「D. テーブルアダプタへのクエリ追加」が参考になりませんか?

    7.6 データコンポーネント機能によるデータアクセスコンポーネントの開発
    http://www.atmarkit.co.jp/fdotnet/bookpreview/vs2005webapp_07/vs2005webapp_07_03.html

    • 回答としてマーク matushiro97 2010年3月6日 17:43
    2010年3月6日 14:44
  • テーブルアダプターのSQL文にパラメータを使っただけでは駄目で、プロパティのパラメータコレクションにパラメータ名を登録しなければならないことがわかりました。
    登録は、パラメータコレクションエディタを使うようです。

    登録後はメソッドの引数がパラメータになるので、そのまま引数にパラメータ値を渡せばよいです。

    >trapemiyaさん
    mdbでもSQL同様うまくいきました。
    mdbの場合は順序で複数のパラメータを判定するので、順序が大切なようです。

    >SufferOnWwwさん
    ありがとうございました。ご紹介いただいたページよくわかりました。

    ということで、当面の問題はクリアーできたのですが以下のような奇怪な現象が発生してもう遭難しそうです。
    1、パラメータを三つ使っていますが、クエリービルダーを完了しようとすると"@近辺のwhere句にエラーがあります。クエリーテキストを解析できません。"
    無視して完了し、クエリビルダーで実行するるとうまく行きますし、デザイナー画面で”データのプレビュー”を実行してもうまく行きます。このエラーはどこに影響が出るのか不気味です。
    2、コードでGetDataメソッドを使ってテーブルアダプターからデータテーブルにデータを格納しようとすると「制約を有効にできませんでした。....」という例外が発生し停止します。理由がわからず、とりあえずデータセットのEnforceConstraintsプロパティをfalseに設定したのですが、同じエラーがでます。列のキーを削除したりしましたが改善しません。

    どうも、型付きのデータセットやパラメータクエリーは私の手に余ります。
    昔ながらの、SQL文にパラメータ値を埋め込む原始的な方法で、コネクション確立、SQL文設定、実行で試してみます。
    私の場合、金融データの統計解析のためにコードを書いており、システム作成が目的ではありません。
    データをDBから効率的に抽出することが目的なので、あまり新しい機能で行き詰まっていれは本末転倒ですから....
    皆様、色々とご教示くださりありがとうございました。


    • 回答としてマーク matushiro97 2010年3月6日 17:43
    2010年3月6日 17:42

すべての返信

  • パラメータの設定方法については、以下のページが参考になると思います。

    OleDbDataAdapter.SelectCommand プロパティ
    http://msdn.microsoft.com/ja-jp/library/system.data.oledb.oledbdataadapter.selectcommand.aspx


    DB のアクセスの仕方には接続型と非接続型の2種類あって少々方法が異な
    ります。DataSet は非接続型アクセスのために用います。詳しくは以下の
    ページの「非接続型データアクセスの動作とそのアドバンテージ」を見て
    ください。

    DB 設計者のための明解 ADO.NET 第 1 回
    http://msdn.microsoft.com/ja-jp/events/dd231281.aspx

    2010年3月6日 9:56
  • SufferOnWwww様
    ご回答ありがとうございました。

    質問が言葉不足でした。
    質問は、厳密に型指定されたデータセットに関するものです。

    デザイナーを使って、データセットを作成し、データセット内にデータテーブルとパラメータクエリーを含むtableAdapterを作成しました。
    コートで、パラメータクエリーに値を引き渡す方法がわかりません。

    御回答いただいたOleDbDataAdapter.SelectCommandはテーブルアダプターが、dataadapterの基本クラスであるdbDataAdapterの派生クラスではなくsystem.componetntmadelのcomponetntクラスから派生しているため、selectcommandは使えないようです。実際、定義したテーブルアダプターに.を使ってもselectcommandは選択候補に現れません、

    何か解決策はありますでしょうか。
    よろしくお願いします。

    matushiro97

    2010年3月6日 12:33
  • データテーブル名.テーブルアダプター名.メソッド名(パラメータ値)という構文(”プログラミングADO.NET2.0” 509P)は、データソースがSQLサーバーの場合は有効ですが、アクセスの場合は列指定を意味しエラーが発生します。
    mdbの場合でも問題ないはずですが、どのようなエラーが発生するのでしょうか?

    ★良い回答には回答済みマークを付けよう! わんくま同盟 MVP - Visual C# http://blogs.wankuma.com/trapemiya/
    • 回答としてマーク matushiro97 2010年3月6日 17:42
    2010年3月6日 13:42
    モデレータ
  • Access に対して Visual Studio のウィザードで型付 DataSet + TableAdapter を作
    ったというのはわかりました(それを最初に書いておいてほしかったです)。

    以下のページの「D. テーブルアダプタへのクエリ追加」が参考になりませんか?

    7.6 データコンポーネント機能によるデータアクセスコンポーネントの開発
    http://www.atmarkit.co.jp/fdotnet/bookpreview/vs2005webapp_07/vs2005webapp_07_03.html

    • 回答としてマーク matushiro97 2010年3月6日 17:43
    2010年3月6日 14:44
  • テーブルアダプターのSQL文にパラメータを使っただけでは駄目で、プロパティのパラメータコレクションにパラメータ名を登録しなければならないことがわかりました。
    登録は、パラメータコレクションエディタを使うようです。

    登録後はメソッドの引数がパラメータになるので、そのまま引数にパラメータ値を渡せばよいです。

    >trapemiyaさん
    mdbでもSQL同様うまくいきました。
    mdbの場合は順序で複数のパラメータを判定するので、順序が大切なようです。

    >SufferOnWwwさん
    ありがとうございました。ご紹介いただいたページよくわかりました。

    ということで、当面の問題はクリアーできたのですが以下のような奇怪な現象が発生してもう遭難しそうです。
    1、パラメータを三つ使っていますが、クエリービルダーを完了しようとすると"@近辺のwhere句にエラーがあります。クエリーテキストを解析できません。"
    無視して完了し、クエリビルダーで実行するるとうまく行きますし、デザイナー画面で”データのプレビュー”を実行してもうまく行きます。このエラーはどこに影響が出るのか不気味です。
    2、コードでGetDataメソッドを使ってテーブルアダプターからデータテーブルにデータを格納しようとすると「制約を有効にできませんでした。....」という例外が発生し停止します。理由がわからず、とりあえずデータセットのEnforceConstraintsプロパティをfalseに設定したのですが、同じエラーがでます。列のキーを削除したりしましたが改善しません。

    どうも、型付きのデータセットやパラメータクエリーは私の手に余ります。
    昔ながらの、SQL文にパラメータ値を埋め込む原始的な方法で、コネクション確立、SQL文設定、実行で試してみます。
    私の場合、金融データの統計解析のためにコードを書いており、システム作成が目的ではありません。
    データをDBから効率的に抽出することが目的なので、あまり新しい機能で行き詰まっていれは本末転倒ですから....
    皆様、色々とご教示くださりありがとうございました。


    • 回答としてマーク matushiro97 2010年3月6日 17:43
    2010年3月6日 17:42
  • もう一段落つけられたようですが、参考のために記述しておきます。
    1、パラメータを三つ使っていますが、クエリービルダーを完了しようとすると"@近辺のwhere句にエラーがあります。クエリーテキストを解析できません。"
    無視して完了し、クエリビルダーで実行するるとうまく行きますし、デザイナー画面で”データのプレビュー”を実行してもうまく行きます。このエラーはどこに影響が出るのか不気味です。
    @を使っているのが原因でしょう。?を使ってみて下さい。なお、本来は@でも問題ありません。クエリービルダーの問題です。


    2、コードでGetDataメソッドを使ってテーブルアダプターからデータテーブルにデータを格納しようとすると「制約を有効にできませんでした。....」という例外が発生し停止します。理由がわからず、とりあえずデータセットのEnforceConstraintsプロパティをfalseに設定したのですが、同じエラーがでます。列のキーを削除したりしましたが改善しません。
    Nullの場合は例外を投げるようになっているのかもしれません。列のプロパティでNullValueを確認してみて下さい。


    どうも、型付きのデータセットやパラメータクエリーは私の手に余ります。
    昔ながらの、SQL文にパラメータ値を埋め込む原始的な方法で、コネクション確立、SQL文設定、実行で試してみます。
    私の場合、金融データの統計解析のためにコードを書いており、システム作成が目的ではありません。
    データをDBから効率的に抽出することが目的なので、あまり新しい機能で行き詰まっていれは本末転倒ですから....
    皆様、色々とご教示くださりありがとうございました。
    SQL文にパラメータ値を埋め込む方法はお勧めできません。SQLインジェクションの原因になります。パラメータ値を自力でサニタイズしてから使用すれば良いのですが、通常はSQL文にパラメータを使用してサニタイズを.NETにまかせてしまった方が安全かつ効率的です。
    TableAdapterはアプリケーションを効率的に短時間で開発する方法の一つになり得ます。必ず使わなければならないというわけではありませんが、時間がある時にでも、せっかくですのでもう少しTableAdapterと付き合って見られることをお勧めしておきます。

    ★良い回答には回答済みマークを付けよう! わんくま同盟 MVP - Visual C# http://blogs.wankuma.com/trapemiya/
    2010年3月7日 1:44
    モデレータ