C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

データベース関連処理


(過去ログ 5 を表示中)

[トピック内 13 記事 (1 - 13 表示)]  << 0 >>

■5148 / inTopicNo.1)  データベース関連処理
  
□投稿者/ リーベライ 二等兵(1回)-(2006/07/27(Thu) 23:10:46)

分類:[C#] 


分類:[C#] 

初めまして。

最近ASP.NETでWebシステムの開発を勉強中の者です。
大体DBを使っての処理は今時当然のように絡んでくるとは思いますが
.NETの場合、これをどういう感じで処理しているのかベテランの方の意見を聞いてみたいのです。

どこを見ても、例えばDBからデータを取得するサンプルはここじゃんぬねっとさんのものを参考にしますと
http://jeanne.wankuma.com/tips/sqlserver/executereader.html
このようになっています。

そこで、通常実際に業務でこういった処理を行う場合
パラメータがあることが多々あると思います。
つまり上記サンプルでいうと
// 実行する SQL コマンドを設定する
hCommand.CommandText = "SELECT LastName, FirstName FROM Employees";
この辺りの部分をこの中に書いておくと、この関数は流用できません。
よってコネクションだけでなく、コマンドも関数の外で設定して
その二つを引数にこのサンプルのような関数を呼び出すのを考えました。
しかしそれをすると、関数を呼び出す方の処理がかなり長くなってしまいます。

このような場合、ベテランの方々はどうやって解決しているのでしょう?
そのDBへの接続毎に、全て一連のプログラムを毎回書いているのでしょうか?
例えば、上記のサンプルのような関数が
画面で表示する部分と同じ数だけ存在するのでしょうか?

理想的には、コネクションとコマンドさえ渡せば
後はパラメータのセットもその呼ぶ関数の中でやってくれて
結果セットだけを返すような状態にしたいのですが
どうやったら実現できるのかがイメージできません。

上手く説明できませんが、ようは実際の業務で使用する際
データベースへの問い合わせ処理はどのようにしてまとめているでしょう?
ということになるかなと思います。

0
引用返信 編集キー/
■5149 / inTopicNo.2)  Re[1]: データベース関連処理
□投稿者/ はいこーん 曹長(83回)-(2006/07/27(Thu) 23:24:20)

分類:[C#] 

そもそもパラメータを使いましょうとか言われるに一票。

0
引用返信 編集キー/
■5160 / inTopicNo.3)  Re[1]: データベース関連処理
□投稿者/ KEI 二等兵(7回)-(2006/07/28(Fri) 12:27:07)

分類:[C#] 

No5148に返信(リーベライさんの記事)
初めましてKEIです。
残念ながらベテランでは御座いません。。。汗
自分が思うってだけですが、クラス化されたりしてるんではないかと…。
SQLを渡すだけで結果の値だけが返って来るとか…。
こちらがすごく参考になります。
「主婦と .NET と犬の記録」http://naoko.wankuma.com/index.html
何気に早く更新されないかと毎日訪問してます。
なおこ(・∀・)さん。宜しくお願いしますww


0
引用返信 編集キー/
■5161 / inTopicNo.4)  Re[2]: データベース関連処理
□投稿者/ 中博俊 神(620回)-(2006/07/28(Fri) 12:32:36)
中博俊 さんの Web サイト

分類:[C#] 

>そのDBへの接続毎に、全て一連のプログラムを毎回書いているのでしょうか?
基本的にはそう

それ以前にTableAdapterをつかって、その辺のコードは書かない

0
引用返信 編集キー/
■5188 / inTopicNo.5)  Re[3]: データベース関連処理
□投稿者/ リーベライ 二等兵(2回)-(2006/07/29(Sat) 13:50:48)

分類:[C#] 

>そもそもパラメータを使いましょうとか言われるに一票。
ちょっとよく理解できなかったのですが、どういう意味でしょうか?

>SQLを渡すだけで結果の値だけが返って来るとか…。
はい、私もそんな感じでクラス化されてるのかなぁと思っているんですが
サンプルでは基本的に「どうすればDBからデータを取れるか」を主眼に説明されているため
業務で実際に使う時にどうしているかのようなサンプルってないですよね。
それを今回聞いてみたいなと思った次第です。
当然業務によってcase-by-caseだとは思いますが、「こんな感じでやったことがある」
とか聞ければ、勉強になるかなと。

>それ以前にTableAdapterをつかって、その辺のコードは書かない
これが結構以外でした。
簡単な表示ぐらいなら、ウィザードで作れるようなものでいいかなと思ってたんですが
複雑なものをする時もこれを使うんでしょうか?


0
引用返信 編集キー/
■5189 / inTopicNo.6)  Re[1]: データベース関連処理
□投稿者/ επιστημη 伍長(55回)-(2006/07/29(Sat) 14:36:00)

分類:[C#] 

No5148に返信(リーベライさんの記事)
> 理想的には、コネクションとコマンドさえ渡せば
> 後はパラメータのセットもその呼ぶ関数の中でやってくれて
> 結果セットだけを返すような状態にしたいのですが
> どうやったら実現できるのかがイメージできません。

SqlDataReader executeSQL(コネクション, SQL文) {
あーしてこーして ExecuteReader() を返す。
}

でいいんじゃないのかしら?
# SQLオンチなので外しまくってっか?


0
引用返信 編集キー/
■5190 / inTopicNo.7)  Re[2]: データベース関連処理
□投稿者/ 中博俊 神(623回)-(2006/07/29(Sat) 15:28:56)
中博俊 さんの Web サイト

分類:[C#] 

CaseByCase過ぎるんですよね。
とにかくSQLの周辺 Connectionだとか、Commandを取得するための処理だとか云々かんぬんを共通化することはあまり意味のある行為じゃないので私はしません。
SQLを渡したらDataSetが帰ってくるメソッドを作成とかはそれこそTableAdapterがやるので、何も考える必要がありません。
結局

http://jeanne.wankuma.com/tips/sqlserver/executereader.html

この関数を流用なんて事考えたこともないというのが答えになっているかな?

0
引用返信 編集キー/
■5193 / inTopicNo.8)  Re[3]: データベース関連処理
□投稿者/ リーベライ 二等兵(3回)-(2006/07/29(Sat) 21:16:27)

分類:[C#] 

>SqlDataReader executeSQL(コネクション, SQL文) {
>あーしてこーして ExecuteReader() を返す。
>}

はい、SQLがパラメータを使用しない場合はそれで問題ないと私も思います。
でも業務に限らず、DB絡む時って往々にしてパラメータ
つまりSQLを動的に生成しますよね?
「SELECT name FROM test WHERE name = @name」
仮に上記のSQLを渡すと、そのexecuteSQL関数内で@nameに
実際の値を割り当てる処理が必要かと思います。
いつも上記のSQLであれば、固定で
>SqlDataReader executeSQL(コネクション, SQL文, @nameにあたる文字列とか) {
>@name = 第3引数をする処理
>あーしてこーして ExecuteReader() を返す。
>}
という関数にすればよいと思いますが、これだとこのSQL専用になってしまいますよね?
つまりこの関数に
「SELECT name FROM test WHERE name = @name AND pass = @pass」
を渡しても正しく動作しないという意味です。

パラメータ割り当て済のSqlCommandを引数にして呼び出してもいいのですが
こういうパラメータの割り当てが一番冗長というか、作業的でながったらしくなっているので
そういうのは何かしら汎用的につくれば、関数内で全て完結する仕組みができるのかな?
と思っていました。
ただ私には知識と技術が無くて思いつかないだけで。

でも中博俊さんの意見を聞いて、
DB関連に関しては、共通化どうとかは気にしなくて
極端に言えば、1GridViewにつき、1DB関連処理で作成してしまう(解釈あってるでしょうか?)
という方法も結構普通に使われてるようで安心しました。

先入観のようなものですが、プログラム=再利用・共通化
みたいなものがあって、なんかどうしてもまとめてできないかな〜と考えてしまうので。
そしてまとまってないと「なんだこの冗長なプログラムは」とか言われそうで・・・

なにが正しいとかっていうのはないとは思いますので、回答というか
「俺はこうしてるよ」っていう、経験談がとても参考になりました。

私は今うまく共通化するような処理にできなかったので、全部それぞれ書いてるんですが
実はそれが非常識で、「いや、普通共通化するだろ」とか言われたらどうしようかとびくびくしていました。
.NETを扱える人が社内に自分しかいなく、評価できるような人がいませんので
ベテランの方々の声が聞けるととても頼もしいです。

0
引用返信 編集キー/
■5194 / inTopicNo.9)  Re[4]: データベース関連処理
□投稿者/ 中博俊 神(624回)-(2006/07/29(Sat) 21:35:38)
中博俊 さんの Web サイト

分類:[C#] 

たとえば
SELECT name FROM test WHERE name = @name
のSQLを流すものとして自作するとしたら

publics static List<string> XXX.GetName(string name)
{
if ( name == null )
{
throw new ArgumentNullException("name");
}
using ( SqlConnection con = new SqlConnection(XXXSetting.ConnectionStrings))
{
using ( SqlCommand com = new SqlCommand("SELECT name FROM test WHERE name = @name") )
{
〜〜〜面倒なので省略
}
}
}

このようにして、データベース層を隠蔽すべきでしょう。
コネクションを引き回す必要がある(トランザクションのために)でなければコネクションすら引く必要がありません。

ただ本当にケースバイケースなのは理解してください。ここに書いてあることがすべてではありませんから。


0
引用返信 編集キー/
■5220 / inTopicNo.10)  Re[5]: データベース関連処理
□投稿者/ リーベライ 二等兵(4回)-(2006/08/01(Tue) 10:03:32)

分類:[C#] 

なるほど。
データセットとかを返すのではなくて、
もうList等でDBから完全に離れた状態で返すという方法もあるんですね。

それと今回のものとは直接関係ないのですが
じゃんぬねっとさんのサンプルも、中博俊さんが書いてくださったサンプルも
両方staticですよね?
DB関連処理ってstaticで書くのが普通なんでしょうか?

つまり私はいつもDB関連処理をまとめたクラスをつくって
public class test {

public DataSet Exec(コネクション,SQL文, パラメータ)
{
色々処理してDataSet返す
}

}

みたいな感じでやってるんですが、これってstaticでも大丈夫なんでしょうか?
というのも、Webだと大勢が同時にその処理を呼ぶと思うので
staticだと、newしなくてもそのメソッドのインスタンスが既にあって
大勢が呼び出すとなんか同じものを呼び出してかぶっておかしくなる?
と思っていたので。
まだオブジェクト指向をよく理解していないのもあるんですが・・・

どうもstaticにしていいメソッドとそうでないメソッドの区別が
未だよくわからないです。
一応、staticにして問題が出ることはあると思うのですが
外しておけば、非効率であっても、問題は起きないかなと思って
わからない場合はつけないようにしてあるのですが。

ちゃんと理解してつけるつけないがわかれば一番いいんですが・・・

0
引用返信 編集キー/
■5225 / inTopicNo.11)  Re[6]: データベース関連処理
□投稿者/ 中博俊 神(625回)-(2006/08/01(Tue) 12:16:44)
中博俊 さんの Web サイト

分類:[C#] 

Listにして返すか、Datasetで帰すかには大して意味はありません。
DataReaderでは返せないので、Listに詰め替える必要があります。

staticでもすべてパラメータだけに頼って処理する以上は問題ありません。(BCLもやまほどあるでしょう?)

0
引用返信 編集キー/
■5227 / inTopicNo.12)  Re[7]: データベース関連処理
□投稿者/ 中華 二等兵(1回)-(2006/08/01(Tue) 15:12:55)

分類:[C#] 

ストアドプロシージャ内で
IF文使って
使用するSQLを選択する等すれば 
コーディングが楽になることインド人が言ってました。

0
引用返信 編集キー/
■5289 / inTopicNo.13)  Re[8]: データベース関連処理
□投稿者/ リーベライ 二等兵(5回)-(2006/08/04(Fri) 00:22:10)

分類:[C#] 

>staticでもすべてパラメータだけに頼って処理する以上は問題ありません。(BCLもやまほどあるでしょう?)

クラス内の変数使うと、呼び出しかぶったときに
その変数に何はいってるかわからないって事ですね。

>ストアドプロシージャ内で〜〜
それも考えたのですが、ストアドがもの凄く読みづらいものになってしまいそうだったので・・・


みなさん、色々参考になって助かりました。


解決済み
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -