none
初歩的ですいません。 .sdf ファイル(ローカルデータベース読み取り専用)のアクセスをするコード(メソッド)はどのクラスに入れるべきでしょうか? RRS feed

  • 質問

  • VS2010 ProのC#を使っています。

    なんとか.sdfファイルへのアクセスは出来るようになりました。しかしなんか無駄なようなコードになってしまっています。

    1.)ユーザーから入力されたパラメータをクエリするメソッドは主にForm1(メインのフォーム)のイベントハンドラメソッドに呼ばれるのでForm1のprivate メソッドに書いているのですがこれで良いのでしょうか。

    2.)最初は専用ユーティリティクラスを作ってそこのpublic メソッドに書いたりもしたのです。その専用クラスを static にしてみたり public にしてみたりもしました。(その後学習した結果を使えばそれで解決出来るかもしれませんが LINQtoSQLの クエリ結果が 参考書ではvarで宣言されていてデータをアクセスするメソッドの返り値の型をどうするのかがわからなかった。今はテーブルのRowまたはその配列をout 指定で参照渡しにすれば良いらしいと気づきましたが。)

    全くのローカルデータベースでリモートに接続して内容を更新するわけでもなく、リモートデータベースのキャッシュみたいに使うわけでもなく mode = Read Only で開いているので一度DataSet(を継承した)クラスにテーブルを読み込んだらその DataSet を使い回した方が良いのではないかと思うのですが、現状では1.)のメソッドを呼ばれるたびに.sdfファイルから SqlCeDataAdapter などを使って DataSetに読み込んでます。

    それで質問したいのは1.)が良いのか2、.)が良いのか、それとも他に定石があるのか。ローカルデータベースを一度だけ読み込んでそれを使い回すにはどうすればいいのか、という事です。(もちろん排他制御も必要ありません。) C言語のようなグローバル変数(オブジェクト)は使えないのですよね。

    2011年2月8日 11:56

回答

  • 1.)ユーザーから入力されたパラメータをクエリするメソッドは主にForm1(メインのフォーム)のイベントハンドラメソッドに呼ばれるのでForm1のprivate メソッドに書いているのですがこれで良いのでしょうか。

    他のクラスからそのメソッドを実行しないのであればprivateでかまいません。逆に言えば、他のクラスから実行させたくなければprivateにします。

    それで質問したいのは1.)が良いのか2、.)が良いのか、それとも他に定石があるのか。ローカルデータベースを一度だけ読み込んでそれを使い回すにはどうすればいいのか、という事です。(もちろん排他制御も必要ありません。) C言語のようなグローバル変数(オブジェクト)は使えないのですよね。

    DataTableがどれぐらいのサイズになるのかにもよると思いますが、ご提示された条件であれば、staticメソッドで読み込み、staticな変数で保持すれば良いように思います。publicなクラスにおけるstaticな変数はグローバル変数として振る舞います。

     


    ★良い回答には回答済みマークを付けよう! わんくま同盟 MVP - Visual C# http://d.hatena.ne.jp/trapemiya/
    • 回答としてマーク sakana8897 2011年2月8日 22:40
    2011年2月8日 12:50
    モデレータ
  • 結局いろいろやってみてクラスは static で、そのメンバー(メソッドやデータ)を static public にすることでなんとかビルド&実行出来るようになりました。

    ちょっと教えてもらった方法からは外れてしまっているかもしれませんが・・・


    いえ、外れているわけではなくて、それと同じことを書いたつもりだったのですが、うまく伝わらなかったかもしれません。publicはスコープを決定するもの、つまり、どこまで公開するかを決めるものであり、staticはインスタンスでは使用しないということを表します。一度、静的クラス、静的メソッドなどについて確認されておかれると良いと思います。

    (参考)
    静的変数・静的メソッド
    http://ufcpp.net/study/csharp/oo_static.html#class

     


    ★良い回答には回答済みマークを付けよう! わんくま同盟 MVP - Visual C# http://d.hatena.ne.jp/trapemiya/
    • 回答としてマーク sakana8897 2011年2月9日 6:47
    2011年2月9日 5:33
    モデレータ

すべての返信

  • 1.)ユーザーから入力されたパラメータをクエリするメソッドは主にForm1(メインのフォーム)のイベントハンドラメソッドに呼ばれるのでForm1のprivate メソッドに書いているのですがこれで良いのでしょうか。

    他のクラスからそのメソッドを実行しないのであればprivateでかまいません。逆に言えば、他のクラスから実行させたくなければprivateにします。

    それで質問したいのは1.)が良いのか2、.)が良いのか、それとも他に定石があるのか。ローカルデータベースを一度だけ読み込んでそれを使い回すにはどうすればいいのか、という事です。(もちろん排他制御も必要ありません。) C言語のようなグローバル変数(オブジェクト)は使えないのですよね。

    DataTableがどれぐらいのサイズになるのかにもよると思いますが、ご提示された条件であれば、staticメソッドで読み込み、staticな変数で保持すれば良いように思います。publicなクラスにおけるstaticな変数はグローバル変数として振る舞います。

     


    ★良い回答には回答済みマークを付けよう! わんくま同盟 MVP - Visual C# http://d.hatena.ne.jp/trapemiya/
    • 回答としてマーク sakana8897 2011年2月8日 22:40
    2011年2月8日 12:50
    モデレータ
  • trapemiyaさん、返信おくれてすみません。

    そのDataSetやユーティリティメソッドを集めたクラスを作って public にしてみました。するとMain メソッドでそのクラスのインスタンスを生成は出来るのですが それを public には出来ませんでした。

    それで今度は static にしました。すると「静的クラスでインスタントメンバーを宣言することは出来ません。」と言われました。

    結局いろいろやってみてクラスは static で、そのメンバー(メソッドやデータ)を static public にすることでなんとかビルド&実行出来るようになりました。

    ちょっと教えてもらった方法からは外れてしまっているかもしれませんが・・・

     

    2011年2月9日 5:02
  • 結局いろいろやってみてクラスは static で、そのメンバー(メソッドやデータ)を static public にすることでなんとかビルド&実行出来るようになりました。

    ちょっと教えてもらった方法からは外れてしまっているかもしれませんが・・・


    いえ、外れているわけではなくて、それと同じことを書いたつもりだったのですが、うまく伝わらなかったかもしれません。publicはスコープを決定するもの、つまり、どこまで公開するかを決めるものであり、staticはインスタンスでは使用しないということを表します。一度、静的クラス、静的メソッドなどについて確認されておかれると良いと思います。

    (参考)
    静的変数・静的メソッド
    http://ufcpp.net/study/csharp/oo_static.html#class

     


    ★良い回答には回答済みマークを付けよう! わんくま同盟 MVP - Visual C# http://d.hatena.ne.jp/trapemiya/
    • 回答としてマーク sakana8897 2011年2月9日 6:47
    2011年2月9日 5:33
    モデレータ
  • 同じということでよかったです。教えてもらったサイトはわかりやすいですね。

    static public という修飾子は見た記憶がないので変なコードを書いてしまったのかと思いました。(クラスがstaticでもメンバーが static とは限らないというのがよくわかりませんでした。)

     

    2011年2月9日 6:46