ADO.NETの質問・雑談スレ

このエントリーをはてなブックマークに追加
1NAME IS NULL
ADO.NETに関する質問・雑談・評価 etc
何でもどうぞ。
2NAME IS NULL:05/01/02 10:55:45 ID:XCpHoqqm
3NAME IS NULL:05/01/04 23:23:17 ID:gtuR+WFj
ADO.NETはADOから派生されたという表現だが、この両者って別物のような感じがするのだが・・・・

使用しているクラスにしても共通点が少ないし、
ADO.NETは.NETフレームワーク上に位置し、ADOはOS上に乗っている。

漏れはADOをこなしてきて、ADO.NETに入った性質だが最初が苦労した。
考え方が全然違う感じがしたよ。
4NAME IS NULL:05/01/05 00:16:03 ID:???
>>3
つーか、本当に考え方違うでしょ。
ADOは接続しながらデータ操作するのが普通だけど、ADO.NETは非接続推奨っていうか、他に手段が無い。
5NAME IS NULL:05/01/05 00:24:18 ID:???
うん。だから、逆にADO.NETっていう名前がまぎらわしいと思う。
別の名前にすればよかったのに。。。

漏れも、ADOをこなしてきてADO.NETに入った性質だが
DataSetとかDataViewとかクラスの使い方がいまだに分からん
ところがある。。。欝だ。
6NAME IS NULL:05/01/08 20:21:51 ID:???
ソースコードで、ADOと近いのはADO.NETよりも、DAOの方だな。w
77:05/01/09 20:34:18 ID:wBFa/DC9
データセットの生成を行うと
「生成中にエラーが発生しました。この問題を解決するには、
プロジェクトをビルドし、エラーを修正してから、データセットを再生成してください。」
と出ます。
xsdというのは作成されるのですが、そのままビルドすると
ビルドエラーとなり、
「クラス 'dataRow' は、それ自体から継承することはできません」
と出ます。
どのようにしたらいいのでしょうか?
'dataRow' は 'dataRow' から継承されます。
8NAME IS NULL:05/01/09 20:42:58 ID:???
>>7
どういうプロジェクトを作っていて、どういう過程でデータセットの生成
を行おうとしたのかを教えて欲しい。
その情報がないと、再現しようがないのでなんとも。。。
97:05/01/09 20:56:57 ID:wBFa/DC9
VB.netのWindowsアプリケーションです。
「ツール」−「データベースへの接続」からMicrosoft Jet4.0OLE DB Provider
を選んでデータソースを選択しました。
それからツールボックスからOleDbDataAdapterをフォームにドロップし、
それ以降は
http://www.atmarkit.co.jp/fdotnet/basics/adonet07/adonet07_02.html
http://www.atmarkit.co.jp/fdotnet/basics/adonet07/adonet07_03.html
を行い、OleDbDataAdapter1を選択した状態で「データセットの作成」で
「新規作成」を行いました。
10NAME IS NULL:05/01/09 21:36:52 ID:???
>>9
私は今までその方法でデータセットを作ってきたが、生成時にエラーが
起きたことは一度もありませんでしたです。。。
で、試しにmdbファイルを移動させてみたり、テーブルを削除してみたり、
読み取り専用ファイルにしてみたりしたが、>>7に書いてるような
エラーはでなかった。。。
もうだめぽ。

何かコードを書いたり、表記してたもの以外のオブジェクトを配置して
たりはしてないんだよね?
だったら、プロジェクトファイルとmdbファイルをさらして
もらうしかないかも。。
117:05/01/09 21:58:24 ID:wBFa/DC9
>>10
プロジェクトに関しては新規作成して、まっさらなフォームに対して
行ってます。
mdbはAccess2000です。

わざわざやっていただいてほんとにありがとうございます。
1210:05/01/09 22:20:26 ID:???
クラス 'datarow' は、それ自体から継承することはできません
'datarow' は 'datarow' から継承されます。

というエラーメッセージは、ソリューションエクスプローラで
新しい項目の追加でクラスを追加して、以下のソースコードを追加すると
出てきたが、やっぱりデータセットはちゃんと作れる。。。
わからんぽ。誰か助けて・・・(泣

Public Class datarow
Inherits datarow

Public Sub Test2()
Trace.WriteLine("Test2 called")
End Sub

End Class
13NAME IS NULL:05/01/09 22:48:30 ID:???
クラス 'datarow' は、それ自体から継承することはできません
'datarow' は 'datarow' から継承されます。

というエラーメッセージは、ソリューションエクスプローラで
新しい項目の追加でクラスを追加して、以下のソースコードを追加すると
出てきたが、やっぱりデータセットはちゃんと作れる。。。
わからんぽ。誰か助けて・・・(泣

Public Class datarow
Inherits datarow

Public Sub Test2()
Trace.WriteLine("Test2 called")
End Sub

End Class
14NAME IS NULL:05/01/09 22:52:20 ID:???
クラス 'datarow' は、それ自体から継承することはできません
'datarow' は 'datarow' から継承されます。

というエラーメッセージは、ソリューションエクスプローラで
新しい項目の追加でクラスを追加して、以下のソースコードを追加すると
出てきたが、やっぱりデータセットはちゃんと作れる。。。
わからんぽ。誰か助けて・・・(泣

Public Class datarow
Inherits datarow

Public Sub Test2()
Trace.WriteLine("Test2 called")
End Sub

End Class

プロジェクトの名前やmdbファイルの名前とかかなぁ。。。
1510:05/01/09 23:02:44 ID:???
プロジェクトの名前やmdbファイルの名前とかが原因のエラーなのかなぁ。
たまにあるよね。それが原因でエラーだすことって。。
1610:05/01/09 23:07:02 ID:???
プロジェクトの名前やmdbファイルの名前とかが原因のエラーなのかなぁ。
たまにあるよね。それが原因でエラーだすことって。。
1710:05/01/09 23:12:52 ID:???
プロジェクトの名前やmdbファイルの名前とかが原因のエラーなのかなぁ。
たまにあるよね。それが原因でエラーだすことって。。
18NAME IS NULL:05/01/09 23:26:44 ID:???
なんかネットがつながらなくなったから(うちの回線しょぼいから)
再度書き込んだらいっぱい投稿してることになって
しまっていた。。。汗
スマソ
19NAME IS NULL:05/01/09 23:30:30 ID:???
なんかネットがつながらなくなったから(うちの回線しょぼいから)
再度書き込んだらいっぱい投稿してることになって
しまっていた。。。汗
スマソ
20NAME IS NULL:05/01/10 01:00:31 ID:???
ちょっと餅突け
21NAME IS NULL:05/01/10 11:45:59 ID:???
>>7
テーブル名にdataを使ってませんか?
メニュー「プロジェクト」「すべてのファイルを表示」でDataSet1.xsdの下に
DataSet1.vb(.cs) が表示されます。これはスキーマ定義から自動生成されたコードなのです。
その中で(System.Data.)DataRowを継承してテーブル名+Rowという名前でサブクラスを
作ってる箇所があるはずです。テーブル名がdataだとdataRowになりますが
名前空間の使い方が悪くて(System.Data.)DataRowとdataRowがぶつかって
エラーになってしまいます。
C#だと大小文字を区別するのでdataだとOKですねDataだとエラーになると思います。
VS2005のBetaで試すとキチンとSystem.Data.DataRowと完全修飾名から継承してくれ
ますから名前空間がぶつかることはありません。
227:05/01/10 13:29:34 ID:eQhm3LsI
昨日全然つながりませんでした。
レス返せなくてすいません。

10さんほんとにありがとうございました。

>>21
思いっきりテーブル名は「data」でしたので、
変更したら正常に作成されました。ありがとうございました。

みなさんほんとにお騒がせして申し訳ありませんでした。
23NAME IS NULL:05/01/11 00:18:37 ID:???
Accessでテーブルを作る際、フィールド名を数字で始まるものに
作ることはできるが、そのテーブルにVBAでADOのrecordsetで
アクセスしようとするとエラーになるんだよなぁ。

名前の付け方が原因の動作不具合って多いよね。。。汗
24NAME IS NULL:05/01/11 23:42:14 ID:???
ADO.NETで更新可能なResultsetとかDynasetとかというのをなくしたのは英断だと思うけどな。
更新系はupdate/insert/deleteでやるのが基本だと思ってるので、
DataSetだやDataAdapterを使わなければあんまり変わらん感じですよ。
ResultsetとかDynasetとか、中で何やってるかわからなかったのでなくなってすっきりです。
25NAME IS NULL:05/01/13 22:39:35 ID:???
C#でローカルのMSDEにアクセスしています。
使っているテーブルはテキスト、テキスト、イントの3つのフィールドを持つものです。
単純なInsertのストアドを使った場合、またAdapter.Updateを使った場合でも10000行をインサートするのに90秒かかります。
これはまだまだ遅いんでしょうか?
データベースは素人です。
26NAME IS NULL:05/01/14 03:04:49 ID:???
>>25
マシンのスペックでだいぶ変わってきますからね。
単純な表に単純な挿入だけならロジックで差が出るとも思えんので
そんなものでしょう、としかいえな。
27NAME IS NULL:05/01/14 06:36:43 ID:???
>>26
なんかWEBいろいろみてると、DBの設定とかで(たとえばトランザクション切るとか)いじれなくもなさそうなんです。
けど、片手間だし資料ないしあまり手もかけてられないので・・・
ふつうのパソコンレベルでどのぐらい出るかの大雑把な相場が知りたかったんだけど、規約にあるせいかデータwebにない(´・ω・`)。
28NAME IS NULL:05/01/14 07:42:37 ID:???
>>25
90秒が遅いかどうかはあなたがやりたいこと次第で、他人に聞く事じゃないでしょ。いや、マジで。。。
2925 ◆hEpdoZ.tHU :05/01/14 08:30:24 ID:???
>>28
10秒なら十分満足ですが、90秒ではもっと早ければいいという感じですが?
素人なので大体の基準を知りたく思い、聞くことがそんなにおかしいんですかね。
30NAME IS NULL:05/01/14 13:35:10 ID:???
>>29
聞くことはおかしくないのだがそれは無意味だというのが素人じゃない人たちの回答ですね。
これこういうやり方で書き込んでるが改善できないかって質問には答えられますよ。
MSDEならSystem.Data.SqlClient系をつかおうとか、Adapter使うと挿入後に読み直しのための
わずかなオーバーヘッドがかかるのでsqlCommandを直接使うとか、4000文字(8000byte)以下な
らtextよりvarcharを使おうとか、復旧モデルを変えても速度的な効果はあまりないとかなどなど。
insertの最速を目指すならbcpなのだが運用ツールだからね。普通のアプリじゃ使わない。
31NAME IS NULL:05/01/14 16:57:59 ID:???
>>30
でも大体このぐらいのマシンスペックならこのぐらいは行くはずだぐらいの感覚は持ってるんじゃね?
32NAME IS NULL:05/01/25 21:27:46 ID:???
デザイナでアダプターやらデータセットやらを配置していくのは、
旧VBプログラマーもすぐにアプリ構築できるようにするためなのかなぁ。
なんか、言語をクラス化させる方向と逆向きのように思うのだが。。
33NAME IS NULL:05/02/06 19:21:39 ID:+/ua3Vc0
ADO.NET ってトランザクションを発行した後に、SELECT文を使用することが出来ないんですか?

現在は別セッションを1つ作って対応していますが、リソースが無駄になるからやりたくない。

ADOの頃は出来たのですが・・・・
誰か良いやり方を知りませんか?


VB.NET2003
SQLServer2000
34NAME IS NULL:05/02/11 00:59:59 ID:???
>>33
何をしたいのかがちょっとよくわからないですが、
DataSetの中にSELECT文が保持されてるようなものだから、
それをFILLするだけで良いんじゃないでしょうか。
35NAME IS NULL:05/03/01 22:12:55 ID:???
age
36NAME IS NULL:05/03/02 11:33:02 ID:???
監督お願いです。


D V D で は、 T V で 端 折 っ た 話 を 追 加 & 補 正 し て く だ さ い 。
37NAME IS NULL:05/03/08 21:49:18 ID:WrTc1v3o
SharpDevelop で ADO.NET つかえる?
38NAME IS NULL:2005/04/02(土) 07:24:19 ID:???
ADO.NET開発が出来るスキルと、ADO開発ができるスキルとでは、
プロジェクト開発を考えると、今は圧倒的にADO開発のほうが
有利に思える。。。
39NAME IS NULL:2005/04/04(月) 12:52:16 ID:???
分散環境で楽観排他を使っていた香具師にとっては、ADO.NETは全然違和感が
ないのだが、接続型の選択肢がないのは、それはそれで困るんじゃないか?
40NAME IS NULL:2005/04/04(月) 13:17:16 ID:???
>>39
>接続型の選択肢がないのは

ありますが?
41NAME IS NULL:2005/04/12(火) 07:13:54 ID:???
非接続型って、メモリの中にテーブルを格納するわけだから、
adoで読み込んだテーブルを変数に格納しておくこととそう変わりが無いような
きもします。
42NAME IS NULL:2005/04/12(火) 21:55:21 ID:rOEDApzW BE:134971878-#
DataSet つかって捜査するのって、
ある程度以上の規模のテーブルを扱うのは不可能ですか?
サーバとのあいだですごい転送量になりそうで。
43NAME IS NULL:2005/04/12(火) 22:12:48 ID:???
>>42
>ある程度以上の規模のテーブルを扱うのは不可能ですか? 

クライアントに搭載されてるメモリによる。
44NAME IS NULL:2005/04/13(水) 00:31:26 ID:???
>>42
何レコードも走査するような場合はDataSetでなくて
xxCommand、xxDataReaderを使うことになる。
DataSetはO/Rマッピング風なものを狙ってるんだろうなきっと。
45NAME IS NULL:2005/04/14(木) 21:52:10 ID:Gq7Mlisl
ADO.NETがオープンソースに
46NAME IS NULL:2005/04/21(木) 22:45:48 ID:???
みんな、ADO.NETで、データ接続の部分のクラス化って
どういう設計してるんだろう。。。
47NAME IS NULL:2005/04/22(金) 09:02:05 ID:???
>>45 なるわけね〜え?本当になったの?なるわけないよな。
でも mono でももっとたくさんのアプリケーションが動くようになるといいな。
48NAME IS NULL:2005/05/01(日) 09:43:57 ID:???
なんかいいサンプルないかなぁ。
いまいちオブジェクトの概念とか使い方がわからんぽ。。。
49NAME IS NULL:2005/05/04(水) 23:12:54 ID:???
50NAME IS NULL:2005/05/05(木) 10:13:22 ID:???
>>49
その同時アクセスの制御って、おかしくないか?
データを書き換えた後、更新しようとした段階で
「できません」ってなって作業が無駄になるのは。
51NAME IS NULL:2005/05/05(木) 11:01:20 ID:???
>>50
おかしいと思うなら、それはお前さんの頭がおかしいだけ。
52NAME IS NULL:2005/05/08(日) 11:29:30 ID:???
ADOは読み込んでレコードをたどる際はmovenextかmovepreviousしか
なくて、番号がなくて順序だけで操作する考えだったのに対して、
ADO.NETはDataset.DataTable[0].Rows[0][0]
ってな感じに配列の添え字で操作するようになってる。
その考え方がいまいちしっくりとこないし入りにくい・・・
53NAME IS NULL:2005/05/08(日) 11:39:33 ID:ycbXXzo5
>>52
非接続型は添字だが、接続型ならADO風だろw
54NAME IS NULL:2005/05/09(月) 01:14:37 ID:???
良く考えたらその通りだな。w
55NAME IS NULL:2005/05/10(火) 08:14:37 ID:???
そっか。。。非接続型なんだ。
小さなDBにしか、使えないねえ。。。信頼性が。。。
56NAME IS NULL:2005/05/10(火) 08:44:31 ID:???
ADO.NETなんて糞だろ
57NAME IS NULL:2005/05/11(水) 01:13:31 ID:???
接続型でダイナセット開きっぱなしで操作するより、
非接続型で楽観排他前提のデータ操作のほうが中身が良く見えて
安心できるけどなぁ。データが増えるほどそうだ。
もっとも両方使えたほうがうれしいけどね。
58NAME IS NULL:2005/05/11(水) 07:15:56 ID:???
メモリに余裕があって、処理の高速化を図る場合、
ADOで読み取った内容を配列に入れて操作していました。
この配列に格納したデータをソートしたりフィルタをかけたり
できるので、便利だと思います。
あと、データを上書きするまでの編集時は、オリジナルのデータとは、
別なところにおいておくことを設計したりしなくてよくなったから、
便利になったと思います。
でも、思いっきり重いです・・・汗汗汗
59NAME IS NULL:2005/05/11(水) 12:32:25 ID:???
ADO.NETが遅いのはマーシャリングにSoapFormatterを使っているせいで、
.NET2.0からはBinaryFormatterに変更でスピードが向上している。
ADO.NETは完全に読み込んでしまってから処理を始めるため、
グリッドコントロールへの表示開始はどうしても遅く感じてしまう。
トータル時間は変わらないはずなのだがこの辺の体感的な部分は重要だと
思うので改善が欲しい。
60NAME IS NULL:2005/05/12(木) 06:29:43 ID:???
Windows98の時、「Windows95よりも体感速度が速くなった」っていうのと
同じ機能だな。w
61NAME IS NULL:2005/05/12(木) 21:11:28 ID:???
業務系アプリはWeb型インタフェースが流行だから、それに合わせてるんでしょ。
Webフォームがメインになるんだよ、今後は。
62NAME IS NULL:2005/05/12(木) 21:55:25 ID:???
と思われていたが、AbobeのFlashフォームとMSのMetroフォームになるのであった。


もちろん最後は(ry
63NAME IS NULL:2005/05/15(日) 11:55:26 ID:???
ADO.NETからデータベースに接続する場合、
細かいところ見てたら相性とかでてくるんだろうか。
おなじMS製品のほうがいい、みたいな。
64NAME IS NULL:2005/05/15(日) 12:23:29 ID:???
>>63
.NET Data Providerを直接サポートしている場合はデータ型をはじめ
独自実装を大幅に認めてるので相性の問題はあまりないと思う。
(ただしそのせいで異なるデータベース間での移植性は低くなる)
サポートしてない場合はOLE DB経由になるのでデータベース製品と
OLE DBとの相性の問題が当然発生する。
65NAME IS NULL:2005/05/15(日) 19:53:53 ID:p5AU4cZr
DataGrid用意してFillしてDataSetマンセーって
言ってる記事多いよな。DataGridだけのアプリが
あるかと・・・

単票形式もコントロールにDataBindingして
ほらすごいでしょ?みたいな記事も
単票が別フォームの場合が説明されてなかったり

フォーム間のデータの受け渡しが載っているのも
あるが、受け渡し方が統一できてなかったり

はっきり言ってADO.NETフレームワークは使うほどに窮屈を感じるのだが

66NAME IS NULL:2005/05/15(日) 20:38:27 ID:???
>>65
禿同
67NAME IS NULL:2005/05/15(日) 22:30:10 ID:???
.NET2.0で改善してないものかなぁ・・・つーか、早く試しておかないとマズー
68NAME IS NULL:2005/05/15(日) 22:34:25 ID:???
DataGridにコンボボックスを貼り付けるのもあらかじめ用意
されてないし、紹介記事読んだだけじゃ複数テーブルの扱い方が
まともに解説されてないから、アプリを組む概要もイメージできない。

はっきりいって、つかいにくいのだが。。。
69NAME IS NULL:2005/05/16(月) 17:55:21 ID:/hrRvA3a
稼動1ヶ月ぐらいで遅くなったと苦情が来てたので調べてみたのだが、
条件なしの全件取得でグリッド表示していた。
ADO.NETのアーキテクチャでそれはまずいだろうと思って、
担当のPGに聞いてみたらADO.NET以前もこんなことをやってたもよう。
ADO.NETは使いにくいとかぼやいてる。たとえ密結合でもそれはいかん
だろうと思うのだがどうなんだろう?
70NAME IS NULL:2005/05/16(月) 20:37:24 ID:???
>>69
悩む前にとりあえず代案を教えてやれよ
71NAME IS NULL:2005/05/18(水) 01:16:34 ID:???
データセットいやなら別に使わなきゃいいじゃん。
IDbConnection,IDbCommand,IDataReaderあたりで
ADO風に接続形の世界で生きることは普通にできる。
72NAME IS NULL:2005/05/18(水) 07:32:36 ID:???
やっぱり、開発にかかわるとなると、「自分だけは使わない」とかって
出来ないわけで。。

connectionとadapterあたりまで何とか理解できた。
複数のテーブルを利用してデータの読み取りから更新までおこなう、
DataGridだけとかウィザードのみで終わりじゃない、
チュートリアルってないかなぁ。。
73NAME IS NULL:2005/05/18(水) 09:35:29 ID:???
ADOと切り離してDataSetを見てみると、StrutsのActionFormみたいに使えるよな。

Dataアダプタとセットにしてしまうと、ViewとModelがくっつきすぎで、単純な画面ならいいが複雑な結合じゃつかえねー。
一般に売られてる書籍も1つのテーブルから一覧だして終わりだもんな。
そんな仕事はあまりありません・・・。
74NAME IS NULL:2005/05/18(水) 16:40:37 ID:V6I2A/hd
まともにDataSetと向き合わないほうがいいよ

DataSetはADO.NETのオマケと思ってないと、

無理に使おうとすると縛られて疲れちゃうから
75NAME IS NULL:2005/05/18(水) 16:55:06 ID:???
なんか具体性のない>>74だけど。

プログラムのあらゆる場面で出てくる、データとその集合を取り扱う基本クラスとしては十分だと思うが。
こんなの自作してたらかったるいし。
76NAME IS NULL:2005/05/18(水) 23:38:47 ID:???
DBと画面表示が直通だとDataSetもいいんだけどな。
実際にはちょこっと編集したり色々する必要があることが多くて、
DataBind()して、変更された結果をUpdate()するだけ、みたいな
お手軽なケースは少ないんじゃないかな。変更部分はDataSetが
覚えてるし、単純なケースではこれで確かに楽になるんだが。

ま、「簡単なことを簡単にすませる」という要件には適ってると思う。
77NAME IS NULL:2005/05/19(木) 00:25:37 ID:???
でも中途半端な上司がこれを触って、なんだ簡単じゃないかと、無茶な工数算出をしたら・・・
78NAME IS NULL:2005/05/19(木) 00:56:41 ID:???
ココ読んでると、みな同じような不満をもってるんだなぁと親近感を感じるな。
漏れの方法をアド。
データ処理は参照系処理と更新系処理に分離して、前者にだけデータバインド
使う。データは予め参照用ビューを定義して1テーブルにしとく。
後者には、オプティミスティック制御でトランザクションにして書いておく。
DataSetの機能をそのまま使ってもいいけど、参照系処理
で使ったデータでオ制御をやれば、TP低いシステムなら十分かと。
79NAME IS NULL:2005/05/19(木) 00:58:32 ID:???
>>69
>>70
ビュー書いてやれよ。
80NAME IS NULL:2005/05/19(木) 09:31:12 ID:???
>>76
直通じゃなくても十分使えないか?

DataSetをStrutsでいうActionFormと考えれば結構使えると思うんだが。
簡単な画面はDataアダプタから直で取る。
複雑な画面は、自分でSQLごいごい書いて、その結果を登録して渡してあげる。

後者のパターンで二元配列だと個々のカラム型が入らないから問題。
構造体(というかクラス)の集合を自作・・・ってこの部分をDataSetでやるだけ。
自分で書くよりビジュアルなのと、DataSetそもそもの機能(検索や更新前値の保持、複数テーブル格納)など使えるし。

入門書にのってるような、FillしてOKなんてのは使う場面はほとんど無いと思うよ。
81NAME IS NULL:2005/05/19(木) 12:04:14 ID:???
>>80
そうだよなぁ。ADOの時だってリザルトセットからGirdコントロール
までを通しでそのまま使ったことはあまりなかった。
Visual Studioのウイザードだけである程度のものはできるけど、
実用的なものを作るにはそれなりのコードを追加する必要がある。
Adapterで作成したDataSetをそのままGridの表示に使うことは
まれな気がする。
82NAME IS NULL:2005/05/19(木) 15:14:04 ID:GtQz+Y9u
フォームがたくさんあると、
BindingContextとかCurrencyManagerのことも
考えないといけないからめんどくさいね
83NAME IS NULL:2005/05/19(木) 15:29:53 ID:???
>81
確かに。ADO.NET無視して、
自前に生っぽく作るほうがいい気がする。
84NAME IS NULL:2005/05/19(木) 15:37:21 ID:???
>>83
無視はしなくてもいいけど必要に応じてチョイスして利用しようということ。
85NAME IS NULL:2005/05/21(土) 23:47:48 ID:???
AccessVBAのADOに使い慣れてると入りにくいな。
フォーム上のオブジェクトにデータ表示させる段階で結構つまずく。
Comboboxのメソッドで、rowsourceが無いのは分かるけど、
column()とかvalueとかないし。
86NAME IS NULL:2005/05/22(日) 00:58:16 ID:???
使い方がちょっとかわるのなら、そのあたりを考慮したドキュメントも
作って欲しいものだ。一太郎ヘルプみたいに。

どうしてこのように使い方が変わるのかの説明がなかったら、
無意味なバージョンアップにしか思えない。
フリーソフトによくある、メニューの位置やデザインが変わるだけ
っていうやつ。今までの操作の慣れが無意味になって、
かえって使いにくくなるだけ。
87NAME IS NULL:2005/05/22(日) 01:12:54 ID:???
型指定されたデータセット、カラムにプロパティアクセスできるのは
いいんだが、値が入ってない場合に例外をスローするのは勘弁して欲しいものだ。
カラムの値がNULLなのての、DBじゃ例外でも何でもねえだろ。
88NAME IS NULL:2005/05/22(日) 08:12:19 ID:???
>>87
生成されるソース書き換えればOK・・・だけどめんどい。
型指定のエディタで指定させて欲しかったね。初期値とかNULLチェック有無とか。
89NAME IS NULL:2005/05/28(土) 23:00:37 ID:???
メモリにがっぽりデータを読み込む仕様にしたのなら、
その制限を自由に設定できる仕様も必要だが、それが
準備されていない気がするわけなのだが。。。
90NAME IS NULL:2005/05/29(日) 10:05:18 ID:???
>>89
多分その認識がそもそも間違っている。
今までのRDOとかならそういう考えでのクライアントキャッシュ・サーバーカーソルの考えだけど。
DataSetはそういう考えではなく、あくまでHTTPなどワンタイムセッションのためのキャッシュ。
91NAME IS NULL:2005/05/29(日) 15:16:02 ID:???
System.Web.UIWebControls.DataGridはページングの機能あるけど、
裏のDataSetに全部のデータ読み込んでおかないといかんみたいだな。
せっかくページングしてもこれじゃメモリの浪費で意味ねーじゃん。
92NAME IS NULL:2005/05/29(日) 17:58:07 ID:???
>>91
せめて、@ITとかでも読んだら?

ちゃんと全部データを読まなくても動作させる方法がある。
ページングに関しても同様に、表示させる件数だけデータを取得して、
ページを変えるときにそのページのデータを読み込ませる手段がある。

此処で言われてるような不満とかって、大抵は使い方を知らない低レベルな技術者ばかり。
実際には問題無く出来るような事を不満として出すんだから馬鹿としか言い様が無い。
93NAME IS NULL:2005/05/29(日) 23:02:31 ID:???
複数テーブルを読み込んでデータ更新までやるサンプルが
なかなか手に入らないのも事実。
94NAME IS NULL:2005/06/04(土) 12:13:27 ID:???
一太郎ヘルプみたいにしっかりと解説してるドキュソあるか?
95NAME IS NULL:2005/06/04(土) 16:03:17 ID:???
とりあえずMSDN以上の求めるのは困難じゃないか?
96NAME IS NULL:2005/06/06(月) 00:21:14 ID:???
>>95
マイクロソフトが、新文法を提案するのなら、
それ相応のドキュソを残してもいいじゃないかっていみだよ。
97NAME IS NULL:2005/06/06(月) 14:29:32 ID:???
>>96
そういったドキュメントはちゃんとあるよ。
ただ、探し方が悪いだけ。
98NAME:2005/06/06(月) 16:01:45 ID:???
>>97
どこよ?
99NAME IS NULL:2005/06/06(月) 16:52:48 ID:???
>>98はMSの公式サイトさえも探さない馬鹿
100NAME IS NULL:2005/06/06(月) 19:25:00 ID:???
ま、一太郎ヘルプの話はいいとしてさ、
一つのテーブルをグリッドにbindingしておわり。
見たいな解説で終わってる書籍に不満がある人向けの
ドキュメントは無いの?
101NAME IS NULL:2005/06/06(月) 19:44:33 ID:???
>>100
だからMSのサイトとか見ないの?
102NAME IS NULL:2005/06/06(月) 20:14:21 ID:???
狂気の法案を拉致問題の安部晋三先生と阻止しよう!!【■■2ちゃんねるが消滅します】

とんでもない言論弾圧法案=「人権擁護法」が国会に提出されようとしています!!!
この法案の真の狙いは@政治的には、在日参政権反対の自民右派の消滅であり、
A社会的には、2ちゃんねるをはじめとしたネット世界の一般人の小うるさい言論の圧殺です。
民族(朝鮮・中国・韓国)/ 同和 /信条(宗教・層化・赤化)他に関する一切の差別的発言を禁じるという狂気の法律です。
一刻も早く、防戦する安部先生達に、日本国民の怒涛の援護射撃をお願い致します!!!
※※以下4つともアドレス中に◆を1箇所はさんであります、◆を消去の上、どうか必ずご覧下さい!!※※
http://zin◆kenvip.fc2web.com/
http://blog.live◆door.jp/no_gestapo/
↑↑【凶悪仰天法案の問題点&背景の全て】
http://www.kan◆tei.go.jp/jp/forms/goiken.html
↑↑【首相官邸ご意見フォーム】イメージと違って、ここは非常に効果ありです!
全部読んでくれます、投稿テーマで返事が変わります!
http://meya◆su.jimin.or.jp/cgi-bin/jimin/meyasu-entry.cgi
↑↑【自民党目安箱】事態は急を告げています。文章は簡単でいいので、
国民の「人権擁護法」への反対意思を、とにかく 1 秒 も 早 く 党本部に伝えて下さい!
103NAME IS NULL:2005/06/06(月) 21:18:23 ID:???
>>101
MSのサイトは、データセットやデータテーブルなんかを
直接扱う範囲の狭いサンプルしかのってないじゃん。
それらがどんな風に繋がっていくのかがいまいち
イメージできなくてさ。。。
104NAME IS NULL:2005/06/06(月) 21:24:05 ID:???
>>103
だから、調べ方が足りないって言ってるんだよ。
105NAME IS NULL:2005/06/06(月) 22:57:13 ID:???
101=104か?
まともなドキュメントがない(か邦訳できる技術力がない)のを隠す
のに必死なMS社員でなければとりあえず、あんたが参考になったと
思ったURLを貼ってみれ。
ちなみに俺は英語のドキュメントでも歓迎だ。
106NAME IS NULL:2005/06/07(火) 10:09:22 ID:???
>>103
つうか、それをどう使うかなんてMSに聞くことじゃないだろ?
それこそ理解してどう扱うかの設計の問題。
それもマニュアルないとNGってのは、単にあなたのイメージが・・・。
107NAME IS NULL:2005/06/07(火) 10:44:32 ID:???
>>78に書いてあるじゃん。
データセットがマルチテーブルなのは、分散DB用途だよ。
シングルDBなら、DBMSのビュー使った方が遙かに楽。

更新は当然SQLで。アップデート・メソッドはトランザクション対応
してないので更新レコードが1件で無い場合には使い物になりませぬ。
108NAME IS NULL:2005/06/07(火) 17:20:03 ID:???
データセットがマルチテーブルなのは階層構造を持つデータをそのままの形で扱うため。
これはO/Rマッピングで設定するリレーションと似てると思う。
関連のあるデータを生のテーブルの構造で保持することでAdapterによる書き戻しが意味を持ってくる。
ただしこういう使い方が本格的にできるようになるのは.NET 2.0からの模様。
今の版のADO.NETは不完全な箇所が多く、書き戻し時のトランザクションの制御をはじめ
まともに使おうとすると相当のコードを追加しなくてはならない。
現状AdapterやDataSetは読み取りだけに使用して、更新時は直接SQLを投げるのが現実的だと思う。
全体が見渡せて応用が利くような良くできたドキュメントがないのはADO.NETがまだ不完全なことが
原因だと思う。
109NAME IS NULL:2005/06/08(水) 15:58:14 ID:???
>>87
遅レスだが
XSDに

xmlns:codegen="urn:schemas-microsoft-com:xml-msprop">

のようにネームスペースの宣言を手書きで追加して、

<xs:element name="empno" type="xs:string" minOccurs="0" codegen:nullValue="_empty" />

のようにすると、NULLの場合のデフォルト値を指定できるようだ。

codegen:nullValueに指定できる値は
"_throw"→例外(デフォルトの挙動)
"_null"→null
"_empty"→string.Empty
など。
その他、"0"など、リテラルな値もそのまま記述できる。
110NAME IS NULL:2005/06/08(水) 23:13:30 ID:???
>>87
>カラムの値がNULLなのての、DBじゃ例外でも何でもねえだろ。

プログラマ的にはなんでもないけど、RDB理論的には例外だよ。あっちゃいけないこと。
111NAME IS NULL:2005/06/08(水) 23:59:26 ID:???
>>110
俺ら理論で食えるわけじゃないしなあ
112NAME IS NULL:2005/06/09(木) 09:31:12 ID:???
NULL値アクセスでデフォルト例外って、普通に考えて良いと思うけど。
だって、DBのNULL値って表現できない値でしょ。不定。

じゃあ、それをMSが勝手に何らかの値を与えてたら、それこそバグの温床だよ。
とりあえず例外にしておいて、実装するプログラマが例外処理するか、規定値を与えるか考える。
113NAME IS NULL:2005/06/09(木) 13:44:20 ID:IPWJYuoX
開発者にとって複雑になるであろう点は、関係者は分かっているのにも
かかわらず、巷の本などの情報ではカバーされていて、開発方法論を
模索しているうちに次のバージョンが出て、過去の欠点は改善&変更されましたみたいな。
これじゃMSの追っかけするのも楽じゃないな。Javaのほうがいいかもしれんとか
思っているところ
どうなんだろうか
114NAME IS NULL:2005/06/09(木) 13:45:59 ID:???
まあ、俺はDQNだからね。だからもっと情報が欲しいな、と・・・
115NAME IS NULL:2005/06/09(木) 14:08:03 ID:???
MSの追っかけするのも楽じゃないのは同意だが、Javaも楽じゃないぞ。
やっぱりCOBO(ry・・・が一番。
116NAME IS NULL:2005/06/09(木) 14:26:47 ID:???
>>112
100カラムぐらいあるテーブルの値参照するのに

毎回

if (dataSet.Emp[0].IsEmpNoNull) {
empNo = null;
} else {
empNo = dataSet.Emp[0].EmpNo;
}

とか

try {
empNo = dataSet.Emp[0].EmpNo;
} catch {
empNo = null;
}

とかやってらんねーじゃん。

ま、型付データセットでは規定値与える手段があるから良しとする。
117NAME IS NULL:2005/06/09(木) 14:28:39 ID:???
Javaのおっかけの場合はソース読む必要があることが多くねーか

その分理解は深まるけど、おっかけんのつらいでしょ

まあソース読むという選択肢さえないMSよか自由かもね
118NAME IS NULL:2005/06/09(木) 14:39:14 ID:???
>>116
だから文意をきちんと読んでくれ。
この部分の仕様、MSは例外処理をしろといってるわけじゃないんだよ。

MSとしたら、NULL値に何を割り当てても、実際に使う側からしたら文句が出るのは判ってるから、
実装側にそれを決めてもらうという意味で、デフォを例外にしてるんですよ。

>>112に書いたが、数値0とか空文字とかをMSが割り当ててるのがデフォルトだったらもっと問題。
119NAME IS NULL:2005/06/10(金) 00:57:09 ID:???
>>113
>>117

何言ってるんだよ! おまいら追っかけるのが仕事だろ。
いつまでも、どこまでも、倒れて立ち上がれなくなるまで
スポ根で追いかけるんだぁー。
120NAME IS NULL:2005/06/10(金) 02:05:02 ID:???
技術者が新しいことに興味がもてなくなったら終わりだけど
次々とせっかく学んだものが古くなりつつ
追っかけるだけの人生も空しいなと

後に残るもんならいいんだが、ADO.NETだのなんだのは表層だからね
そういうものの知識はまるで残らないし意味が無くなる

まあでも、追っかけられなくなったら引退の潮時かもな
121NAME IS NULL:2005/06/10(金) 16:02:08 ID:???

ADO.NETに限らない話だけど、
.NETは抽象化しずぎて、イマイチ開発の自由度が殺されている
122NAME IS NULL:2005/06/10(金) 16:57:36 ID:???
抜け道はあるでしょ
C#ならポインタも使えるし
P/Invokeもある
Managed C++ならもっと自由だ

何にせよ綺麗に抽象化することが出来なかったMFCや
不便さと面倒さばかりが目立つCOMよりぜんぜん筋がいいと思うね
123NAME IS NULL:2005/06/10(金) 18:30:38 ID:???
.NET全般まで範囲を広げると脱線しそうだからADO.NETに戻すが、
ADO.NETはADOより機能を絞っていて、特定のモデルを強制しているのは確かであり、
それで自由度が少ないと思われているのは仕方がないことだと思う。
サーバーカーソルはクライアントの数が多いとサーバーへの負荷が大きいため全廃。
クライアントカーソルはクライアントあたりのユーザーが多いとクライアントへの
負荷が大きいため、内部を見渡しやすいフレームワークでの実装に切り替えている。
残ってるのは読み取り専用の前方カーソルと結果を返さないコマンドの実行機能のみ。
利便性より多ユーザー時のパフォーマンスを重視した結果だと思う。
このモデルはWEBアプリのような多ユーザーで少数クライアントの場合に有効であるが、
C/Sのようにクライアント=ユーザーでクライアントがパワフルなケースや、
ユーザーや同時実行が少なくDBに密着したデータ制御をしたい場合など
旧来のクライアントカーソルやサーバーカーソルが有効なケースも少なくないはず。
この辺のフォローをADOを引き続きサポートすることで行うのか、ADO.NETの機能強化で
吸収するのか、まったく切り捨てるのか方向性が見えない。
124NAME IS NULL:2005/06/10(金) 22:49:00 ID:???
ADO.NETそのものが切り捨てられるという可能性はどうよ。
125NAME IS NULL:2005/06/11(土) 00:11:48 ID:???
>>121
メッセージのルーティングが見えなくなってるよね。
OOが使えるのは良しとして、世界観はVBだな。

>>123
MSSQLServerの大幅な機能強化があるんでしょ、確か。
ストアドにC#が使えるようになるらしいし。
たしか、MSSQLServerって多バーション式だったよね?
だったら、ストアドでサーバ側カーソル作れるんじゃない?
126NAME IS NULL:2005/06/11(土) 02:32:55 ID:???
>>125
MSDNを見たらSystem.Data.SqlServer.SqlResultSetというのがあって、
これで更新系の操作ができる模様。これがSQL CLR用っぽいです。
snapshot分離レベルはOracle式のロールバックデータを世代管理する方式ではなく
tempdbにスナップショットを作る方式の模様。基本はあくまで共有ロック式で、
運用中に時間のかかる集計や帳票作成処理をするケースを想定してると思われます。
ADOのサーバーカーソルはこれらの機能で代用できそうですが
SQL2005以外のDBはどうしろというのでしょうかね。
127NAME IS NULL:2005/06/12(日) 11:03:46 ID:???
>>107
参照系は、Adapterで複数のテーブルを一つにまとめるSQL文を使って
DataSetに格納してDataBindingsするまでの一連のやり方は分かるけど、
更新系は、具体的にどうやるのかが分かりませんので教えていただけない
でしょうか。DataSetをつかわないんですよね?
128NAME IS NULL:2005/06/13(月) 10:02:24 ID:???
>>127
やり方は色々だと思いますよ。
DataSet内のTableの各Row毎に変更状態のステータスと元データ持ってるから、
DataSetをもらって、各Row毎にSQLでごりごりと処理する関数を自作することも可能。
(つうか、実務じゃその使い方しかないだろ?)
129NAME IS NULL:2005/06/13(月) 15:52:48 ID:???
>>107
> アップデート・メソッドはトランザクション対応してない
これマジ?

DataAdapterに突っ込むInsertCommand, UpdateCommand, SelectCommand
にトランザクション設定しておいてもダメなの?
130NAME IS NULL:2005/06/13(月) 21:15:04 ID:???
>>128
基本的な事で申し訳ないですが、質問させていただきます。

> DataSetをもらって、各Row毎にSQLでごりごりと処理する関数を自作することも可能。
DataSetをもらって、Row毎にfor文などでごりごりと処理する関数を・・
ではないのでしょうか。
ADO.NETは、DataSetに読み込んだテーブル群に対しては、SQL文を
実行できない仕様になっていると思うのですが。
131NAME IS NULL:2005/06/13(月) 22:06:08 ID:???
>>130
Rowの状態を見て、追加・変更・削除のSQLを組み立て
ExecuteNonQueryで実行すると言う意味では?


132NAME IS NULL:2005/06/14(火) 01:00:18 ID:wt5YTRiZ
>>129
その各コマンドは、Row毎に呼び出される仕組みだったはず。
しかし、
Update の前に、同じコネクション使って begin transaction を送っておけばうまくいったりして。
報告待つ。
133NAME IS NULL:2005/06/14(火) 01:07:21 ID:???
>>131
どのみち効率が恐ろしく悪いよね。
ストアドがデータセットを引数に受けてくれたらいいんだけどね。

>>132 案が行けそうな気がしてきた。
Update失敗したらロールバック、成功したらコミットでどうかな。
134NAME IS NULL:2005/06/14(火) 01:18:58 ID:???
>>132
余裕で可能
トランザクション効くよ
つか、普通思いつきそうなもんだがな

つうわけで
>>107
は大ウソ
135NAME IS NULL:2005/06/14(火) 01:37:30 ID:???
>>134
>余裕で可能
トランザクションをオンにするプロパティかなにかあるのですか?
136NAME IS NULL:2005/06/14(火) 02:30:37 ID:???
>>135
DataAdapterの{Insert,Update,Delete}Commandプロパティに設定する
CommandオブジェクトのTransactionプロパティに設定すればよい。
DataAdapterはConnectionが閉じている場合は暗黙に開くので、
前もって
1) ConnectionをOpen()
2) BeginTransaction()
3) Commandオブジェクトにtransactionをセット
をやっておいてから、Update()すればよい。
137NAME IS NULL:2005/06/14(火) 03:02:52 ID:???
>>136
余裕とか大ウソとか言ってるので期待してたのだが>>129 で既出だねw
138NAME IS NULL:2005/06/14(火) 09:23:54 ID:???
>>130
言葉足らずでしたね。すみません。
皆さんがもう回答かいてますが、元の>>128はDataSetを丸ごと受け取って、サーバ側でForループの意味で書きました。

でもって、少し前に書いてるが、ADOとDataSetを直で連携させて使うってことは考えていない。
DataSetはあくまでデータ受け渡し用のクラスとして非常に有用と思ってるだけ。
SQL操作はサーバ側で従来的に行うのがいいと思うこのごろ。
ADO+DataSetだとDataSetに制約がかかりすぎて使いにくい。
139NAME IS NULL:2005/06/14(火) 11:10:55 ID:???
>>136
それだと、複数テーブルのトランザクションを用いたUpdateには
アダプタを一つにまとめておく必要があるってことか。

140NAME IS NULL:2005/06/14(火) 14:48:43 ID:???
>>139
同じTransactionオブジェクトをそれぞれにセットすれば複数のアダプタでも
独立したCommandオブジェクトでも大丈夫。その為にConnectionを別にオープンしてるんだろうな。
141NAME IS NULL:2005/06/14(火) 14:49:51 ID:???
DataAdapterを活用しようと思ったらかなりのコードを追加が必要になる。
単純なアップデートの場合は>>136の方法で全更新を1トランザクションにすればよいが、
エラーや競合の場合にユーザーに判断を任せる場合はFillError/RowUpdated/RowUpdatingと
いったイベントにかなりのコードの追加が必要になる。
現状では独立したCommandオブジェクトで直接Update/Insert/Deleteした方が安全で早いと
判断する人間が多いのはやむなしだろう。
ウイザードだけで作ったDataAdapterを単純にUpdateすると、途中でエラーや競合が起きた場合
そこで処理を中断してしまって途中まで更新した状態になる。これをみて>>107のように考える
人間がいてもそれもやむなしだと思う。
142NAME IS NULL:2005/06/14(火) 17:00:57 ID:???
>>141

ていうか更新がなんか半自動で走っちゃうのはやっぱキモチ悪いって抜きがたい感覚は
どうしてもあるよね。
ウィザードで自動生成したUpdateCommandとかはキモチ悪いから手でSQLは
書き換えるし。

ただ、コード量のことを言うなら、>>128の言うみたいなデータセットの差分取得して
ゴリゴリとかのが結局多くなるっつか、やっぱ無駄な気もするよ。
143NAME IS NULL:2005/06/14(火) 17:22:42 ID:???
>>142
まあこの問題はそもそもORマッピングって使えるのか?って事でしょ。
144NAME IS NULL:2005/06/15(水) 14:41:19 ID:???
ttp://www.ast-j.com/reference/AstExData.htm
有料だが、こういうのを使ってみた人いますか?

複数のテーブルを参照するデータであっても、
更新・挿入・削除用のコマンドが自動で生成され、更新できるそうだ。
145NAME IS NULL:2005/06/15(水) 15:34:27 ID:???
>>144
こういうのって難しいよな。
機能が多機能になればなるほど、フレームとしての自由度が下がるし、習熟が必要になる。
それなら自分でつくったほうが・・・、ってなるし。
146NAME IS NULL:2005/06/15(水) 16:12:37 ID:???
狂気の法案を拉致問題の安部晋三先生と阻止しよう!!【■■2ちゃんねるが消滅します】

とんでもない言論弾圧法案=「人権擁護法」が国会に提出されようとしています!!!
この法案の真の狙いは、
@社会的には、2ちゃん/ブログをはじめとしたネット世界の一般人の小うるさい言論の圧殺であり、
A政治的には、拉致問題強硬派&在日参政権反対の自民右派の消滅です。
民族(朝鮮・中国・韓国)/ 同和 /信条(宗教・層化・赤化)他に関する一切の差別的発言を禁じるという狂気の法律です。

この法律の前例の無い恐ろしい特徴は、特定人に関する言動は当然、不特定多数の集団に関する一般的発言
(朝鮮人は〜〜と書くこと)までも圧殺しようとする点にあります。
◆違反者には、無令状捜索・差押、出頭要求、矯正教育が待っており、それを拒否すると、
さらに罰金30万&氏名・住所などの全国晒し上げを食らう(61条)という仰天内容です。

一刻も早く、防戦する安部先生達に、日本国民の怒涛の援護射撃をお願い致します!!!
※※以下5つともアドレス中に★をはさんであります、★を消去の上、どうか必ずご覧下さい!!※※ 
http://zinkenvip.fc2web.co★m/
http://blog.livedoor.jp/no_gest★apo/
http://blog.livedoor.jp/monste★r_00/
↑↑【凶悪法案の問題点&背景の全て】
http://www.kantei.go.jp/jp/forms/goik★en.html
↑↑【首相官邸ご意見フォーム】イメージと違って、ここは非常に効果ありです!
全部読んでくれます、投稿テーマで返事が変わります!
http://meyasu.jimin.or.jp/cgi-bin/jimin/mey★asu-entry.cgi
↑↑【自民党目安箱】事態は急を告げています。文章は簡単でいいので、国民の「人権擁護法」への反対意思を、
とにかく 1 秒 も 早 く 党本部に伝えて下さい!
■□■人権擁護法ストップin日比谷公会堂 6/19(日)12:30〜16:00超大物国会議員登場・皆さん大挙してご参加を■□■
147NAME IS NULL:2005/06/15(水) 17:01:05 ID:???
>>145
O/Rマッピングのようなものは使いどころが難しいからね。
データ量を限定すればそれなりに汎用で便利なライブラリやフレームワークが作れるのだが、
データベースの場合データ数が半端じゃないことが多いから、汎用で便利にするための
多少のオーバーヘッドのせいで、致命的に処理速度が遅くなったりリソースの使いすぎたりする。
結局フレームワークとRDBの両方を特性を意識して注意深く使わないと実用に耐えない。
148NAME IS NULL:2005/06/15(水) 17:05:14 ID:???
>>147
そうか?
O/Rマッピングに何を使うのか、そしてDBサーバのチューニング次第じゃない?

俺の会社でも3ヶ月ぐらいかけて色々テストしてみたけど、
1億レコードでも検索にかかる時間は平均1秒以内にまで出来たぞ。
149NAME IS NULL:2005/06/15(水) 17:11:13 ID:???
ORでもデータベースの索引にヒットした検索なら速いのは当然じゃない?
150NAME IS NULL:2005/06/15(水) 17:30:32 ID:JbFI81w8
OdbcDataAdapterをウィザードで作成すると落ちたりしない?
151NAME IS NULL:2005/06/15(水) 17:31:46 ID:???
つうか、新規案件でデータ主導型で画面設計してよくてっていうならORマッピング使えると思うよ。
既存DBからの場合はまず却下だし。
画面とビジネスロジックが複雑で、データ操作が多岐でかつデータを集合として扱う場面が多い場合、ORマッピングは使いにくい。
SQLでいうところのWHERE節で集合限定して一括更新みたいな部分が弱すぎ。
152NAME IS NULL:2005/06/16(木) 00:50:34 ID:???
>>151
>つうか、新規案件でデータ主導型で画面設計してよくてっていうならORマッピング使えると思うよ。
そこでUML2.0でつよw

>SQLでいうところのWHERE節で集合限定して一括更新みたいな部分が弱すぎ。
将来的には更新可能なビューが増えてDBMS側で対応される希ガス。
それまでの議論だな。

ポジティブかネガティブかわからないレスですまん。

153NAME IS NULL:2005/06/16(木) 09:31:34 ID:???
>>152
そこまでいくと、ORマッピングなんぞ考えずに、オブジェクトDBでいいような。
154NAME IS NULL:2005/06/19(日) 07:13:27 ID:???
更新系テーブルは、やっぱり単独読み取りして、ローカルで
プログラミングのほうがいいのかなぁ。
ADOプログラマはどのように考えられてるのかしら?
155NAME IS NULL:2005/06/21(火) 13:48:24 ID:J+gvxeCG
肝心なところが扱いにくいADO.NET
156NAME IS NULL:2005/06/23(木) 20:45:08 ID:Eox5AqoZ
>>154

全部が全部じゃないが、
SqlDataAdapterは表示系、
SqlCommandは更新系と使い分けてる。
157NAME IS NULL:2005/06/24(金) 12:36:13 ID:???
開発元は、「更新も自動で出来て便利。」とうたっているが、
その自動機能が実務で使えるレベルじゃないから、
実際は表示系にしか使われないってことなのかな・・・
158NAME IS NULL:2005/06/25(土) 11:14:26 ID:???
>>156
使い分けると言うより、
更新系にはアダプタが使えない(使う価値なし)ということですよね。
159156:2005/06/25(土) 11:47:47 ID:GM3QDYFi
ま、全部が全部じゃないが、そういうこと。
160NAME IS NULL:2005/06/25(土) 12:23:38 ID:???
使い方次第じゃない?

MSが提供してるサンプルでも、参照から更新・削除に至るまで、
SQLServer(MSDN)でプロシージャ作って、それを呼び出す形になってるし。
161NAME IS NULL:2005/06/26(日) 14:17:16 ID:???
>>160
それはSQL CLRのことじゃないか?
162NAME IS NULL:2005/06/28(火) 00:00:08 ID:???
次のVSは乗り換える価値ありなのかな?
最近VS2003で作ったクライアントをばらまいたんだけど、
2003SRVを使ってるヤシ以外全員が、動かん、と申し立ててきた。
通常のWindowsUpdateでは1.1Frameworkは入らないのね…
2.0も同程度にしか普及しないのかな。OSのバージョンアップの計画もないし。
163NAME IS NULL:2005/06/28(火) 22:50:31 ID:???
> 通常のWindowsUpdateでは1.1Frameworkは入らないのね…
こういう仕様なのは確かに困りものですよね。
MS製なのに、なんでこんな仕様なんだろう。

手動で1.1Frameworkを入れたら、再度アップデートでセキュリティー
アップデートしないといけないし。
164NAME IS NULL:2005/06/29(水) 00:23:54 ID:???
使いもしないもの勝手に入れられるなんていやだし。
165NAME IS NULL:2005/06/30(木) 06:38:35 ID:???
メーカー物PCに入ってるアプリケーション体験版とは違うでしょ。
1.1Frameworkを入れたから不安定になるとか重くなるとか
無いはずで。
166NAME IS NULL:2005/06/30(木) 07:49:13 ID:???
WindowsUpdateの「優先度の高い」じゃないが「追加選択」のところでできたような。
167NAME IS NULL:2005/06/30(木) 12:16:55 ID:???
>>166
一般ユーザは、追加選択なんて試みないよ。
あんなのを毎回チェックしてるのは漏れたちだけw
168NAME IS NULL:2005/06/30(木) 18:47:05 ID:???
ここで聞いていいかわかんないんだけど。。。。

VS.NETでWebフォーム作成してます。
その入力フォームに検索入力して結果のウインド展開します。
その時、SQL実行してDBにアクセスするのですが
どうにもDBを見てないような感じなのです。

strSQL &= " 得意先コード = " & costormerCode & " and " & vbCrLf
strSQL &= " 得意先名 = " & costormername & " " & vbCrLf

With clsDB
.setDataReader(strSQL)
If .objDRD.Read Then
lbl_customercd.Text = .objDRD("得意先コード") & ""
lbl_customername.Text = .objDRD("得意先名") & ""
End If
.objDRD.Close()
End With

と作成しました。
SQL文自体はクエリアナライザで問題なく実行できました。
何が間違っているんだろう。。。誰か教授願います。
169NAME IS NULL:2005/06/30(木) 22:54:48 ID:???
clsDBとか言われてもな。
CMyDBって言われても困るだろ?
170NAME IS NULL:2005/06/30(木) 23:53:54 ID:???
>>168
もしかして文字定数のシングルクオーテーションが抜けてないか?
strSQL &= " 得意先コード = '" & costormerCode & "' and " & _
" 得意先名 = '" & costormername & "' "

あとは間違いじゃないが、strSQLの代入部分は継続行をつかって1行で書くか、
StringBuilder使う。余計なvbCrLf何ぞつけない。
セキュリティホールになりやすいので変数部分はParameterクラスを使う。
171168:2005/07/01(金) 10:13:15 ID:???
ちょっと略し過ぎました、、

>>170
指摘部分と意見参考にしてもう一度見直して、書き直して再TRYします。
dクスです。
172168 ◆XrFVZ6ASAs :2005/07/01(金) 12:03:31 ID:???
>>170氏の指摘どおり訂正しました。

SQL文は継続行にて編集。これは問題なくok。
しかし。。。
With clsDB
.setDataReader(strSQL)
If .objDRD.Read Then
lbl_customercd.Text = .objDRD("得意先コード") & ""
lbl_customername.Text = .objDRD("得意先名") & ""
End If
.objDRD.Close()
End With

得意先コードは出るようになったのですが得意先名が出ません。
また、つまってしまいました。
またどなたか指摘、意見もらえると幸いです。
173168 ◆XrFVZ6ASAs :2005/07/01(金) 14:40:09 ID:???
自己解決しました。
無事DBアクセスして項目内容Webに出力できました。
どうもお手数でした。
174NAME IS NULL:2005/07/02(土) 14:46:49 ID:???
解決したら、どう解決したのか書けよ。
それが公衆向け掲示板で質問するもののマナーだろうが。
175NAME IS NULL:2005/07/03(日) 09:23:29 ID:???
あきらめることで解決にしたんだよ。きっと。
176NAME IS NULL:2005/07/03(日) 14:27:33 ID:???
項目が一個出てれば、残りも出る。
出てなきゃコーディングミスさ。
177NAME IS NULL:2005/07/03(日) 19:45:45 ID:???
得意先名が空白だったとか
178168 ◆v.TAYcWkbs :2005/07/04(月) 01:03:08 ID:???
>>174
マナーねえ。。まあ、言わんとしてる事は一理あるとは思うけど。
だけど命令口調でデカイ態度でどうのこうの言われるのは嫌ですね。
いきなり攻撃的な文章描くヤツも十分マナーに反しているとは思うけど。
マナーに関してだけならVB.NET質問スレの住民に見習せたいとは思うけどね。

>>176
その通りです、貴殿の指摘通り単なる凡ミスです。
179NAME IS NULL:2005/07/04(月) 10:43:46 ID:???
>>178
まあ一般的な人としての常識をつけてから反論しようね。
聞いておいて出来たからいいなんて失礼千万ですよ。
180NAME IS NULL:2005/07/04(月) 13:19:18 ID:???
マナーのなさを指摘されて逆ギレかよ。
典型的なクズだな。

良くニュースで出てるだろ? 注意してくれた人に食いつくやつ。
鏡覗いてみろよ。 そいつがそうだ。そういう顔してるだろ? ww



181NAME IS NULL:2005/07/04(月) 17:49:15 ID:???
こういうスレッドが質疑応答の形をとって情報の共有と蓄積をしてるというのが
理解できていればどう行動すればいいかはおのずとわかると思うけどな。
182NAME IS NULL:2005/07/07(木) 16:22:23 ID:+rmuXYAF
DataSetイラネ
183NAME IS NULL:2005/07/10(日) 02:10:03 ID:???
ADO.NETイラネ
(ODP.NETイラネ)
184NAME IS NULL:2005/07/10(日) 19:50:52 ID:???
漏れは無いと困るYO
185NAME IS NULL:2005/07/12(火) 02:16:14 ID:???
でっかいテーブルを全走査する最適な方法ってどんなだろ?
186NAME IS NULL:2005/07/12(火) 10:09:55 ID:???
>>185
カーソル
187NAME IS NULL:2005/07/20(水) 10:19:27 ID:???
SQLサバのテーブル名一覧を取得する、手軽な方法ってあります?
Access で For Each 〜 Next で取得できたみたいに。
何を使ったらいいんだろ・・・
DataAdapterとか使うのかな。
188NAME IS NULL:2005/07/20(水) 19:42:19 ID:???
select name from [サーバ名].[データベース名].dbo.sysobjects where tyep = 'U' order by name
をDataReaderで読むってのはダメ?
189187:2005/07/21(木) 10:06:08 ID:???
>>188
できた。
でも、dtpropertiesてなシステムテーブルも含まれてしまう・・・
ちょい工夫したら使えそう。
さんkす
190NAME IS NULL:2005/07/25(月) 18:16:27 ID:???
ちょっと質問
INで複数(可変個)のデータ取得するときってパラメータどうやって使えばいいかな??
単純に文字列結合するか、単一行取得クエリをパラメータの数だけ投げてデータセットに追加してくくらいしか思い浮かばないんだよね
191NAME IS NULL:2005/07/29(金) 00:24:31 ID:0me5458W
あげてみる。
192NAME IS NULL:2005/08/02(火) 23:36:59 ID:???
>>190
昔、同じことで悩んだよ

・・・結局わからなくてパラメータ渡すテーブルを作ったw
193NAME IS NULL:2005/08/17(水) 20:42:24 ID:???
Access系統は、ADO.NET搭載しない予定なんだろうか。。。
そうなると、VB.NETとVBAは別物としてやっていくことになるのだが。。。
194NAME IS NULL:2005/08/17(水) 21:20:58 ID:???
つうか別物だし。でも似たようなものだし、何とかなるって。

ちなみに最悪なのがOfficeシリーズ新顔のInfoPath君。
VBAの替わりにVBScript/JavaScript搭載で、

XDocument.View.Window.TaskPanes.Item(0).HTMLDocument.parentWindow.showModalDialog(...略 )

とかやってHTMLなダイアログボックスを呼び出すツワモノだ。正気か。
195NAME IS NULL:2005/08/18(木) 00:21:34 ID:???
教えて下さい。
データを削除する方法として、論理削除と物理削除があると思いますが、
どちらが一般的なのでしょうか?
自分は今まで物理削除しかしていませんでしたが、最近仕事で一緒にやっている人間が
論理削除派なのです。
理由はトラぶった時に対応できるからだそうですが、実際にはどちらが良いのでしょうか?
また論理削除の場合、物理削除や復活機能は付ける物でしょうか?
何卒教えて下さい。
196NAME IS NULL:2005/08/18(木) 04:59:59 ID:???
>>195
ADO.NETとは関係ない話だな。質問の内容にあわせてスレを選べ。
論理削除と物理削除も同じ。データを削除するといってもいろいろなケースがあるだろう。
よく分析して必要に応じてどういう方法をとるかは考えろ。
197NAME IS NULL:2005/08/18(木) 08:49:59 ID:???
195です。
>>196
ありがとうございます。
ADO.NETとは関係ない話ですね。
もう少しいろいろ考えてみます。
198NAME IS NULL:2005/08/18(木) 09:17:14 ID:???
>>195
すれ違いだけど、本当に絶対にいらなくなるならば物理削除。
(余分なデータを置いておく理由はない、不具合の元になる可能性もあるし、性能の邪魔・資源の無駄)

業務上無視するデータとなるならば一端論理削除したあと、ある時点で物理削除。
(赤黒とか過去データの参照で必要になる可能性がある。)
199NAME IS NULL:2005/08/18(木) 10:01:13 ID:???
195です。
>>198
スレ違いでも回答頂きありがとうございます。
自分なりに考えたのですが、マスターデータなど物理削除より論理削除の方が良いのですよね。
これが定番の方法!というのがあればこんなに悩まなくても良いのですが。
200NAME IS NULL:2005/08/23(火) 18:17:38 ID:???
>>199
定番何て無いのよ。

それと、
マスターの削除、俺だったらストアドで削除レコードを別テーブルに出す。
マスターに残したら整合性が無駄になる。
201NAME IS NULL:2005/08/23(火) 18:18:54 ID:???
>>193
ADOさへ使ってないじゃん。
202NAME IS NULL:2005/09/07(水) 01:16:42 ID:???
AGE.NET
203NAME IS NULL:2005/09/18(日) 20:59:43 ID:???
Webフォーム開発とかあるけど、結局はphpやperlに及ばないって
イメージがあるんだけど、どうなんだろ。

ttp://www.amazon.co.jp/exec/obidos/ASIN/4774116653/249-6926620-2772304
204NAME IS NULL:2005/09/18(日) 21:08:30 ID:???
及ばないのは人口だけだな。
205NAME IS NULL:2005/09/19(月) 00:34:22 ID:???
>>203
ASPとphpなら同じ系統だから比較できるが、ASP.NETとphpとperlの3つは違いがありすぎて俺には比較できない。
203氏は相当の眼力をお持ちのようだ・・・ADO.NETとASP.NETの違いには節穴らしいけど。
206NAME IS NULL:2005/09/19(月) 17:51:55 ID:+3i+6Ufz
>>205
かっこいいな、君。
207NAME IS NULL:2005/09/19(月) 18:13:26 ID:???
2005でまた仕様変更がどっさりあるんだよね。
勘弁してくれよ‥‥。orz
208NAME IS NULL:2005/09/20(火) 00:04:27 ID:???
なんでこんなに仕様変更するんだろうね。
短期リニューアルによる利益向上のためなかなぁ?
実際に使われるかどうかは関係ないとして、とにかく売れる時に
売ってしまえっていう理論。
209NAME IS NULL:2005/09/20(火) 10:13:48 ID:???
でも、よっぽどアークテクチャー意思決定者が奇特じゃない限り、2005なんて使うのは来年夏ぐらいからだろ?
特に2005に飛びつく必然(OSが対応しないとか)があるわけじゃないし。
210NAME IS NULL:2005/09/20(火) 12:07:53 ID:???
2003で作ったのが2005環境でもきちんと動くか心配でさ。
MSDNでも赤字で注釈入ってるのがいっぱいあるし。
211NAME IS NULL:2005/09/20(火) 13:08:18 ID:???
>>210
それって心配することか?
当然・・・動かないことを前提にするに決まってるんじゃないのか?
MSに何を期待してるのって。

そもそも、今回のバージョンアップ、急いであげる必然性は基本的に無い。
まあ、コンポーネント屋さんだったら別だけど。
212NAME IS NULL:2005/09/20(火) 23:15:22 ID:???
>209
来年夏と言うと、2006のアナウンスが出ているのでは?
まぁ、M$の通例から言うと、2006が安定版だろうし。

>211
同感。
213NAME IS NULL:2005/09/23(金) 10:38:56 ID:???
つうか、何の為に>>210は.NET使ってるんだろう。

2003だろうが2005だろうが、対応する.NETFrameworkさえPCに入っていれば、
そのバージョンで動くというのがメリットの1つなのに。
214NAME IS NULL:2005/09/23(金) 12:37:32 ID:3e+NxVel
>>208
DAO、RDO・・・
今に始まったことじゃないじゃん。
ま、今回は仕様追加だけど。
215NAME IS NULL:2005/09/23(金) 14:02:26 ID:???
MSは実質、内部的にいろんな会社があって、
それらの会社が新しい言語を作って、MSが販売してる構造なの
かもしれないね。

MSはWordを0から作ったわけじゃなくて、
Wordの会社を買収して販売して大きくなったわけだし。
216NAME IS NULL:2005/09/27(火) 22:01:31 ID:???0
.net重いです。
古いOSで動かないです。
本当に主流になるんでしょうか。。。
217NAME IS NULL:2005/09/28(水) 17:31:30 ID:???
>>216
じゃばよりましだとおもうよ
218NAME IS NULL:2005/10/08(土) 07:35:25 ID:???
javaとADO.NETはどちらが良いのだろうか。。
219NAME IS NULL:2005/10/08(土) 08:55:05 ID:???
比較がとんちんかん。
違うものをどう比べろと
220NAME IS NULL:2005/10/08(土) 09:08:35 ID:???
>>218
javaがjdbcなのかHibernateのようなフレームワークなのかはっきりしてもらわないと答えられないね。

ただひとつ思うのは ado.net が adoの上位互換だったら使いやすかったんだけどね。
つまりadoと同等の密結合のAPIをもっててそれプラスで今のado.netの要素があるような作り。
221NAME IS NULL:2005/10/08(土) 18:45:49 ID:???
>>220
サーバー側でレコードロックしてループして・・・が出来ないのが致命的だよね。
受注とかでヘッダを検索してそれぞれの明細をいじりながら在庫を引き当ててとか。
レコードロックが出来れば簡単なのに、楽観的ロックじゃ実は難しい。
222NAME IS NULL:2005/10/09(日) 13:32:21 ID:???
>>220-221
もう少し調べてみたら?
知識すらない奴、多過ぎ。
223NAME IS NULL:2005/10/09(日) 14:52:57 ID:???
>>222
じゃあ、DataReaderがConnnectionを占有するっていう仕様を簡単に回避する方法は?
ADOならば単純に多重ループでカーソル開けたけど。
224NAME IS NULL:2005/10/09(日) 18:31:15 ID:???
>>222
System.data.sqlserver ならできるとか言い出すんじゃないか。
225NAME IS NULL:2005/10/16(日) 17:18:15 ID:???
すいません 旧バージョンの質問ですが、エクセル相談所で聞いた所VBスレに行くように言われたのですが、
中身からこちらの方なら、と思いましたので。

EXCEL上でADOでパラメータクエリを作成し、複数のアクセスMDBファイルから
クエリでデータを取得するプログラムを作っています。

このときいくつかのMDBには存在しないフィールドに対しても、クエリを実行するのですが、
当然エラーが出ます。

On Error Resume Next
Set rs = New ADODB.Recordset
Set rs = cmd.Execute

としても、次に飛んでくれないで、黄色い表示のデバッグになってしまうのですが・・・・エラーメッセージは以下です。
"実行時エラー'-2147217904 (80040e10)':
1つ以上の必要なパラメータの値が設定されていません。

クエリや他の部分はフィールドが存在するときは正しく動いています。フィールド名を事前に取得して
チェックさせれば良いのでしょうが、このエラーだけresumeが効かないのが理解できません。

226NAME IS NULL:2005/10/16(日) 19:22:43 ID:???
>>225
ADO と ADO.NET は名前が紛らわしいけど別物なので関連するスレはこの辺かのう。
スレ立てるまでもない質問・雑談@DB板
ADO DAO など接続方法について
227NAME IS NULL:2005/10/16(日) 21:07:30 ID:???
>>226
では下のに当って見ます。すみませんでした。
228NAME IS NULL:2005/10/18(火) 16:22:31 ID:???
ADO.NETでヘッダ+明細形式のDBの入力フォームを作る場合
明細部分をDataGrid以外の方法で実装する方法ってあります?

Accessからのアップグレードなんですけど、お客から、明細項目を
横スクロールさせないで見えるようにして欲しいと言われています。

229NAME IS NULL:2005/10/18(火) 17:08:02 ID:???
>>228
それはADO.netの問題じゃなく、VB.netのコントロールの問題。プログラムの適切なスレへ。
連結コントロールはGridだけじゃないから。

TrueDBGridとかだと、横スクロール無しで折り返して1レコード複数行みたいなことはできる。
230NAME IS NULL:2005/10/18(火) 17:49:02 ID:???
>>229
228です。
確かに、コントロールの仕様絡みの話ですね。失礼しました。
このスレの人ならこの手の実装方法について、経験やノウハウがあると思って
聞いてみましたが、該当スレに移動します。

TrueDBGridって文化オリエント(グレープシティー)の奴ですよね。
標準コントロールだとやっぱり無理なのかな…
231NAME IS NULL:2005/10/22(土) 01:30:34 ID:???
これdatasetの下にO/Rマッピングするもんなのか?
232NAME IS NULL:2005/10/22(土) 01:47:12 ID:???
今はとりあえずNHibernate
233NAME IS NULL:2005/10/22(土) 08:43:36 ID:???
O/Rマッピングのデータをインスタンス化する部分は自作かなんかかな?
インスタンス化するクラスはDataSetでOK。

ただ、O/Rマッピングってそんなに必要か?って思う最近。
234NAME IS NULL:2005/10/22(土) 12:42:20 ID:???
更新処理でごりごりSQL生成する手間が軽減するならいいなぁ。
235NAME IS NULL:2005/10/22(土) 16:34:29 ID:???
ObjectSpacesだったっけアレが出るまで
ADOでマッピングしてたほうがマシそう
236NAME IS NULL:2005/10/24(月) 00:47:19 ID:???
>>221
これってどうなん?

1.
MSSQLの場合は SELECT 〜 WITH (UPDLOCK) 〜
Oracleの場合は SELECT 〜 FOR UPDATE
など、明示的にSQLによってレコードロック

2.
Transactionのisolationlevelの設定によってどうにかする

ってなあたりが回答?
237NAME IS NULL:2005/10/24(月) 14:28:23 ID:???
DataReaderを用いて、従来型のADOのようにカーソル処理がしにくいのが問題なのだけど。
DataReaderを開いている間、Connectionを占有してしまい、他の処理ができないのが糞仕様。

ヘッダをカーソルで開いてロックして更新しながら、そのディティールを更新するような処理。
DataSetの楽観的ロックでよければ問題ないけど、それじゃ拙い場合に使えない。

出して頂いた方法をDataSet生成時に用いても、ロックがかかるわけじゃないでしょ。
238NAME IS NULL:2005/10/24(月) 15:31:44 ID:???
O/Rマッピングの良いとこ悪いとこ教えて
239NAME IS NULL:2005/10/24(月) 15:37:31 ID:???
専門すれがどっかにあると思うけど。

良いところ。
SQLを意識せずにオブジェクトを生成し、オブジェクトの操作だけでDB操作が出来てしまう・・・といいな。

悪いところ。
世の中そんなに美味しいことは無い。
正直、論理設計、画面設計からO/Rマッピングすることを意識しないと、メリットを甘受できないと思う。
半端なマネすると、結局ツールを使って出したオブジェクトへ手を入れる数が増えすぎて。
240NAME IS NULL:2005/10/24(月) 18:14:20 ID:ypyJJyo+
>>237
.NET Framework 2.0まで待て。
241NAME IS NULL:2005/10/24(月) 20:53:20 ID:???
>>237
悲観的行ロックはかけられるよ。後でUPDLOCKつきSELECTを行う側が普通に
待ちになる。以下のようなサンプルで試した。
まあADO風にカーソルまわしつつというIFではないけれど。
サポートしてないのは、サーバーカーソル自体がリソース食いだからってことも

using System;
using System.Data;
using System.Data.SqlClient;

class UPDLOCK
{
    public static void Main()
    {
        SqlConnection conn = new SqlConnection();
        conn.ConnectionString
            = "server=localhost;database=Northwind;Trusted_Connection=yes";
        SqlDataAdapter adapter = new SqlDataAdapter(
            "SELECT * FROM Customers WITH(UPDLOCK) " +
            " WHERE CustomerID like 'A%'", conn);
        SqlCommandBuilder builder = new SqlCommandBuilder(adapter);

        conn.Open();
        Console.WriteLine("Connect完了");
        SqlTransaction tx = conn.BeginTransaction();
        Console.WriteLine("Transaction開始");
        adapter.SelectCommand.Transaction = tx;
        builder.GetInsertCommand().Transaction = tx;
        builder.GetUpdateCommand().Transaction = tx;
        builder.GetDeleteCommand().Transaction = tx;

        DataSet dataSet = new DataSet();
        Console.WriteLine("EnterキーでSELECTします: ");
        Console.ReadLine();
        adapter.Fill(dataSet, "Table");
        Console.WriteLine("SELECT完了");
        dataSet.Tables["Table"].Rows[0]["ContactName"] = "Maria Anders";
        dataSet.Tables["Table"].Rows[1]["ContactName"] = "Ana Trujillo_";
        adapter.Update(dataSet);
        Console.WriteLine("EnterキーでRollbackします: ");
        Console.ReadLine();
        tx.Rollback();
        conn.Close();
    }
}
242NAME IS NULL:2005/10/24(月) 21:28:16 ID:???
>>241
多謝です。参考になります。
基本的に>>240さんの言うとおり2.0待ちなんだろうけど、VS2005が安定するのって2007年ぐらいでしょ。w

ADO.netってサーバーカーソルの非サポート以外は好きなんだけどね。
DataSetとか使いやすいし。
243NAME IS NULL:2005/10/25(火) 08:00:35 ID:???
SQLServer2005だとテーブル名のフルプリフィックスでも文法エラーにならなくなってる
244NAME IS NULL:2005/10/26(水) 23:45:26 ID:???
Microsoft Text Driver経由でCSVファイルにアクセスする場合、
デフォルトのフォーマットではない(たとえばタブ区切り)ときは
該当ディレクトリにschema.iniを作成する必要がありますが、
CD-ROMなど読取専用のためディレクトリにファイルを作成できないときは
どうすればいいのでしょうか・・・
245NAME IS NULL:2005/10/26(水) 23:51:16 ID:???
CSVなんて普通に読み込んでSplitしちゃえばいいじゃん。
246NAME IS NULL:2005/10/26(水) 23:52:27 ID:???
読み書き可能な手元のディレクトリにschema.iniを用意して、そこに
CSVファイルをコピーしてから処理するってのは?
247244:2005/10/26(水) 23:59:09 ID:???
>>245, >>246 様、レスありがとうございます。

もちろん、ファイルアクセスでやることも可能なのですが・・・
Microsoft Text Driverのフォーマットオプションを動的に変えることができるのなら
複数のファイルフォーマットに対応するのも容易かなと思いまして。
また、SQL文をそのまま投げれるのも魅力です。

見えるディレクトリにコピーする方法も有力ですが、
ファイルサイズが大きい場合は、無視できないコストになってしまいそうです。

接続文字列で FORAMT=TabDelimited とか設定できたらラクチンなのになぁ
248NAME IS NULL:2005/10/27(木) 08:10:46 ID:???
どとねっとでregexが使えるからText Driverは使わなくなったな。
249NAME IS NULL:2005/10/27(木) 14:03:24 ID:???
ttp://www.ken3.org/asp/backno/asp090.html
は参考にならんか?
250244:2005/10/27(木) 17:38:36 ID:???
>>249 様、レスありがとうございます。

ヘッダーの有効無効は HDR 属性でできるようですね。
しかし、FMT 属性に関しては、どのサイトのどのサンプルを見ても
FMT=Delimited で固定・・・

いろいろたどってみたところ、「ムリ!」っていう
MSの公式見解出てたんですねぇ。

http://support.microsoft.com/default.aspx?scid=kb;en-us;326548
から引用

You cannot define all characteristics of a text file through the connection string.
For example, if you want to open a fixed-width file,
or you want to use a delimiter other than the comma,
you must specify all these settings in a Schema.INI file.

Access のテキストリンクウィザードとか、どうやってるんだろうなぁ。
読取専用ディレクトリのタフ区切りファイルもちゃんと読み込めるし。
まさか自前なんてことは・・・
251NAME IS NULL:2005/10/27(木) 20:47:45 ID:???
NHibernate使えそうだ
DataSet/Tableは表示用ですっきりいけそう
252NAME IS NULL:2005/11/06(日) 00:00:10 ID:???
>>245
CSVを俺は普通に読み込んでSplitなんでとてもじゃないけど出来ないね。

文字コードが何なのか?
改行コードは?
カンマをデータとして持ちたい時はダブルクウォートで括る。
ダブルクウォートで括ってる時、ダブルクウォートをデータとしたいときは、ダブルクウォートを2つ書く。
ダブルクウォートで括ってる時、その中で奇数のダブルクウォートが発見された場合の挙動は?
レコードの最後にカンマだけがあった場合、その後に空白のフィールドがあるとみなすかどうか。

まぁ、本来これだけの処理が必要なCSVを単純にファイルから1行ずつ読み込んで、
Split関数でカンマで切って配列なりに入れるプログラマが、この業界に8割は居るんだがな・・・


俺は、.NETが出る以前から、LogParserを使ってる。
勿論、.NETからの使用も可能。

CSVファイルにSQL文使えるのがいいのよね。
253NAME IS NULL:2005/11/06(日) 00:01:51 ID:???
>>251
NHibernateって便利そうに思ったんだけど、ふとした疑問が浮かんだんだよね。

例えば、OracleのV$SESSIONとか使いたい場合、やっぱりこのクラスを作るのかねぇ・・・
あとは、DUALとかさ・・・
254NAME IS NULL:2005/11/21(月) 10:30:57 ID:???
今SqlCommnadのExecutereaderを使ってSqlDataReaderを取得Reader()でぐるぐる回しながら読み込んでいるのですが、選択した行が多いときに全部検索終わってからExecuteReaderを抜けているような気がします。
選択処理(ExecuteReaderのようなもの)実行しながら選択できた行を順次処理できるようなメソッドはないでしょうか?
255NAME IS NULL:2005/11/21(月) 12:25:43 ID:???
ADO.netで一番変わった部分で、MSが押してる部分だから、このスレとMSDN、関連資料をきちんと読むことをお勧めします。
256NAME IS NULL:2005/11/21(月) 13:33:41 ID:???
>>255
了解です。なんかちょっとつかいたいだけなのにいろいろ変わってて疲れた・・・orz
257NAME IS NULL:2005/11/21(月) 13:43:55 ID:???
>>256
Framework 2.0になったら、また変わるから。orz
258NAME IS NULL:2005/11/21(月) 15:13:32 ID:???
>>257
今2.0です。orz
259NAME IS NULL:2005/11/27(日) 00:06:29 ID:???
ADO.netで非同期クエリは出来ますか?
260NAME IS NULL:2005/12/25(日) 18:03:34 ID:???
やっぱ、vb6までの遺産は全部捨てる覚悟でないといけないのかなぁ。。。悩
261NAME IS NULL:2005/12/25(日) 19:12:41 ID:???
過去の資産は捨てずに「繋ぐ」のが.NET的なんじゃねーの
262NAME IS NULL:2005/12/25(日) 19:59:31 ID:???
コンパイルしてもエラーが100とか出るプロジェクトを
前に、混乱しております。。。悩
263NAME IS NULL:2005/12/25(日) 20:14:15 ID:???
vb6のプロジェクトをウィザードで.NETに変換したとか?
264NAME IS NULL:2005/12/26(月) 01:51:04 ID:???
それ以外に移項の方法ありますか?
265NAME IS NULL:2005/12/26(月) 09:22:19 ID:???
VB6でも層を意識して分けてるプログラムだと、移植率高いよね。
266NAME IS NULL:2005/12/26(月) 17:25:40 ID:???
フォームやファイル入出力やActiveXを使っていない場合は移植どころかほぼそのまま動くが、
そんなプログラムはほとんどないよなぁ。
ADOはそのままCOM呼び出しに変更されるだけだよな?ADO,NETには変えてくれなかったと思うが。
267NAME IS NULL:2005/12/26(月) 19:38:17 ID:???
低機能のものに置き換えは無理だわさ。
268NAME IS NULL:2005/12/26(月) 19:55:50 ID:???
テーブルのある列に、同じ文字列が何行にも渡って入っていて
その文字列が切り替わったことを判断するには、どうすればいいですか?
例えば
M001
M001
M001
M001
M001
M001
M001
M002
M002
M002
M002
M002
M002
M002
M002
M003
M003
M003
・・・みたいな感じです。
使っている言語はC#.NETなんですが、
if(dr["列名"].ToString() == "M002"){
//キーが変わった時の処理
}
なんてやってしまうと、汎用性がなくなるもので・・・
適切な方法ご教示願います。
269NAME IS NULL:2005/12/26(月) 20:54:31 ID:???
前の値を変数に代入しておいて、判定をしてはいけないの?
270NAME IS NULL:2005/12/26(月) 22:35:57 ID:???
>>269
ありがとうございます。
解決致しました。
271NAME IS NULL:2006/01/07(土) 01:14:30 ID:???
age
272NAME IS NULL:2006/01/11(水) 07:17:30 ID:???
TrueDBGridって日本じゃ使われてるけど、へぼいよね。
たぶん、ソース見たことないけど、作りもへぼそう。たくさん使われてるから、
バグはあまり出ないかもしれんが、無理やりバグフィックスしてそう。
昔あるGridコンポーネントのソース見たけど、そりゃひどいもんさ。6万くらいのやつかな??
それに対して俺のお勧めはhttp://www.devexpress.com/ ここのは信頼できる。
まぁ、まだ発展途上だから、バグが結構報告されているけど、すぐにFixしてくれるし、
サポートもすごいよい。でも、とりあえず、機能拡張はSTOPして、Fixに専念してくれよ。

273NAME IS NULL:2006/01/17(火) 14:48:12 ID:zHe27niw
MSDataSetGeneratorで自動生成された型付データセットをテキストボックスにデータバインドしてみたのですが、
Textプロパティが変化してくれません。(エラーはでない)
SqlDataAdapterで拾ってくるときに型付きでない普通のDataSetを使用すると上手くバインドで着ました。
何か解決策をご存じないでしょうか?

SqlDataAdapter da = new SqlDataAdapter("Select 〜","Server=〜");
Dataset1 ds = new Dataset1();
//DataSet ds = new DataSet();//こっちだと問題なく動作する
da.Fill ( ds );
textBox1.DataBindings.Add ( "Text", ds.Tables[0], "Meishou");
274NAME IS NULL:2006/01/17(火) 18:42:28 ID:???
>>273
ds.Tables[0] コレクションの0番に目的のテーブルが入ってないのでは。
ds.テーブル名 で指定してみたらどうです。
275273:2006/01/17(火) 21:32:58 ID:???
>>274
どうもです
いまちょっと試せる環境じゃないので明日試してみます。
でもコメントの部分を入れ替えるとバインドした時点で0行目の内容が適すとボックスに表示されるので
なにか型付DataSetが悪さをしているのかなぁと思ったのですが。
普通に型付DataSetでもデータバインドは可能なんですよね?
(ググっても出てこないところをみるとそうだと思うのですが・・・)
276NAME IS NULL :2006/01/19(木) 01:08:06 ID:???
質問よろしいですか?

ADO.NET 2.0使って検索画面作ってんですが、
非接続型の場合は
TableAdapterでパターン分だけクエリ作って

FillXXXX(DataTable , para1, ....)

を、それぞれ実行するしかないんですか?

ADO.NET 1.xの時みたいにDataAdapterの
CommandTextをソースから書き換える方法ってないですか?
(動的にSQLをゴリゴリしたい)

どうでしょうか?
277273:2006/01/19(木) 07:43:36 ID:???
インフルエンザでダウン中・・・
直ったら確認します....
278NAME IS NULL:2006/01/19(木) 09:27:57 ID:???
>>276
AdapterのReaderにDataReaderを設定できるようになったんじゃなかったんだっけ?
279NAME IS NULL:2006/01/19(木) 13:03:43 ID:???
DataSetにデータを取得した後、そのデータをグループ化して使う方法はないでしょうか?
DataViewあたりにそんな機能があれば良かったんだけど・・・。
280273:2006/01/24(火) 20:39:09 ID:???
>>274
まさにそのとおりでした。
型付Datasetにテーブルを一個しか追加していなかったのでds.Tables[0]と
決め付けていました。
調べてみるとds.Tables.Count=3になっていて、
ds.Tables[1]もしくは生成されたテーブル名で正しくバインドできました。
初歩的なミスでした。ありがとう
281273:2006/01/24(火) 20:48:20 ID:???
ちなみに一番の原因は
da.Fill ( ds, "テーブル名" );
とテーブル名を指定しなかったのが原因でした。
こうすればTables.Count=1になりました。お騒がせしました。
282NAME IS NULL:2006/01/26(木) 14:18:34 ID:???
>>5
1年前のレスにマジレスだが、
当初はXDO(XML Data Object)という名前にしようとしたんだけど、
開発者側が「また新しい3文字略称かよ」と言ったので、ADO+という名を経て
ADO.NETになったそうだ。
以上、本屋で売ってる「ADO.NET専修講座」より。

俺も最近ようやく基礎的な考え方がわかったきたよ。遅すぎ・・・
283NAME IS NULL:2006/01/26(木) 17:06:57 ID:???
皆さんはUpdateメソッド使ってる?
うちはFillでDataSetに取り込み&検証したあとは、ExecuteNonQuery
で直接書き戻してるよ。パラメータ設定とか面倒だしさ。
284NAME IS NULL:2006/01/26(木) 22:14:23 ID:???
>>283
> うちはFillでDataSetに取り込み&検証したあとは、ExecuteNonQuery
> で直接書き戻してるよ。パラメータ設定とか面倒だしさ。
うちもそんな感じ。
テーブル単体で読むことなんてほとんどないから、
JOINしたりしてると目的と違うテーブルが更新されないか、とか心配で怖くて使えません。
285NAME IS NULL:2006/01/26(木) 22:15:54 ID:???
>>282

>>以上、本屋で売ってる「ADO.NET専修講座」より。

この本は使えないから買わないほうがいい。
VBマガジンの連載(但しN田のは除く)の方がまだ役に立つ。



286NAME IS NULL:2006/01/27(金) 09:20:58 ID:???
>>284
その辺りは何処までADOの考えに沿ってシステムを作るかだろうね。
O-Rマッピングツールとして使うと考えれば、そのツールがAdapterであってそれに載ればよいと。
そうじゃない思想(旧来型のクラサバ)の延長で考えると、ReaderとExecuteでやればOK。
287NAME IS NULL:2006/01/31(火) 22:43:38 ID:xYIDIRU6
今更だがプログラミングADO.NETを購入してきた。
明日からちょっと節約。
288NAME IS NULL:2006/02/02(木) 00:26:15 ID:l446bGbp
学校の授業で「100万件データがあるテーブルにアクセスして、
クエリなげるプログラム作って、レスポンスタイムを短くするように
チューニングしろ」って課題がでたんだが、普通はどれくらいの時間
かかるんかな?
ADO.NETでSQL Server2000に接続します。テーブルの列は2,3列くらい。
289NAME IS NULL:2006/02/02(木) 00:52:11 ID:???
クエリによるだろ。
何するのか、もっと説明しる。
290288:2006/02/02(木) 01:41:51 ID:l446bGbp
>>289
そのクエリの内容をどうしようかなーと今考えているわけで。
普通にselect文しか思いつかない・・・OTL
レスポンス短くする(パフォーマンスチューニング)するには
何をしたらいいんだろう?
インデックスのつけ方以外で。
291NAME IS NULL:2006/02/02(木) 09:43:28 ID:???
あんたの質問は、きれいな絵を書けって課題が出たけどどうすれば?って聞いてるのと同じ。
292NAME IS NULL:2006/02/02(木) 11:19:07 ID:4Msp1fkq
DataViewのFindメソッドを使いたいけど、Sortプロパティは
変更したくない、という状況です。

Dim i As Integer = 0
While (i < View.Count)
If View(i)("列名") = 値 Then Exit While
i += 1
End While

と、値が見つかるまで虱潰しに探す処理しか思い浮かびませんが。
もっとスマートな方法はないですか?

なお、検索したいビューの行数は数行〜数千行程度です。
293NAME IS NULL:2006/02/02(木) 12:52:08 ID:???
別のViewって起せないんだっけ?
294NAME IS NULL:2006/02/02(木) 13:14:03 ID:???
同一Tableから複数のDataViewを、というのは可能ですが。
今回、検索にかかった行のインデックスを得たいのです。
295NAME IS NULL:2006/02/03(金) 09:20:39 ID:???
何がいいたいかも何がやりたいかも判らん。
もっと客観的に伝わる言葉で書いてくれよ。
行のIndexって何?
296NAME IS NULL:2006/02/03(金) 12:15:05 ID:???
開発環境:VB.NET + ADO.NET

DataViewオブジェクトのFindメソッドは、Sortプロパティで指定した
列を検索して、DataView内で検索にかかった行のIndexを返す。

DataView内
(ID) (検索列)
5  非検索値
2  検索値
7  非検索値

(コード)
DataView.Sort = "検索列"
Dim Index As Integer = DataView.Find("検索値")
If Index > -1 Then Debug.WriteLine(CStr(DataView(Index)("ID")))

(出力)
2


ただ、この方法だとSortを設定しないといけないので、DataView
内の元のソート順を崩してしまうことになって困る。
よって、Sortプロパティを設定しないままで同等の処理を行いたい。

ということです。
297NAME IS NULL:2006/02/03(金) 12:18:26 ID:uxDQ2asr
行のIndexというのは、上の例の場合、

Index (ID) (検索列)
1   5  非検索値
2   2  検索値
3   7  非検索値

のようにDataView内部で順に振られた順序のことを指しています。
正しい呼び方が他にあるのかもしれませんが。

上、age忘れ失礼しました。
298NAME IS NULL:2006/02/03(金) 12:20:45 ID:???
なんでIndexが必要なの?
(IndexってDataTableの行番号?)
別にデータにアクセスするならView越しでOKじゃん。
299NAME IS NULL:2006/02/03(金) 20:05:12 ID:???
行インデクサかID列か、どちらが欲しいのかわからないよ。
300299:2006/02/03(金) 20:12:34 ID:???
ああ、ごめん。DataView内の行を特定するインデクサが必要なん
だね。んで、見つけたあとに何をするかがわからないな。

ひとつしかヒットしないようなユニークな検索値なら、DataView
に抽出した時点で一行しか出てこないだろうし、それならインデク
サ0を直接参照して、好きなように読み書きできるかと。
301NAME IS NULL:2006/02/12(日) 00:02:12 ID:???
age
302NAME IS NULL:2006/02/12(日) 00:39:55 ID:???
Enterprise LibraryのData Access Application Block使ってる人いる?
ちょっと触ったところだと、ADO.NETの便利なラッパって感じなんだけど。
303NAME IS NULL:2006/02/17(金) 01:52:44 ID:???
何処で質問するべきか迷ったのですが、使ってるのがVB.NETなのでここで質問させてくださいm(._.)m
【質問内容】
Key値としてユニークな番号を発番したいのですが、良い方法というか一般的な方法ってありますか?
自分で考えれるのはMAX値を一旦取得してその次の番号から発番する方法しか思いつかなかったのですが、
消したり追加したりを繰り返すと空き番号が増えてもったいない気が・・・

環境はVB.NET+MSDE(将来的にはSQL server)です。
初歩的な質問だと思いますがご教授ください
304NAME IS NULL:2006/02/17(金) 07:28:58 ID:???
空き番号を気にしないならキーにIDENTITYを属性を指定するのが一番パフォーマンスがいい。
MAX+1でやるなら同時実効性が若干損なわれるから、それでもかまわないかよく検討すること。
途中にできた空き番号の再利用までしたいなら発行可能な番号をすべて書き出したテーブルを作って、
使用中かどうかを管理する。または不要になった番号だけを再利用テーブルに書き出して管理する。

PS.教授は留守だ。
305NAME IS NULL:2006/02/17(金) 10:19:19 ID:???
レコード削除などで発生した空き番号を再利用するのは、よく注意
しておいたほうがいいよ。ソート後の処理や古いリレーションがく
っついたりして悪さをする可能性が無きにしもあらず。

うちは一度発行したインデックスを再利用することもレコード削除
することもしない。消すときには専用のフィールドに使用不可を表
すデータ(日付)を入れておくだけ。
306308:2006/02/17(金) 13:44:26 ID:???
ありがとうございます。
確かにMAX値を取ってくると弊害が出てきますね。

教えていただいた方法でやってみます。
307NAME IS NULL:2006/02/22(水) 15:27:43 ID:58nXANJY
多分非常に初歩の質問だと思うのですが、、、、
ADO.NETで、別マシンのpostgresqlにODBC接続してSQLを発行したいのですが、
うまくできません。

Private Sub Button1_Click()
Dim strConn As String
Dim strSql As String
strConn = "Driver={PostgreSQL ANSI};database=XXX;..(省略).."

Dim cmd As New Odbc.OdbcCommand
Dim conn As New Odbc.OdbcConnection(strConn)

conn.Open()
conn.BeginTransaction()
strSql = "CREATE TABLE (CUSTOMER USER_BANGO INT(2))"
conn.CreateCommand.CommandText = strSql
conn.CreateCommand()
cmd.CommandText = strSql
cmd.Connection = conn
cmd.ExecuteNonQuery()
conn.Close()
Return

実行すると、いかのメッセージが出てしまいます。
(勿論)テーブルは作成されません。

System.InvalidOperationException はハンドルされませんでした。
Message="ExecuteNonQuery は、コマンドに割り当てられた接続が保留状態であるローカルのトランザクションにあるとき、トランザクション オブジェクトを持つコマンドが必要です。コマンドの Transaction プロパティがまだ初期化されていません。"
Source="System.Data"
StackTrace:(省略)
ちなみに、VS2005です。
どなたか、どうすればSQLが発行できるのか(どこが間違っているのか)
おしえてもらえないでしょうか。

308NAME IS NULL:2006/02/22(水) 15:37:18 ID:???
よく知らんが、conn.BeginTransaction() の戻り値を
cmd.Transaction にセットするんじゃないの?
309307:2006/02/23(木) 06:40:05 ID:JubXzwgA
308>
ありがとうございました。教えていただいたことで解決しました。
動作するようになったコードは以下です。

Private Sub Button1_Click()
Dim strConn As String
Dim strSql As String
Dim cmd As New Odbc.OdbcCommand
Dim conn As New Odbc.OdbcConnection
Dim transac As Odbc.OdbcTransaction

strConn = "Driver={PostgreSQL ANSI};database=XXX;..(省略).."
conn.ConnectionString = strConn
conn.Open()
transac = conn.BeginTransaction()
cmd.Connection = conn
cmd.Transaction = transac
cmd.CommandText = strSql
cmd.ExecuteNonQuery()
transac.Commit()
conn.Close()
Return
310307:2006/02/23(木) 06:42:48 ID:JubXzwgA
自己レスです。
309で、strSqlにSQL文を設定する処理を書き忘れてました。
311NAME IS NULL:2006/03/04(土) 22:06:46 ID:???
保守
312NAME IS NULL:2006/03/04(土) 22:20:53 ID:fUeZIVcy
。NETは伸びるでしょうか?
313NAME IS NULL:2006/03/06(月) 11:39:48 ID:???
コボル、VB、JAVAみたいにこれっていう決め手が無い時代になるんじゃないの?
基本的な言語実装はJAVAも.netも大差ないんだから、両方使えて当然の感じじゃないと。
314NAME IS NULL:2006/03/06(月) 14:58:14 ID:g8ZwN0DS
エラーメッセージ
「は、コマンドに割り当てられた接続が保留状態であるローカルのトランザクションにあるとき、トランザクションオブジェクトを持つコマンドが必要です。コマンドのTransactionプロパティがまだ初期化されていません。」
を受け取りました。

Win XP Pro
.Net Framework SDK 1.1 ASP.NET ADO.NET VB.NET

この環境でWebアプリケーションを開発中、メインプログラムにはデータベースのロジックは一切組み込ます、ユーザーコントロール(.ASCX)内に処理を定義し、メインプログラムから都度サブルーチンをCallしています。
(データベース更新処理は一テーブル一レコード単位でサブルーチンをCallして処理しているのですが、親子関係のレコードの更新は一番最初の処理で接続とトランザクションを設定し、一組の中の最後のレコード処理でコミット後接続断をする必要があります)

ASCX内のコーディングは下記のとおりです:

<%@ Control ClassName="UserMaster" Language="vb" %>
<%@ Import Namespace="System.Data" %>
<%@ Import Namespace="System.Data.Odbc" %>
<script runat="server">
Public con As New OdbcConnection( _
ConfigurationSettings.AppSettings("conStringMySql"))
Public cmd As New OdbcCommand
Public trans As OdbcTransaction

Public Sub ConOpenWithTransaction()

con.Open()
trans = con.BeginTransaction()
cmd.Connection = con
cmd.transaction = trans
End Sub

Public Sub UpdateTable()
Dim intUpdateCtr As Integer
cmd.CommandText = strSQL (Updateの内容を定義済)
intUpdateCtr = cmd.ExecuteNonQuery()
.
.

End Sub

トランザクション処理は初めての経験でメッセージの内容も余り理解できていません。例えば「接続が保留状態」は正しい状態なのか?「プロパティがまだ初期化されていない」はどこで初期化するのか、頭書にしているのではないかと思っていましたが?

前述の#309を参考にさせていただきましたが、まだ何かが足りないみたいです。
「接続、トランザクション開始処理」 と「更新処理」を別サブルーチンで実行しているのに問題がありそうですが、将来データベースサーバーの移行を考慮して、是非分割して処理をしたいのです。
トランザクション処理に詳しい方、アドバイスいただければ幸いで。
315NAME IS NULL:2006/03/07(火) 09:46:09 ID:???
分割する場合、分割した関数にConnectonとTransを渡せば良いだけじゃないの?
316NAME IS NULL:2006/03/07(火) 19:44:56 ID:XuXd+j4l
#314 を質問したものです。 本件はトランザクション処理途中にSelect文が入っていました。それを回避することにより、問題は解決しました。
改めて分割処理で別の問題が発生しました。
Insert と Update 処理でフィールドがシフトして値が正常にセットされません。
ExecuteNonQuery文を実行する手前で設定されたSelect文の全てを表示させると
値は正しく設定されているのですが、実行すると値がひとつ後ろにシフトされてしまいます。
実情は正規のキーの値がキーフィールドと次のフィールドにも設定されている状況です。
現在Mysqlのデータベースで cmd.Parameters.Add("@fieldid",value)を指定してテストしています。
アトバイスあればお願いいたします。
317NAME IS NULL:2006/03/08(水) 00:53:53 ID:???
>>316
データベースファイルに対して、ExecuteNonQueryの直前で生成し
ているSQLを直接実行した結果はどうなってるか確認した? 単に
SQLを読んだだけで「正しく設定されてる」とか思ってない?

Common SQL Environmentなんかで直にSQLを動かしてみよう。
318jaxonnoby:2006/03/08(水) 18:27:12 ID:03WY8NAz
>>317
アドバイス有難うございます。
残念ながらデバッグ環境を持っていませんのでどうやれば良いのかわかりません。
ExecuteNonQueryのSelectではなく、cmd.Parametrs.Addに設定する値をResponse.Writeで表示して確認しただけです。
どうやらデータベース接続、トランザクション開始、と更新処理を分割したサブルーチンで実行しているところに
問題がありそうなんですが、最初に述べましたようにデバッグ環境がないので見当がつきません。
319NAME IS NULL:2006/03/09(木) 09:30:30 ID:???
デバック環境持ってないってどういう状態よ。
今だったら幾らでもフリーでそろえられるでしょ。
320jaxonnoby:2006/03/09(木) 16:43:18 ID:HS5VT+JN
319>>
今回の問題が発生するまでは全くデバッグ機能を使うことなくソースエディタとインターットだけの環境でプログラム開発ができていました。
一度Visual Web Developer 2005 Expressを利用しようと考えましたが、利用開始するまでに、手間がかかりそうだったので、利用をやめました。
おかげさまで、今回の問題は更新サブルーチン内のパラメータ設定でパラメータオブジェクトを
一更新処理の前にクリアしていないことにより、過去のパラメータが累積されていたことがわかりました。
いろいろアドバイス有難うございました。
321NAME IS NULL:2006/03/10(金) 11:18:52 ID:???
>>320
データベースの更新直前に、どんなSQLコマンドが実行されるのかを
確認していれば、すぐに解決できた事例ですね。パラメータを使って
いると、そのへんの確認が面倒なんでうちでは自力で生成しています。

ウィザードとかパラメータは、見えないところが多いから正直使いに
くいと思う。トラブった時に追跡するのがたいへんだしさ。
322NAME IS NULL:2006/03/11(土) 03:33:39 ID:???
というか.NET Framework SDKに超立派なGUIデバッガDbgCLR.exeがついてるだろ
323NAME IS NULL:2006/03/13(月) 14:26:43 ID:9SgU+AsX
質問でつ。

あるADO.netを用いたアプリから、SQLSrv2kに、どれぐらいの頻度でどんなSQL文が投げられているのか
知りたいのですけど、これをモニタする便利な機能などあるのでしょうか?
アプリのパフォーマンスアップのために、キャッシュなどを使い始めたのですが、どの程度効いてるのか
知りたいんです。

該アプリが使うデータベースやテーブルは決まっており、他のアプリがそれを使うこともないので
データベース側でモニタしても構わないのです。

簡単なトリガが何かを書けば可能なのでしょうか? よろしくお願いしまつ。
324NAME IS NULL:2006/03/13(月) 21:46:47 ID:???
>>323
SQL Profiler
325NAME IS NULL:2006/03/14(火) 11:38:28 ID:???
>324
thx!
こんなのがあったんだ。7年近く使ってきたのに…
思ってた通りのSQLが流れてて満足しました。
ありがとうございました。
326NAME IS NULL:2006/03/15(水) 00:00:56 ID:???
>>325
こんなに喜んでもらえると嬉しいもんだな。
実行プランも一緒に使って、チューニングしてくださいね。
327NAME IS NULL:2006/03/16(木) 03:58:55 ID:???
>>325
7年付き合ってた彼女が、ニューハーフだったと気づくことと同じレベル。
328NAME IS NULL:2006/03/16(木) 11:41:56 ID:???
そいつはうれしいな
329NAME IS NULL:2006/03/17(金) 00:45:02 ID:???
別スレで質問したのですが教えないと言われてしまいましたので、
こちらで質問させてください。
排他ロックについての質問です。
SQLSERVERにて、
sqlcommand.CommandText="select * from 'テーブル名' with(tablockx,tablockx,holdlock)"
でテーブルロックがかかると思うのですが、
DB全体をロックしたい時は、どのような構文になるのでしょうか?
ご教授お願いします。
330NAME IS NULL:2006/03/17(金) 05:36:39 ID:???
Datasetが一気にすべてのレコードをサーバーからもってくるの何とかならんかな。
つまり、非接続型とかいう。Webアプリ前提の仕様やめてけれ。

331NAME IS NULL:2006/03/17(金) 08:50:21 ID:???
>330
DataReaderでガリガリ頑張れ!
332NAME IS NULL:2006/03/17(金) 09:25:18 ID:???
>>330
何が問題なのか判らんが。
画面一覧に表示してる間、レコードロックでもかけるの?
333NAME IS NULL:2006/03/17(金) 10:36:35 ID:???
DBメンテと称してケーブル引っこ抜いてローカルで作業するとか
334NAME IS NULL:2006/03/17(金) 13:45:22 ID:???
>>332
例えば、CSEみたいなSQL発行ツールを作ると、SELECT文で100万件返されると、
全レコード返るまで、結果が見れん・・・
335NAME IS NULL:2006/03/17(金) 14:15:04 ID:???
いや、発行ツールとはいかなくても、例えば、過去の売上データをユーザーが指定した
条件によって検索する画面とかで、レコード件数が多いと明らかに、不利だ。
クラサバアプリでは、非接続型は明らかに、つかえん。
もうちょっとインテリジェンスにレコードが要求されたら、その都度サーバーからフェッチしてほしいものだ。
ClickOnceなどの自動配布機能を提供するなど、MSもスマートクライアントに時代は移ると呼んでるふしがあるが、
非接続型じゃ駄目だ。



336NAME IS NULL:2006/03/17(金) 14:32:00 ID:???
別にそれは非接続型云々関係ないように思うが。
もし検索を件数で打ち切りたいなら、DataAdapterを使わずにDataReaderで取得した結果をDataSetに押し込めばいいだけだし。
クラサバアプリで使えないってのは、貴方の考えが着いていけないだけなのでは?
337NAME IS NULL:2006/03/17(金) 15:19:03 ID:???
>>336
禿同

テーブルなめるバッチ処理のプログラムでDataSetを使ったプログラム見たときは目眩がしたもんだ
338NAME IS NULL:2006/03/17(金) 17:20:26 ID:???
>>336
いや、件数で打ち切りたくないのです。例えば、グリッドに表示するとき、
初め、グリッドに最低限表示する分をフェッチして、スクロールバーでスクロールされて、
表示に新たな行が必要な時に、初めてフェッチされるイメージです。
元々、私Delphi人間なんですが、DelphiのあるDatasetはまさに、それをプログラムレスで
自動でやってくれるもので。
遂、比較してしまいます。
DataReaderって接続型なんですね。確かに、おっしゃる通りで、できそうですね。
すみません。
339NAME IS NULL:2006/03/17(金) 19:48:19 ID:???
質問宜しいですか?
あるASP.NETで作られたボタン付きのページまでのURLが有るとして、
まだ一度もサーバにアクセスしていない状態(ページをロードしていない)
からURLを打ち込み、以前のASPのように(.NETだとViewStateですか)
URLの後ろに引数を付けて、そのページのボタンを押した時と同じ動作を
させることは可能でしょうか?

セキュリティから見ると余り作法が良いとも言えませんが、サーバ側で接続時に
作るインスタンスが未生成の時の動きを、ページの初期ロードだけではなく、
そこにひと味付けると言う意味で、教えて頂きたいと思いました。
340NAME IS NULL:2006/03/17(金) 19:52:24 ID:???
339です。誤爆しましたごめんなさい。
341NAME IS NULL:2006/03/27(月) 02:14:34 ID:vkv27tSb
ADO.NetのアダプタのUpdateコマンドだけど、
これってテーブルの、変更された行毎にSQL投げてるわけじゃないですか。

と、するとね、
コミットって、HDD上にログを書き終えて初めて返ってくるわけでしょ?
つまり、オートコミット・モードだと、

 コミット→ [SQL処理→HDD上ログ書込→コミット]x n →SQL処理
となって、延々とHDDアクセスの待ち時間が掛かるわけだ?

そう考えると、コネクションにトランザクション設定しないととんでもない
パフォーマンス低下だよね?
342NAME IS NULL:2006/03/27(月) 02:29:26 ID:r0hE9Y7s
>>341
オートコミットだとログは書かなかったような気がしてきた。

だとしても、HDD上のテーブルの、一行更新し終わるまで
Updateを呼んだプロセスなりスレッドなりは待たされて、
数千以上のCPUのクロックを無駄にしてから、次の一行更新
に取りかかるわけだよね?



343NAME IS NULL:2006/03/27(月) 02:33:36 ID:???
ちなみに、トランザクション設定しても、
一行分ずつSQL送りよるね。

何でコミット送ったときにまとめて送らないんだろ…
344NAME IS NULL:2006/03/27(月) 10:01:56 ID:???
>>343
なんでまとめて送るって思えるんだろう?
やりながらNGになってロールバックっていう処理だってあるじゃん。
在庫を引き当てつつ処理してるけど、ある時点で在庫つきたからロールバックとか。

その処理をDataSet内のデータのみで一括でやるのはおかしいよ。
345NAME IS NULL:2006/03/27(月) 11:37:55 ID:???
>344
そうだね。
でも、アダプタのUpdateに関してはまとめて送るべきだと思う。
346NAME IS NULL:2006/03/27(月) 12:54:08 ID:???
>>345
2.0(2005)からそうじゃなかったっけ?
347NAME IS NULL:2006/04/03(月) 17:47:49 ID:???
あげ
348NAME IS NULL:2006/04/09(日) 13:39:53 ID:???
age
349白馬の玉子 ◆PqSzNbkqDo :2006/04/11(火) 18:39:00 ID:bho/Vj3W
ども。
あっしのようなやつでも、お力になれるなら、
いつでもどぜう。
350NAME IS NULL:2006/04/16(日) 16:59:56 ID:???
保守
351NAME IS NULL:2006/04/22(土) 04:02:21 ID:???
あげ
352NAME IS NULL:2006/04/24(月) 20:22:35 ID:???
MDBをOleDBで使用して
TableAdapterのUpdateCommandプロパティを使用してデータの更新をしようとしていますが、
OleDbではTeansactions.TransactionScopeは使用できないようですが
トランザクションを利用するにはどうすればよいでしょうか
353NAME IS NULL:2006/04/29(土) 08:45:56 ID:???
ODBC?
354NAME IS NULL:2006/04/29(土) 08:49:21 ID:???
JetもSQLSvrも、トランザクションのスコープには実質未対応(未実装)だったと思う。
あれって、DBMSの機能をオブジェクトでカプセル化してるだけで、
ADO.Netがなにかをやってくれるわけじゃないと思うんだけど。
違ったらすまん。

355NAME IS NULL:2006/04/29(土) 11:16:04 ID:???
>>354
>あれって、DBMSの機能をオブジェクトでカプセル化してるだけで、 
そのとおりで、直接DBのトランザクションを使う場合とCOM+の分散トランザクションを使う場合に
同じ書き方でスコープ単位の宣言トランザクションを使えるのが売り。
ただJETも一応トランザクション機能を持ってるからどうして使えないかはちと調べてみるか。
356NAME IS NULL:2006/05/01(月) 11:57:06 ID:NfBg2Jco
ASP.NET 2.0でも,DataTableの結合ってできませんよね?

あらかじめ結合した状態でDataTableを生成すればいいんだろうけど,
事情があって,異なるデータベースからDataTableを取得して,結合
できれば,とても便利なんだけど。

ググってみたけど,ヒットしなかったので,多分駄目だとは思うのですが。
357NAME IS NULL:2006/05/01(月) 16:30:53 ID:???
>356
リレーションシップを設定するのは簡単だから、結合する処理を実装すれば
良いだけでは?
358NAME IS NULL:2006/05/13(土) 09:40:55 ID:???
保守
359NAME IS NULL:2006/05/30(火) 16:11:40 ID:???
保守
360NAME IS NULL:2006/06/09(金) 11:12:06 ID:Kt0WadUm
>>356
もう超亀レスだけどw
Mergeとかどうよ?
361NAME IS NULL:2006/06/09(金) 15:10:14 ID:qq5u1iF/
ADO.NETで、単純にSELECTの結果の一覧を取得するだけ(つまり他のコントロールと連携などしない)場合
どの方法がもっとも速いですか?
362NAME IS NULL:2006/06/09(金) 15:40:08 ID:???
>>361
adOpenForwardOnly
363NAME IS NULL:2006/06/09(金) 15:41:41 ID:???
>>362
ごめん,.NETね。
SqlCommand.ExecuteReader
364NAME IS NULL:2006/06/23(金) 00:20:36 ID:???
hosyu
365NAME IS NULL:2006/06/23(金) 10:36:00 ID:???
ム板から誘導されました。

DataTableにExpressionプロパティ入りのDataColumnを追加して、
SqlDataAdapter.Updateしたら、
「Expression列のReadonlyを変更できませぬ」という
例外が出ました。
そうはいってもExpression列のReadOnlyはデザイナ上でだってfalseには
できません。
この列以外は全部ソーステーブルと1対1です。
どこをどうしたらいいんでしょうか。

いまはとりあえずUPDATEの後ろのSELECTをコメントアウトしてしのいでいます。
366NAME IS NULL:2006/06/23(金) 11:07:51 ID:???
>>365
追加したExpressionプロパティの処理内容と、具体的なエラーメッセ
ージ、および暫定対処のselect内容を、もっと正確に教えてたもれ。
367365:2006/06/26(月) 10:38:09 ID:???
>>366
【再現方法】
・VS2003 C#1.1
・新規Windowsプロジェクト
・SqlDataAdapter、ウィザードでクエリ作成、Northwind.Products
 列はProductIDとProductNameのみ、同時実行制御、データセットの更新オン
 接続ユーザーはsa
・データセットの生成、インスタンスをフォームに貼る。
・DataSetをデザイナで編集、Element列を追加、"ProductName2"
 string、Expression = "ProductName"、あとはいじってない。
 つまり商品名を2箇所に表示
・フォームにDataViewとDataGridを貼って普通にバインド
・Form_LoadでFill、button1_ClickでUpdateするだけ。

【例外】
sqlDataAdapter1.Update()
ReadOnlyException
Message = "Expression 列の ReadOnly プロパティを変更できません。"

【直したSQL】
自動作成された"UPDATE...;SELECT..."のSELECT以下を/**/で挟んだ
つまり「データセットの更新」オプションオフの状態。

【さらに】
新規作成の場合、上の方法でも同じ例外が発生することがわかりました。

Expressionの使い方がまずいのでしょうか?
368NAME IS NULL:2006/06/26(月) 11:22:10 ID:???
>>367
自動生成は冗長なんて面倒だよね。
Form_load時のFillコマンドで実際に生成されるSelect文は動いている
ようだから、Updateの末尾にあるSelect文のと差異を見つけられるか
もしれない。

もしくは前者のSelect文を、そのままUpdate文に連ねて書いてみると
か、NonQueryを使って自力で実行させるという手もある。
369NAME IS NULL:2006/06/26(月) 19:01:40 ID:???
>>367
VS2003が手元にないのでVS2002で試したところVS2002で同じ現象が確認できました。
VS2005ではエラーは起きませんでした。
370367:2006/06/27(火) 11:19:13 ID:???
>>369
うーむそうすると1.xのバグ(又は仕様)なんでしうか・・・

実際作ってるプログラムでは「サーバー側で既定値を設定させて
その値を返してもらう」とか、そういうことはしていないので、
INSERT/UPDATE後のSELECTは必要ないと思う
(同時実行制御はしてるから自分のところの値で更新されてるはず)
ので、とりあえずSELECTなしにしています。
とはいえ解決はさせたいので>>368をヒントにいじってみます。
ReadOnlyExceptionをスルーさせればSELECTありでも動いているように
見えるんですが、この場合更新件数は返ってきませんorz
371367:2006/06/27(火) 18:33:50 ID:???
同じ悩みを抱える人を見つけました。
ttp://blogs.labtech.epitech.net/blogs/jaylee/archive/2005/01/27/2156.aspx

これはなんか上手くいかなかったんですが、コメント欄には、
問題の列を一時的にコレクションから削除しておく方法が出ています。こちらは
うまくいきました。列のインデックスが変わってしまう点が弱点ですね。
372NAME IS NULL:2006/07/05(水) 11:37:20 ID:???
>>2の2.0verマダー?
373NAME IS NULL:2006/07/10(月) 15:04:36 ID:aBIIL5KH
ADO.NET2.0を利用しています。
DataSet内のテーブルに集計用のクエリを発行してその結果を受け取ることは可能でしょうか?
>>356と全く同じ状況で、異なるデータベースの異なるデータセットから親のデータセットに
Margeでテーブルだけ移動させてリレーション作成してrow.GetParentRow("リレーション名")で
データは取得できるようになったんですが、これを元にして集計を行いたいんです。
鯖に一時テーブル作成してそこに一旦データ書き込む方が現実的なんでしょうか?
374NAME IS NULL:2006/07/11(火) 09:20:13 ID:???
>>373
DataRowのExpressionを調べる。
375NAME IS NULL:2006/07/12(水) 22:09:41 ID:???
DataGridViewを使うようなプログラムで、みなさんはどういうやり方をしてますか?

データの取得に・・・
DataTable(DataSet)にFill
or
DataReader

DataGridViewに・・・
DataTableやDataSetをバインド
or
RowCount自分で増やして1行ずつ書き込み

DBに戻すのに・・・
DataAdapterでUpdate
or
Executeでこつこつと・・・
376NAME IS NULL:2006/07/13(木) 00:02:35 ID:???
読むのも書くのもSQLを自力で書いてExecuteしてる。
自動生成は正直使えないと思うよ。
377NAME IS NULL:2006/07/13(木) 09:51:20 ID:???
結合表に対して更新できないからね。
昔でいう、アクセスのウィザードで出来る程度の画面だったら自動のSQLでOKでしょ。
378NAME IS NULL:2006/07/14(金) 00:07:19 ID:TdnpPvu/
DataTableをAccessなんかでいうところの「ワークテーブル」みたいなものに見立てて、
DataTableとDBとのやりとりは、DataAdapter
DataTableと画面とのやりとりは、指定の場所に直接書き込みってな感じが多い。

基本的にはこれでいいんじゃないかと思っているが、
データ量が多い時の動作はバインドするほうが軽いような気がする。
379NAME IS NULL:2006/07/18(火) 00:17:56 ID:q2vjaqgB
非常に素人な質問で申し訳ないのですが
ODBC接続が可能なDBとういのはADO,ADO.NETで
接続可能と考えていいものなのでしょうか?
ご教授ください。
380NAME IS NULL:2006/07/18(火) 01:08:31 ID:???
381379:2006/07/18(火) 22:07:39 ID:???
>>380
ありがとうございます。
382NAME IS NULL:2006/07/20(木) 15:04:49 ID:???
ループ処理で新規レコード追加しまくりな時に、SELECT * FROM tableのSQLで
DataAdapter.Fill(DataSet)してからNewRow()で追加しているんだが、
追加側のレコード参照しないのにFillで全件取得するのは時間の無駄だよな?
TOP1とかSQLに加えて取得数制限した方がいいんだろうか
383NAME IS NULL:2006/07/20(木) 16:27:47 ID:???
>>382
事前に定義済みのDataSetなら読み込む必要はないし、そうでないなら where 1 = 0 でもつけて読み込めばいい。
絞込みの条件無しで全件読み込むのはレコード数が少ないことが保障されていない限り使うことはない
・・・はずなんだけど、たまに見かけるorz
384NAME IS NULL:2006/07/20(木) 16:32:41 ID:???
事前に定義済みのDataSetってのがよく分からないのでwhere 1 = 0 を使わせて貰うぜ!!!!!!!!!!
385NAME IS NULL:2006/07/20(木) 17:16:09 ID:???
SQLインジェクションを連想してしまった。
386NAME IS NULL:2006/07/24(月) 01:38:16 ID:???
あややが「イン・ジェク・ション!イン・ジェク・ション!」って
連呼してたCMは、最初どきっとしたもんだ。
387NAME IS NULL:2006/07/26(水) 00:05:30 ID:???
MSのSqlServer2000にVB.NETのSqlClientで接続しています。
SqlCommandのExecuteReaderメソッドでSELECT文を投げて
DataReaderオブジェクト取得した場合結果セットはどこにあるものなのでしょうか?

よくわかってないのですがクライアントアプリケーション側に
全結果が来てるわけではないのですよね?

変な質問で申し訳ないですが教えてください、お願いします。



388NAME IS NULL:2006/07/26(水) 02:04:50 ID:???
>>387
結果セットはどこにも存在しない。
クライアントはサーバーから送られてくるデータを順次処理するだけ。
DataReaderは前方スクロール専用でRead Only。
389NAME IS NULL:2006/07/26(水) 08:41:16 ID:???
>>387
@IT:基礎解説 ADO.NET基礎講座 ―初めての.NETデータベース・プログラミング― 第2回 .NETデータ・プロバイダによるデータベースのアクセス
http://www.atmarkit.co.jp/fdotnet/basics/adonet02/adonet02_02.html
390387:2006/07/26(水) 22:06:52 ID:???
>>388-389
ありがとうございます

実は>>389さんが紹介してくれたサイトを見てもわからなくて質問しました。
どこにも存在しないというのはデータベースにもないのでしょうか?

でもどこかに結果があれば前方向だけというのはおかしいですね・・・
DataReaderオブジェクトのReadメソッドは奥で何をしているのでしょうか?
391NAME IS NULL:2006/07/26(水) 22:35:46 ID:???
そんなこと気にするより先に覚えることあるんじゃないかな……
392390:2006/07/27(木) 01:44:41 ID:???
msdnに
ADO.NET の DataReader を使用して、データベースから前方への読み取り専用のストリームを取得できます。
結果はクエリを実行すると返され、DataReader の Read メソッドを使用して要求するまで、クライアントのネットワーク バッファに格納されます。
と書いてありました。
わかったようなわからないような、ですが。

前方のみなのはそもそもサーバカーソルを使うわけではないということなんだと勝手に納得しました。
お騒がせしました。
393NAME IS NULL:2006/08/16(水) 20:49:09 ID:???
age
394NAME IS NULL:2006/08/16(水) 23:45:49 ID:???
そもそもカーソルと言ったら普通はサーバー側のカーソルを指す。
で、フェッチしたデータをクライアント側でキャッシュして、前後方向に移動できるような機能がADOに追加され、
それがクライアントカーソルと言われるようになったので、従来のサーバー側のカーソルを
サーバーカソールと言うようになった。だから、データベース側から見れば、
クライアントカーソルの存在なんてしったこっちゃない。
クライアントカーソルはあくまで、クワイアント側が勝手に提供している機能。
それをごっちゃにしてるから、こんがらがるんだよ。
で、サーバー側のカーソルは今までは後方移動しかできなかった。最近のデータベースは
前方移動できるカーソルもサポートしているのもあるらしいが、
詳細は各データベースにゆだねる。
395NAME IS NULL:2006/09/11(月) 01:18:13 ID:???
スピードもうん十倍差があるし、
なんかあった時の不具合の習性でわけのわからない自動生成SQLの
変な癖で"Microsoftむかつく"と思いながらいちいちSQL文変えるの考えると
考えるとDataReaderとベタ書きSQLでやるほうが結局いいかもね。
396NAME IS NULL:2006/09/12(火) 17:11:46 ID:???
これはADOというかデータベースの問題かもしれませんが・・・

nullと空文字列は違うといいますが、たとえばデータを保存する際に
その項目が空だったら、varcharのフィールドには空文字列orDBNullのどちらを入れますか?

何も入っていない=nullというルールで統一したいところなのですが、
nullをいれるのってコードを書く際に結構面倒ですよね・・。

Accessなんかでは空文字列はプロパティで許可しないと入れられないので
昔から空文字列を保存するのはよくないというイメージがありまして・・・。
しかし、最近になって空文字列で統一されていれば
データをいちいちnullチェックしなくてすむのは楽だなと思ったりしました。

すべての文字列の項目を空文字列で統一するとなにかデメリットがあるんでしょうかね?
397NAME IS NULL:2006/09/12(火) 19:04:58 ID:pkmJ9WSM
VB.NET + ADO.NET + SQLServer2005Express です。

アプリケーションのバージョンアップに伴いサーバ側のテーブルや
ストアドプロシージャも変更できるようにしたいと思っています。

それで、データベース側に
ServerDataTable
Setting    Value
----------------
Version    1.00
みたいなテーブルを追加して、この値をアプリケーションから参照
した上で、必要な差分のぶんだけデータ定義コマンドを投げようと
思っているのですが、これで問題ないでしょうか?
398NAME IS NULL:2006/09/13(水) 15:01:07 ID:???
ADO.NETと関係ないね…それはシステム設計や運用の問題だろう…
その手の問題だとDBのリソースがどの程度つかえるか、
アプリケーションをどのように管理する予定なのかという
状況もわからないとその質問に明確に答えてくれる人はいないとおもうよ。
399NAME IS NULL:2006/09/13(水) 15:21:54 ID:???
>>398
ちょっとそこら辺、諸事情であまり書けないもので。すみません。
ありがとうございました。
400NAME IS NULL:2006/09/16(土) 00:06:17 ID:???
>nullをいれるのってコードを書く際に結構面倒ですよね・・。
普通、コードで何もいじくらなければ、デフォルトで既にnull入ってねぇか。。

401NAME IS NULL:2006/09/19(火) 11:04:32 ID:gIiqmeGm
ADO.NETから、パスワード設定をしていないmdbへの接続サンプルは
ヘルプにもネットにも沢山ありますが、パスワード設定をしている
mdbファイルへの接続方法がのっていませんよね。
mdbファイルのパスワードがpaの場合、接続文字列の最後に「password=pa」と
か追加してみても駄目でした。
パスワード設定をしているmdbへ接続するにはどうしたらよいのでしょうか。
どうぞよろしくお願い致します。
402NAME IS NULL:2006/09/21(木) 06:38:32 ID:???
403NAME IS NULL:2006/09/21(木) 07:07:26 ID:???
>>402
ありがとうございました。
「mdb "ado.net" 接続」などでやっていたところ、一番単純な接続サンプルしか出てこなくて
無いのかなと本気で思ってしまっていました。
ご迷惑おかけしました。
404NAME IS NULL:2006/10/01(日) 12:34:15 ID:+1GZROl8
datareaderってサーバカーソルを使ってないの?
405NAME IS NULL:2006/10/01(日) 13:42:15 ID:???
.netの先のDataドライバと、DBMSの仕様によるんじゃないの?
ADO.net2.0としてはそれは認知してないと思う。
406NAME IS NULL:2006/10/01(日) 19:09:13 ID:???
OracleやSQLServerだとサーバーカーソルを使っていると言う事で良いのかな?
407NAME IS NULL:2006/10/01(日) 20:59:56 ID:???
MSSQLServerはサーバーカーソルは使ってない。
使ってないから1つのセッションで開けるDataReaderは1つだけ(MARSを除く)の制限がある。
サーバーカーソルを使うとfetchするたびに通信の往復が発生するが、
DataReaderはクエリーした結果を一度に受け取っているイメージで、全部読み終わるまでのスピードが速い。
もちろんパケット単位で分割はされているだろうしそれ単位でのフロー制御はある。
408NAME IS NULL:2006/10/08(日) 00:14:01 ID:???
>>394を読めバカども
409NAME IS NULL:2006/10/09(月) 16:34:17 ID:???
>>406
firehoseカーソルをカーソルと見なすかどうかによるねぇ。
非カーソルと分類するなら>>407の見解になると思う。

ADOではadOpenForwardOnly/adUseServerでこのfirehoseカーソルになるのだが、
ado.netと違いなぜかこのタイプのカーソルを開いたままで他のカーソルが使える。
この辺のからくりが次のurlで説明されている。
ttp://www.microsoft.com/japan/msdn/sqlserver/sql2005/marsinsql05.aspx#marsins_topic4

これによるとADOがこっそりセッションをもうひとつ増やしているとのこと。
ただトランザクションを使った場合はセッションを増やすわけには行かないのでado.netと同じくエラーになる。
ado.netでネストさせたければ明示的にもうひとつセッションをオープンしろということでしょうな。
410NAME IS NULL:2006/10/09(月) 16:38:54 ID:???
>>394
スクロールカーソルはSQL92でも規定されているし、SQLServer、Informix、DB2はかなり初期から実装している。
反面Oracle、Postgres、myはたしかサポートしていない。
>サーバー側のカーソルは今までは後方移動しかできなかった。
というのは間違い。ただ処理系によって違うというのは事実だね。
このためoracleのodbcやoledbで任意の位置にスクロールさせるためにはクライアントカーソルにする必要がある。

ADO.NET(system.data.sqlclient)ではサーバーカーソルを全否定してるんだよね。
読み取りはfirehoseのみ、更新はupdate/insert/deleteを直接使えよと。
一方でMicrosoft.SqlServer.Server名前空間ではしっかりサーバーカーソルが使える。
つまりサーバーカーソルはストアドなどサーバーサイドで使えという考え方らしい。
411NAME IS NULL:2006/10/27(金) 01:10:44 ID:0en0NyWg
あげときますね。。
412NAME IS NULL:2006/10/27(金) 20:43:07 ID:???
伺います.

Accessのファイルから縦n 横mの要素でクロス集計を行わないといけないのですが,
どういう手法がありますか?
エクセルを埋め込むのは駄目らしいです...
413NAME IS NULL:2006/10/28(土) 18:02:22 ID:???
>>412
もう少し詳しくかけよ。何がしたいの?
414NAME IS NULL:2006/10/30(月) 11:21:11 ID:???
>412
ふつうのクロス集計だとダメなのか
415412:2006/10/31(火) 10:02:26 ID:???
すみません,別件のデスマーチに巻き込まれておりました...

VB.NET(C#でもいいんだろうけど)で
Accessファイルから取得したデータを使用してクロス集計を行うのですが.
n行×1列じゃなくてn行m列のピボットテーブルを作成するには
どういう手法を使えば簡単か伺いたいのです.

ADOでデータ取り込みまではできたのですが,
じっさいどうやればクロス集計に持っていけるのかがわからないでいます

>普通のクロス集計
でいいのだとは思うのですが,サンプルコードが載っているページとかないでしょうか?

最終的にはデータグリッドビューを使用することになると思うのですが,それで間違っていないかの確認もいただけたらと思います.
416414:2006/10/31(火) 17:25:31 ID:???
>415
データ読み込んでからクロス集計するロジック書けないなら、データを読み込む前にクロス集計
してから読み込め

参考SQL
TRANSFORM 〜
SELECT 〜
FROM 〜
GROUP BY 〜
ORDER BY 〜
PIVOT 〜;

こんなのあまりに初歩過ぎてサンプルコード無いのでは???
417412:2006/11/01(水) 15:53:14 ID:???
>>416
ありがとうございます.
Accessのファイルからの読み込みでは
n行1列しか扱えないと聞いていたのですが.
そうではないのですね.

そろそろ組み始めていきます.
ありがとうございました.
418NAME IS NULL:2006/11/03(金) 12:17:54 ID:???
>>412
デスマーチ・・・
SQLもわかんねーやつがデスマーチ・・・
しかもMDB・・・
419NAME IS NULL:2006/11/03(金) 15:25:35 ID:???
だからデスマなんでしょ
420NAME IS NULL:2006/11/07(火) 10:21:23 ID:???
DataView クラスの AddNew() メソッドで DataRowView を追加しても
BindingManagerBase(CurrencyManager) の Position プロパティにも
Count プロパティにも行数が反映されないんだが、これは .NET のバグなのかなぁ?

新規の行は作成されてるみたいなんだけど、どうやっても
移動できなひ・・・ちゃんとできてる人いる?

できなきゃおとなしく DataTable 使うか・・



421420:2006/11/09(木) 10:43:43 ID:???
自己解決しました

DataView から CurrencyManager を取得した場合でも
DataView の大元の DataTable に反映させないと Count プロパティは
変わらないのですね。

っつーことで EndEdit() で解決
TextBox あたりに DataView バインドした場合は CancelEdit メソッドは
使えないということですな、、、自前で Delete するか。

いやいやスレ汚しスマソ
422NAME IS NULL:2006/11/09(木) 11:29:33 ID:???
スレ汚しついでに書いとくと、あくまで DataView に AddNew() した
場合で、普通はせっかく CurrencyManager 取得するんだったら
こっち側の AddNew() & CancelCurrentEdit() 使うわなつーことで。
423NAME IS NULL:2006/11/18(土) 12:24:47 ID:???
ADO.NETはサーバーカーソルが無いのでUPDATE時の排他チェックで困ります〜 orz
424NAME IS NULL:2006/11/26(日) 22:50:18 ID:???
ADO関連によい参考書籍はどれがお勧めですか?

プログラミングMicrosoft ADO.NETがamazonで評価高いですが高くて。
425NAME IS NULL:2006/11/27(月) 10:50:43 ID:???
@ITの連載と、MSDNだけで十分。
426NAME IS NULL:2006/11/30(木) 11:14:06 ID:???
データーベースはAccessです。

ID  日付      商品コード  価格
1  11/29    100      900
2  11/30    100      1000
3  11/30    100      1010
4  11/30    200      2000
5  12/1     200      3000

のようなデータから商品コード毎の最新日付の価格(安い方)を取り出したいです。
上記データだと
商品コード   日付    価格
100       11/30  1000
200       12/1   3000
となります。

どのような処理をすればよろしいのでしょうか?
427NAME IS NULL:2006/11/30(木) 15:21:51 ID:???
>>426
SQLのスレで聞いた方がいいんでね?
428NAME IS NULL:2006/12/20(水) 00:07:30 ID:???
初心者には敷居が高い_| ̄|○

↓こーいうクラス作ってて
#Region "//**メンバ変数**//"

Private PrimaryKey As String
Private FirstKey As String
Private SearchTable As String

#End Region

#Region "//**コンストラクタ**//"

Public Sub New(ByVal parKey1 As String, ByVal parkey2 As String, ByVal parTable As String)

PrimaryKey = parKey1
FirstKey = parkey2
SearchTable = parTable

End Sub

#End Region

#Region "//**レコードの追加**//"

Public Function InsertRecord(ByRef dr As DataRow) As Boolean

Dim Cn As New OleDbConnection(My.Settings.DBConnectionString)
Dim SQLcmd As OleDbCommand = Cn.CreateCommand
Dim Adapter As New OleDbDataAdapter(SQLcmd)
Dim Builder As New OleDbCommandBuilder(Adapter)
Dim Table As New DataTable

Try
'//**Tableにデータを読み込む**//
SQLcmd.CommandText = "SELECT * FROM " & SearchTable & ""
Adapter.Fill(Table)
'//**新規レコードを追加**//
dr = Table.NewRow()
Table.Rows.Add(dr)
'//**Tableの内容でMDBを更新**//
Builder.DataAdapter = Adapter
Adapter.Update(Table)
Form1.DataGridView1.DataSource = Table
Return True
Catch ex As Exception
Return False
Finally
Builder.Dispose()
Table.Dispose()
Adapter.Dispose()
SQLcmd.Dispose()
Cn.Dispose()
End Try

End Function

#End Region

↓こーいう動作させたいけどAddRowへの代入でエラーがでます・・・なぜ?
429NAME IS NULL:2006/12/20(水) 00:08:05 ID:???
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click

Dim PrimaryKey As String = 部門コードTextBox.Text
Dim FirstKey As String = 部門名TextBox.Text
Dim SearchTable As String = "tSection"
Dim AddRow As DataRow

Using clsSection As New DBIO(PrimaryKey, FirstKey, SearchTable)
'主キーの重複チェック
If clsSection.PrimaryKeyCheck = True Then
Exit Sub
End If
'第一項目の重複チェック
If clsSection.FirstKeyCheck = True Then
Exit Sub
End If
'レコードの追加
AddRow(0) = 部門コードTextBox.Text ←ここ!!
AddRow(1) = 部門名TextBox.Text
AddRow(2) = 郵便番号TextBox.Text
AddRow(3) = 住所TextBox.Text
AddRow(4) = 電話番号TextBox.Text
AddRow(5) = ファックス番号TextBox.Text
clsSection.InsertRecord(AddRow)
End Using

End Sub
430NAME IS NULL:2006/12/20(水) 13:47:52 ID:???
Dim AddRow(5) As DataRowになってないからじゃね?
431430:2006/12/20(水) 13:53:04 ID:???
ああごめん。流し読みしてて間違えた。
AddRowの引数はフィールド指定だったね。

事前にNewRowで空行を生成してないからじゃないかな?
432NAME IS NULL:2006/12/20(水) 20:28:07 ID:h1j7g+Lk
>>431さん

ずばりその通りでしたorz

もいっこ質問なんですが、みんなデータベースアプリ作るとき(小規模な)1テーブル1クラス?
それともReaderクラスとか処理系ごと?

教えてたもれ!(*゚∀゚)=3
433NAME IS NULL:2006/12/22(金) 18:58:22 ID:???
joinする場合とかあるからReaderClassだな。
434NAME IS NULL:2006/12/27(水) 11:28:45 ID:???
DataGridViewで一番下の*の付いた行を削除しようとされると
InvalidOperationException で落ちます。
どうすれば阻止できますか?
435NAME IS NULL:2006/12/27(水) 11:50:47 ID:???
まにあるにヤメレと書いておく
436NAME IS NULL:2006/12/27(水) 13:25:44 ID:???
グリッドから新規行の追加なんてさせるなってことさ。
せいぜい編集くらいに止めておくべきだよ。
437NAME IS NULL:2006/12/27(水) 13:33:15 ID:???
AllowUserToDeleteRowsをfalseにして自分で処理すれ
438NAME IS NULL:2006/12/27(水) 13:34:31 ID:???
indexがテーブルの行数を越えていたら無視
439NAME IS NULL:2006/12/27(水) 13:43:30 ID:???
>>438
Delキー押されたら?
440NAME IS NULL:2006/12/27(水) 14:12:42 ID:???
そうなんだよなぁ。
グリッドに表示されているCurrentRowIndexと、テーブルのRows.Count
にはズレが発生するから、そのまま使ってると後々面倒なことになるし。

うちはCurrencyManager経由でごまかしてるけど、このへんの実装って
おかしくね?
441NAME IS NULL:2006/12/27(水) 14:43:21 ID:???
おかしくない、新規入力中の行はGrid上は有り、バインド元無しってのは正しい。
442NAME IS NULL:2006/12/27(水) 15:13:05 ID:???
ああごめん、入力中のじゃなくて>>439絡みの削除について書いてた。
Rows.CountはRowStateの状態に関わらず全数取得するのはわかるんだ
けど、例えばDeletedを除外した結果だけを返すとか、もうちょっとオプ
ションが欲しいなと思ってさ。

うちはまだ1.1ベースだけど、2.0以降になったらまた変わってるのかな?
443NAME IS NULL:2006/12/27(水) 16:18:20 ID:???
444NAME IS NULL:2006/12/27(水) 16:19:29 ID:???
そもそも行扱いなのがいけない
445NAME IS NULL:2006/12/27(水) 22:20:51 ID:???
新しい行でデリート押したら死亡したw
446NAME IS NULL:2006/12/28(木) 00:08:50 ID:???
まあ、DataGridは一覧表示&一部編集&複数行の一括削除くらいでやめ
ておくべきだね。行追加は項目数や内容によっては横長になりがちだし、
入力チェックも面倒そうだ。
447NAME IS NULL:2006/12/28(木) 21:37:50 ID:???
行の作成か削除のどちらか無効にしないと確実に落ちるから
明らかにバグだろ
448NAME IS NULL:2006/12/28(木) 21:48:30 ID:???
catch(InvalidOperationException e)
{
if(dataGridView.CurrentRow.Index > dataTable.Rows..Count)
MessagaBox.Show("消すな( ゜Д゜)ゴルァ!");

}
449NAME IS NULL:2006/12/30(土) 01:20:54 ID:???
2005でも解決してないの?
450NAME IS NULL:2006/12/30(土) 17:35:57 ID:TSMLJlTl
ADO接続で、dBASE IVのプロバイダ設定していますが、
create table test.dbf ( col numeric(20,10) )とやっても、
DBFファイルを見ると、整数部20の小数部5桁になってしまいます。
小数部が必ず5桁で定義されてしまいます。

これはどうすれば任意の小数部桁数が指定できますでしょうか?

言語はVC++ MFCです。
451NAME IS NULL:2007/01/10(水) 00:46:54 ID:???
普通は空の行消そうとなんか思わないだろ
452NAME IS NULL:2007/01/11(木) 22:22:04 ID:???
それをするのが一般ユーザーの恐いところなんだな。
453NAME IS NULL:2007/02/02(金) 22:27:25 ID:fdCBEJdL
2002で戸惑っていて、やっと慣れたとおもっていたら、2005でまた大幅に
仕様が変わっているとか書いてある。。。こんなペースのバージョンアップで
開発なんか出来るのかなぁ。。
454NAME IS NULL:2007/02/05(月) 17:11:05 ID:???
DAO
 ↓
RDO
 ↓
ADO
 ↓
ADO.NET 1.1
 ↓
ADO.NET 2.0

毎回、大幅に変わってますが何か?
455NAME IS NULL:2007/02/08(木) 20:31:14 ID:IHk50Zf7
ま、ローカルに2次元の変数を宣言していて、そこに代入して言っているという
イメージに変わるってことなんだろうけど、更新とかのノウハウがいまいち分からない。。
同時アクセスしてきた時の処理とか
456NAME IS NULL:2007/02/12(月) 20:35:04 ID:PC2a0r5+
谷尻さんの書籍、2005になって内容が大分分かりやすくなった。
各クラスの説明や、操作の方法をサンプルを交えて解説してある。
以前のバージョンのは、分かりにくかった。
解説がプロパティをいじるだけで終わりとかだったからなぁ。

ただ、2005のものは、同時アクセスの制御について記述されていなかった事が
残念だと思った。
457NAME IS NULL:2007/02/14(水) 22:18:52 ID:A1GGRfpp
情報量が多くなって来て、要点を抑えた簡潔なものが手に入るようになってきたんだと思う。
以前は、「大量の文章」もしくは「ウィザードでグリッドに表示させて便利でしょ?」というものだった。
458NAME IS NULL:2007/02/14(水) 22:35:03 ID:???
前バージョンの谷尻さん本は、正直キツかった。
ウィザードがんがんパラメータごりごりで、CommandBuilderが生成した
冗長SQLみたいだと思わなかった?
459NAME IS NULL:2007/02/14(水) 23:46:40 ID:???
>>458
買って愕然としたよ。定番の書籍だからあれで勉強しようと本気で思っていたのに。
基礎編と応用編両方ともがウィザードばっかりなんだもん。

今回の書籍を読んで、当時は書いた本人もあまり理解していなかったのでは?
と思った。この人について詳しい事は知らないけれど、こういった、新しい技術系の
書籍の著者は技術に長けているのではなくて、翻訳が出来るだけだと聞いた事がある。
460NAME IS NULL:2007/02/15(木) 00:02:16 ID:???
>>459
だよなぁ。

オレがVB6で教えてもらってたとき、コネクションから更新まで全部
コードで書くやり方だったんで、ウィザードまかせの解説本はどうに
も合わなかったよ。2005版で良くなってるのなら、ちょっと立ち読み
してこようかな。
461NAME IS NULL:2007/02/15(木) 12:35:06 ID:???
DataAdapterをO-Rマッピングツール、それを前提として設計してるならウィザードのみでいけるんじゃないの?
そうじゃない設計のテーブルだと、結合とか入って更新不可な場面ばっかりになるから。
462NAME IS NULL:2007/02/15(木) 12:56:44 ID:???
>>461
意味分かって書いてる?
463NAME IS NULL:2007/02/15(木) 13:24:25 ID:???
結合して更新不可とか書いてる時点であかんだろ。
ごった煮テーブルだろうが何だろうが、SQLで直に更新するのが結果的に
いちばん楽だよ。O/Rマッピングは単に手間を減らすだけで、チューニン
グやデバッグにはSQL不可欠だし。

何でもかんでもオブジェクト指向ってのは、正直良くない潮流だよなぁ。
464NAME IS NULL:2007/02/15(木) 18:13:30 ID:???
ORマッピングはいらない
http://pc10.2ch.net/test/read.cgi/tech/1150944930/
465NAME IS NULL:2007/02/15(木) 18:15:09 ID:???
SQL文をハードコーディングするやつはとっとと氏ね
http://pc10.2ch.net/test/read.cgi/prog/1170779576/
466NAME IS NULL:2007/02/15(木) 18:59:47 ID:???
自称ADO.NETの申し子なんだが
おまいらの言ってる事がひとっつも理解できないぜ!
467NAME IS NULL:2007/02/15(木) 19:02:46 ID:???
まだ子どもだからだろう
468NAME IS NULL:2007/02/15(木) 19:06:26 ID:???
ADO.NETの萌えっ子だったらよかったのにな。
469NAME IS NULL:2007/02/15(木) 21:41:04 ID:???
>>460
俺の場合もコネクションから更新までをコードで書くやり方で習ったせいか、
データセットやアダプタ、コネクションをデザイナに貼り付けてコードを書くやり方は
いまいちしっくりとこない。
フォームで動くオブジェクトならわかるが、そういうもの以外をはりつけていくと、
コードが分散していくし、オブジェクトが多くなると不必要に画面を占領していって
分かりにくくなると思う。

デザイナはコードを目で追わなくても、一目で、データセットやアダプタの状況が分かる
ということのようだが、あのやり方に慣れたとしても、他のオブジェクト指向プログラミングには
生かしたり出来ないと思う。
470NAME IS NULL:2007/02/16(金) 16:47:32 ID:???
抽出にしろ更新にしろ、ロジックだから
プログラム内に書かれているほうが
後から追いやすいし、メンテしやすい。
471NAME IS NULL:2007/02/16(金) 21:28:13 ID:???
「DataSetやAdapterをウィザードを使ってデザイナに貼り付ける機能」は、
「プログラミングを触ったばかりの人向けに、ループをウィンザード形式で実現する機能を提供する」
というものと似ているものなのかなと感じた。
472NAME IS NULL:2007/02/17(土) 13:47:11 ID:???
>>462
だからO-Rマッピング"前提の設計"って書いてるでしょ?
ADO関係なく、O-Rマッピングが使えてるプロジェクトってのはそうやってやってるの。
>>463 さんのようなSQL直ってのは排除する前提ってのがまずありき。
473NAME IS NULL:2007/02/17(土) 14:26:53 ID:???
>>473
どこに O があんだよ?
474NAME IS NULL:2007/02/17(土) 15:28:09 ID:???
×「O-Rマッピングが使えてるプロジェクト」
○「O-Rマッピングを使うためのプロジェクト」

確かに設計段階から使うことを想定していれば、ORMに最適化されている
んで使い出は良くなるだろうね。一から起こせる新規の案件で、チーム全
体にORMが浸透している必要があるけど。

ORMだろうがSQL埋め込みだろうが、要は作る側の都合なんだよ。
使う側にとっては、要件を満たした動作をする限りどっちでもいいだろ。
優劣を競うことに意味は無いし、優れた成果物を作る方に専念しようよ。
475NAME IS NULL:2007/02/17(土) 18:06:29 ID:???
誰か DataAdapter とウィザードを使って O-Rマッピングする方法を教えてくれ。
O ってのは、もちろんデータセットではなくて、自分で作ったクラスな。
476NAME IS NULL:2007/02/18(日) 00:52:35 ID:???
>>475
残念〜ADO.NETはR-Oマッピングなんだよ。
477NAME IS NULL:2007/02/18(日) 10:29:00 ID:???
DataSetやDataTableなんかは、データベースに接続しなくても作る事が出来るわけだから、
2次元配列とかで複雑な処理をするコードを書く際に使えるなとも思った。
配列にソートやフィルタ機能がついてるクラスって見る事も出来るわけなのだから。
478NAME IS NULL:2007/02/18(日) 21:08:33 ID:???
DataSetクラス
http://msdn.microsoft.com/library/ja/default.asp?url=/library/ja/cpref/html/frlrfSystemDataDataSetClassTopic.asp
データセットの概要
http://msdn.microsoft.com/library/ja/default.asp?url=/library/ja/vbcon/html/vbcondatasets.asp

MSDNだけで理解って難しいよね。一方で谷尻さんの2005の方の書籍はすごく概要が分かりやすかった。
公式解説書の方もやたらと分厚くて要点が分からないし。
新言語が出て、概要をつかむ時って、みんなこういう分厚くて分かりにくい文章を解読して
理解していってるのかなぁ。。。って思う。
479NAME IS NULL:2007/02/19(月) 14:05:07 ID:???
テーブルに主キーを追加する方法がわかりません。

Dim column(1) As DataColum

column(0)=ds.Tables("table").Columns("ID")
ds.Tables("table").PrimaryKey = column

とすると列'ID'にはNULL値が含まれています。とエラーがでます。
ただ、このID列にはすべて数値が入っていてNULLではないことは確認しています。
他に設定が必要な項目があったら教えて下さい。
480NAME IS NULL:2007/02/19(月) 14:23:13 ID:???
>>479
コードは間違いないと思う。
配列宣言はcolumn(0)じゃないのかなぁ。
481NAME IS NULL:2007/02/19(月) 14:41:48 ID:???
試しにcolumn(0)にしてみましたがエラーは同じでした。
これはMSDNにのっていたサンプルでは
実際に使用している配列数+1の表記だったので何も考えずにそのまま使いました。

MSDNのサンプルだと新規にカラムを追加して、それを主キーとして設定するもの
なのですが、私の場合既存のカラムを主キーにしたいのです。
482NAME IS NULL:2007/02/19(月) 15:27:49 ID:???
新規にテーブルを作って試したところ、
無事に主キーを設定することができました。
原因特定できずに気持ち悪いままですが一応解決です。
483NAME IS NULL:2007/02/19(月) 15:46:36 ID:???
主キーを設定する前にDataSetに行追加してました。
その後でUpdateを呼び出して同期したと思っていたら、これは
DataSet --> Database の一方通行の書き込みだったのですね。
ID列の値はDB書き込み時に設定されるので、
これだとDataSet内にあるID列は確かにNULLですね。
エラーがでるはずです。
484NAME IS NULL:2007/02/21(水) 08:00:33 ID:???
私は今までの技術の流れの方を知らないんだけれど、このペースで行くと、
今のDataSetやDataAdapterはいつごろ使えなくなる技術になるのでしょうか。
485NAME IS NULL:2007/02/21(水) 09:54:29 ID:???
しらねー。
.net フレームワークが続けば、基本的には変わらないと思うよ。
486NAME IS NULL:2007/02/21(水) 10:08:55 ID:???
>>484
早ければ C# 3.0 の時代から。「使えなくなる」わけじゃなくて、「使う意味がなくなる」
ってことだけど。
487NAME IS NULL:2007/02/21(水) 12:44:11 ID:???
>>486
VB.net 3.0や、VC.net3.0じゃ駄目ですか?w
488NAME IS NULL:2007/02/21(水) 12:58:21 ID:???
プロプライエタリな技術やノウハウは、確かに怖い罠。
489NAME IS NULL:2007/02/21(水) 13:04:21 ID:???
>>487
VB は次のバージョンが 9.0、VC は cl のバージョンでいえば 15 かな?ww
490NAME IS NULL:2007/02/22(木) 07:20:05 ID:???
概ね、>>454の流れで来てたと思うのですが、こういう技術は何年持っていたとか
あると思うのですが、そういうのはまちまちなんですか?
もって3年間くらいだろうとか。
491NAME IS NULL:2007/02/22(木) 09:36:37 ID:???
で、それを考えてどうすると?
別にDAOの時代からそれほど大きく変わってないわけだし。
DataSetの概念は少しギャップあったけど、その程度付いてけないのは?だし。

入れたアプリの耐用年数を考えるなら、環境固定するか、メンテ契約結ぶしかないだろ?
そうじゃなしに未来永劫新OS対応なんて、普通のアプリでもやってない。
492NAME IS NULL:2007/02/22(木) 18:22:12 ID:???
ちょっと不安感があったんですよね。
今はそういう流れについていけるけれど、将来はついていけなくなるのかなぁと。
Cobolで学んだ事(ループやら関数の設計やら)は、今でも生きているんだけれど、
Cobolプログラマはどうして時代についていけずに解雇される事になってしまったんだろうか。。。
と思う。
493NAME IS NULL:2007/02/22(木) 21:01:30 ID:???
Cobolの動く環境が消えていくのに、他の言語表現を学ばなかったからじゃね?
494NAME IS NULL:2007/02/22(木) 22:47:10 ID:???
コーディングの違和感から、拒否してただけと捉えてていいのかなぁ。。
495NAME IS NULL:2007/02/22(木) 23:47:39 ID:???
×拒否してただけ
○逃げていただけ
496NAME IS NULL:2007/02/23(金) 00:06:24 ID:???
なるほどね。確かに根本にある理論を捉えていれば、関数の書き方など各種構文が変わったとしても
それについて行く事は出来たはずなんだろうね。
でも、そういうところの覚え直しの面倒臭さがあり、やらなかった。それだけなのかな。

ちょうど、今の状況がそれに似ているのかもしれない。
OSがバージョンアップして、開発環境も2005になって、Offceまでインターフェースが変わった。
動作確認やら、メニュを覚えるのがめんどい、軽い環境の方がいいなどといいつづけて、
自分の使う環境をいつまでも古いままでやっていたら、XP限定の技術しかもっていない状態になる。
サポートがあるといっても、XPのみで構築するという環境は相当な無理と大幅な限定条件がのしかかって
来る事になる。これから販売されるパソコンのほとんどはVistaなのだから。
497NAME IS NULL:2007/02/23(金) 00:12:45 ID:???
新しいことを学ばない技術者なんて、(゚听)イラネ
498NAME IS NULL:2007/02/25(日) 21:56:35 ID:???
でもさ学んだ技術が2,3年で陳腐化するのは悲しくないか?
他の業界と比べて技術革新のスピードがだんちなのはわかるけど。
499NAME IS NULL:2007/02/26(月) 09:32:27 ID:???
だから、DAOの頃からADO.netで、全く一切合切何もかも変わったか?
コネクション作って・・・って全く同じだと思うが。
500NAME IS NULL:2007/02/26(月) 10:08:48 ID:???
細かい言語仕様変更のたびに、表記や手順がころころ変わるのが面倒。
せめて一世代くらいは上位互換をきちんと保って欲しい。

2005でVB6.0に擦り寄ったのは、予想外に2003が普及しなかった
からだろうしさ。
501NAME IS NULL:2007/02/26(月) 10:33:38 ID:???
このスレの93にある
複数テーブルを読み込んでデータ更新までやるサンプル
が書いてある書籍はまだないのでしょうか?
VB6でやっていたワークテーブルを使ったデータ処理がどうしても理解できません。
(顧客マスタ(参照用)、商品マスタ(参照用)、在庫数(実際更新したいテーブル)などを一覧表示して入力させ、一括更新したいのです)
DataTableのテーブルをSQLで更新などもやはり出来ないのでしょうか?
いろいろ探してみたのですが分からないため教えてください。
502NAME IS NULL:2007/02/26(月) 10:43:05 ID:???
>>501
更新したいテーブルがひとつだけなら、CommandBuilder使うなり
自力でSQL書くなりしても、言うほど手間じゃないと思うんだが。
503NAME IS NULL:2007/02/26(月) 11:01:16 ID:???
>>502
分かりにくくて申し訳ありません。
顧客ID
商品ID
在庫数
というテーブルなのですが
実際の入力は
商品 
顧客  あ い う え お
 a   □ □ □ □ □
 b   □ □ □ □ □
 c   □ □ □ □ □
 d   □ □ □ □ □

の□の部分にデータを入力させて、横並びのデータを一括更新したいのです。
今まではワークテーブルを使ってこちょこちょやっていました。
今もワークテーブルでやる処理は出来ているのですが
遅くて困っています。
全部DataTableのメモリだけで処理して速くしたいのですが。。
504NAME IS NULL:2007/02/26(月) 11:19:04 ID:???
DataTable-DataViewGridの関係と、DataTable-DBのテーブルの関係は独立。
なので、UI層はそのままつくって、DBに取り込むときにがんばればよい。
ベタに作れば?
505NAME IS NULL:2007/02/26(月) 11:27:46 ID:???
>>504
今速くしようと考えている方法ですが
1)DataViewGrid用のDataTableを作る
2) そのDataTableに複数テーブルからデータを入れる
3) 入力させる
4) DataTableを展開してデータベースを更新する。
という方法でよろしいのでしょうか?
自分がやろうとしてる方法がいいのかどうか
いい解説本が見当たらなくて・・・
506NAME IS NULL:2007/02/26(月) 12:25:25 ID:???
良し悪しは最終的に自己責任。
普通にそれでいいんじゃないの?
DataTableは単なる器と割り切って。
507NAME IS NULL:2007/02/26(月) 14:10:57 ID:???
今回のADO.NETは、updateを手書き方式にしているのは、テーブルのリレーションを
組んだ場合でも柔軟に対応出来るようにするため、自由度を高くしたみたいなことが
書かれていたけれど、それらを一発でやろうとすると複雑になっていって、機能拡張時に
バグを生む要因になったりもするので、やはり処理するテーブルはリレーションは
もたせずにしておいて、テーブルのリレーションはプログラミングのコードで
処理する上で実現するようにした方がいいかなと思った。
こういうやり方だと、DataSetを使う必要も無くなるので、テーブルを読み込む時は、
すべてDataTableを使い、テーブルの数だけDataTableを変数宣言するようにする。
そして、処理して更新する。というやりかた。

M:Cのリレーション結果のテーブルデータを受け取り、処理する。
V:ユーザの入力
C:単一テーブルをうまく読み込んで、リレーションテーブルにする。
テーブル2個分DataTableを宣言することになるのでちょっと重くはなるけれど、
拡張性的にはこれがいいと思う。
508NAME IS NULL:2007/02/26(月) 14:16:59 ID:???
複数テーブルを使った更新は、分厚いADO.NET公式解説の本か、
谷尻さんの2005にあるよ。そのまま使えるかどうかは分からないけれど。
509NAME IS NULL:2007/02/26(月) 14:24:39 ID:???
>>506,507
ありがとうございます。とりあえず作ってみようと思います。
>>508
その本両方とも持っていますが、こういう形ではなくて困っております・・・。
510NAME IS NULL:2007/02/26(月) 14:33:56 ID:???
既出だけど、このソースを買って使うという方法もあると思う。
http://www.aster-world.com/soft/adonetdb.html
このクラスで、データを読み込み、このクラスが持っているDVをグリッドに連結させる。
そしてユーザが入力して、更新する時はメソッドを実行するだけ。
(複数のテーブルを読み込んでいても、更新用のコードは自動生成される。)

この方法は、かなり手軽になるけれど、そのコードがうまく動かない時の対処が
うまく出来なくなる可能性があるという欠点がある。
511NAME IS NULL:2007/02/26(月) 14:48:10 ID:???
>>510
よさそうですね。
LightEditionでも買ってみようかなぁ・・・。
へたな本数冊かうより勉強になるかもしれないし。
512NAME IS NULL:2007/02/26(月) 17:09:15 ID:???
>>511
もしも買ったら、レビューよろw
513NAME IS NULL:2007/02/28(水) 23:55:10 ID:dj/lilwU
.NETではないほうのADOなのですが、、、

レコードセットの一部のフィールドのみを抽出して
新たなレコードセットを作りたいのですが、可能でしょうか?

ExcelのCopyFromRecordSetメソッドで
一部のフィールドのみをセルに貼り付けたいのですが。。
514NAME IS NULL:2007/03/02(金) 20:25:42 ID:G4Qfbl+H
filterかけて、それを全件ループしながら、新しくレコードセット変数を宣言したものに、
addnewしていけばいいんじゃないの?
515NAME IS NULL:2007/03/02(金) 21:41:12 ID:???
>>514
レスありがとうございます。

本日その方法で解決しました。
いままで普通にセルに貼り付けてたのですが、
この方法にして性能が10倍以上上がりました。

516NAME IS NULL:2007/03/03(土) 14:33:05 ID:QXqyM9Ns
@ITで関連した連載があったので、貼っておきます。

連載:Visual Studio 2005によるWindowsデータベース・プログラミング
http://www.atmarkit.co.jp/fdotnet/vblab/vsdbprog_01/vsdbprog_01_01.html
517NAME IS NULL:2007/03/03(土) 22:17:33 ID:???
リレーションを組んだテーブルを読み込んで、それを操作して
更新するという一連の処理において、定番と言うようなサンプルが見当たらないので、
具体的にここで作っていってみて、みんなで検討するというのをやってみると
どうかな。と思ったので、先ずは処理を行うテーブルの設計をしてみた。

<商品マスタ>
・SyouhinID:数値型、主キー
・商品名:テキスト形式
・価格:数値型

<売上>
・UriageID:数値型、主キー
・商品ID:数値型、商品マスタのIDの値が入る
・数量:数値型
・合計:数値型

すでに、方法論は、上の方に出ているけれど、コードレベルでの
具体例がないので、ここで進めていってみたいと思う。
そして、その方法のメリットとデメリットを書くみたいな。
518NAME IS NULL:2007/03/03(土) 22:22:23 ID:???
目的
・ある日の売上を登録する。

処理内容
・テーブル2つを読み込む
・データを追加する
・更新する

その他
・「商品マスタ」はあらかじめデータが入っており、それの追加は行わない。
・「売上」のテーブルにデータを追加する。
・合計値はプログラミングで計算する。
519NAME IS NULL:2007/03/03(土) 22:35:33 ID:???
<参考>
かなり大雑把だけれど、単一テーブルの場合は、以下のような流れになると思う。
・cn、da、dsを宣言
・読込みSQL:SELECT *** FROM +++ WHERE @@@
・dsにテーブルを取り込む
・ds.tables・・・でデータ追加、変更
・コマンドビルダでupdateコマンドを生成
・da.update
520NAME IS NULL:2007/03/04(日) 10:02:17 ID:Pctohaw8
合計はデータセット自身の機能に存在する。

でもって、何をしたいのか、全く伝わってこない。
何を悩んでるのかとか。
521NAME IS NULL:2007/03/04(日) 10:32:36 ID:???
cn,da1,da2,tbl1,ds1を宣言
da1:SELECT * FROM 商品マスタ → tbl1 に格納
da2:SELECT 売上.UriageID, 売上.商品ID, 商品マスタ.商品名, 商品マスタ.価格, 売上.数量, 売上.合計
FROM 商品マスタ INNER JOIN 売上 ON 商品マスタ.SyouhinID = 売上.商品ID;
→ ds1 に格納

フォーム
商品名(コンボボックス、tbl1を指定、表示:商品名、値:SyouhinID)
価格(テキストボックス、手入力不可、商品名選択時にtbl1の価格を自動表示)
数量(テキストボックス、手入力、入力時に自動計算をし、合計に値を入れる)
合計(テキストボックス、手入力不可)
追加ボタン(コマンドボタン、ds1にデータを追加する)

一覧(グリッド)
ds1の以下のデータを一覧表示する。
商品マスタ.商品名, 商品マスタ.価格, 売上.数量, 売上.合計

更新ボタン(コマンドボタン、update文を生成し、実行)
以下の2ケースにおいてupdate文をどう書けばよいのかが分からない
・後で更新ボタンを押したほうが常に上書きとなる形
・先にデータを表示した方のみが更新を出来る形
522NAME IS NULL:2007/03/04(日) 10:40:09 ID:???
>>520
定番となる読み込みから更新までの処理の流れを知りたいのです。
書籍には部分的には詳しく書かれているけれど、それを組み合わせた
使い方のイメージがいまいちつかめないのです。
ま、ADO.NETそのものが自由度を高くしていて、どんな組み方でもOKですよ。
ということなんでしょうけど、システムを組む上で共通することが多い事項
を盛り込んだ処理の流れのサンプルがほしいのです。

とにかく軽くすることにこだわったとか、インターフェースを特殊なものに対応
させるために、テーブルの読み方を変えたとか、そういう特殊なケースを別と
考えた場合です。

谷尻さんのVB2005の書籍のp126のコードを、複数テーブルを読み込んだ
場合に拡張したサンプルがほしいのです。
523NAME IS NULL:2007/03/04(日) 11:22:35 ID:Pctohaw8
何でも前例主義は良くない、少しは自分で考えろ。

DataTable間のリレーションは制約設定を作れば、外部参照整合にもなるし、単なるオブジェクトの連携にもなる。

合計は取れる。

親Rowから子Rowは取れる。

DataAdapterとDataTableの関係を1;1に考えれば、更新にAdapterを使えなくも無い。
ただ、このスレで散々書かれているが、Adapterの更新はおまけ程度で実務じゃ使えないってのが大勢。
524NAME IS NULL:2007/03/04(日) 14:09:21 ID:???
>>523
> DataAdapterとDataTableの関係を1;1に考えれば、更新にAdapterを使えなくも無い。
> ただ、このスレで散々書かれているが、Adapterの更新はおまけ程度で実務じゃ使えないってのが大勢。
ここでいうAdapterは、「コマンドビルダーにて自動生成されたupdateコマンド」の事なのでしょうか。
それとも、本当に(読取り時以外)更新時にはDataAdapterを一切使用せず、ExcuteNonQueryのみでやるという意味なのでしょうか。?
525NAME IS NULL:2007/03/04(日) 14:23:09 ID:???
そのドキュメントが見つからないわけではないが、トランザクションについての
解説は少ないね。>>2で紹介されているところにも書いていないし、>>456で紹介されている
書籍にも書かれていない。
トランザクション指定なしにda.updateするのもある程度は大丈夫だろうが、
DBをやる上で必須だと思うのだが。
526NAME IS NULL:2007/03/04(日) 14:49:06 ID:Pctohaw8
>>524
その通り。勝手に作られるSQLで更新する気にならない。
つうか、勝手に作るSQLは楽観的ロックの処理部分で非常に無駄というか複雑なことになってる。

>>525
全く言ってる意味がわからない。
トランザクション指定の有無なんて、ADOが出来るとか以前に仕様で決まってることだろ?
ある程度大丈夫って何?そんないい加減なトランザクション処理の仕様って存在するの?
527NAME IS NULL:2007/03/04(日) 15:02:17 ID:???
コマンドビルダーって、パフォーマンスが悪いって書いてあるね。
一度仮環境で実行して、その文字列を取得し、それを参考に手で書き換えて、
DataAdapter.UpdateCommandとかに指定するのがいいのかな。
528NAME IS NULL:2007/03/04(日) 15:09:37 ID:???
そんなのするぐらいなら、普通にSQL文をExecuteNonQueryでやりゃーいいじゃん。w
なぜAdapterにそこまで固執する?

それを参考に手で書き換えてる手間と、SQL文を作成する部分を書く手間、変わらないだろ?
529NAME IS NULL:2007/03/04(日) 16:55:52 ID:???
>>522
暇つぶしにサンプル作ってみた。
ttp://www.uploda.net/cgi/uploader4/index.php?dlpas_id=0000010583.zip
初めてC#使ってみたんで色々アレなのはご愛嬌。(普段はVB厨)

>>527
デザイナからDataAdapter(2.0だとTableAdapterか)放り込んで
必要なクエリそのまま書けば良いじゃない。。。
CommandBuilder使う機会ってあんまり無くね?
530NAME IS NULL:2007/03/04(日) 17:04:54 ID:???
須藤くん、乙
531NAME IS NULL:2007/03/04(日) 17:08:22 ID:???
>>530
あー…実名消し忘れw
知り合いがここ見てることは無いと思うけどさ。
532NAME IS NULL:2007/03/05(月) 00:08:59 ID:???
質問です。

データグリッドの各セルにクリックをするだけで、データの入力が出来る
仕様にしたいと思っています。入力するデータは、トグルボタンなどで
指定した記号ですが、データベース上では、その記号は正規化されています。
テーブルは以下のような構成です。
文字列テーブル:ID(数値型), 記号(文字列型)
データ一覧テーブル:ID(数値型), a(数値型), b(数値型), c(数値型)

このようなアプリを作る場合のDataSetなどの設計について質問なのですが、
この場合はグリッド連結用に別にDataSetを準備し、データベースとのやり取りの時は、
別テーブルとのデータのやり取りをプログラミングするしかないのでしょうか。
グリッドにコンボボックスを連結させる方法だと、選択矢印表示のために
スペースをとりますが、そこまで画面が足りないのです。。。
なるべくなら、無駄にDataTableを宣言したり内容をコピーしたりする処理は
行いたくないのですが。。。

<データベース>
文字列テーブル
データ一覧テーブル

<フォームで、データ読み込み時の処理>
文字列テーブルと、データ一覧テーブルをDataAdapter1とDataAdapter2で
DataTable1とDataTable2に格納。
グリッド連結用テーブルをDataTable3として宣言し、DataTable1を
全件ループしながら必要なデータをDataTable3にコピーする。

DataTable3:ID(数値型), a(文字列型), b(文字列型), c(文字列型)

<フォームで、データ更新時の処理>
DataTable3からDataTable2へ文字列を数値に変換しながら上書きする。
DataAdapter2にてupdateを行う。
(DataTable1は、マスタのため、このフォームでは変更を行わない)

<グリッドの処理>
DataTable3が連結されている。
各セルをクリックした際、そのセルに今の状態の文字列が入力される。
533NAME IS NULL:2007/03/05(月) 00:56:46 ID:???
C#のサンプルかぁ。状況的にで開けないわけではないけれど、VBしかない環境だから、
一旦ExpressのでかいファイルをDLする必要があるな。。。こういう時、不便だよね。
VBとC#はコードとかほとんど同じであるにも拘らず、開けないとかは。。。
534NAME IS NULL:2007/03/05(月) 10:23:15 ID:???
>>532
コンボボックスの使用は諦めたけど、
コンボボックスの表示項目にするつもりだったフィールドを
直接入力するという認識でOK?
2.0のDataGridViewなら、CellParsingとCellFormattingが使える。
1.1のDataGridだと…適当な方法が思いつかない。
バインドするDataTableに表示する文字列(これをDataGridにバインド)と
ID(非バインド)を両方持っておき、DataTableのColumnChangedイベントの中で
変更対象列が表示名の列だったときにIDを自動設定するぐらいか。
(文章わかりにくくてスマソ)

>>533
VBの方が良いなら、次からそうするわ。
535NAME IS NULL:2007/03/05(月) 10:54:03 ID:???
>>534
> コンボボックスの表示項目にするつもりだったフィールドを
> 直接入力するという認識でOK?
そういう認識でOKです。
DataGridViewを使用しての実現でも結構です。
早速、アドバイスされていた内容でうまく実現できるかを
確認してみます。ありがとうございます。
536NAME IS NULL:2007/03/05(月) 11:33:10 ID:???
>>534
今回からやりなさいw
537NAME IS NULL:2007/03/05(月) 11:46:51 ID:???
データグリッドに、表記データと、実データを別々にする機能はないので、
それを実現するには、各種イベントを使ってコーディングするしかない
ってことなんだね。
うまく目的の機能になるようにコーディングをしたりするのは、時間が
かかるのと、バグを生みやすい構造になるわけか。
なので、以下の二択ってことになるのかな。

・データ入力時のコーディングのシンプルさを持たせる代わりに、
二つのテーブルのデータのやり取りの部分のコーディングを行い、
さらに、余分にテーブルひとつ分のリソースを消費する。

・テーブルひとつ分のリソースをケチる代わりに、
DataGridViewのコーディングが複雑になる。この場合、効率性も
考えなければ、データ入力時の処理が重くなる可能性もある。
一度組んでそれで終わりならばそれで良いが、拡張させるとなると
概要把握などに時間がかかり、バグを生む可能性もある。

だいぶ整理がついてきました。ありがとうございます。
538NAME IS NULL:2007/03/05(月) 12:13:26 ID:???
DataAdapter によるデータ ソースの更新
http://msdn2.microsoft.com/ja-jp/library/33y2221y(VS.80).aspx
一番下のところ「挿入、更新、削除の順序」の解説文章って、
自分が思うように自由に制御できることをアピールしているって
ことなのかな。それとも、updateした時は、内部的にどんな風に
動いているかわからないから、内容は保障しません。
なので、このようにコーディングしてくださいっていいたいのかな。

本気で分からない。
539NAME IS NULL:2007/03/05(月) 12:25:46 ID:???
そんなグレーなものを使わずに、自分で更新しなさいってこと。
540NAME IS NULL:2007/03/05(月) 12:56:24 ID:???
>>537
考え方を変えると、それほど複雑ではないかも。

例えば、ボタン押下時に内容をDataTableに反映させるとして
Clickイベント内でエラーチェックをするか、
それとも、エラーチェックはValidationイベントでやるのかといった感じかな。
このイベントだからこの処理をする・・・と線引きするとわかりやすいかもしれないです。

>>538
DataRowの状態(Added, Deleted, Modified, UnChanged)によって
それぞれの行データを利用した(INSERT, DELETE, UPDATE, 何もしない)コマンドが実行されますよと。
DataTableをUpdateメソッドに渡すと、全行に対して行状態チェック->コマンド実行
DataRow()をUpdateメソッドに渡すと、その行に対して行状態チェック->コマンド実行
 -> Select文で行状態を絞ってUpdateに渡せば、挿入のみ、更新のみ、削除のみといった実行も出来ると。

>>536
(゚Д゚)ノアイ
帰宅したら書き直しますね。
541NAME IS NULL:2007/03/05(月) 13:03:11 ID:???
>>540
> このイベントだからこの処理をする・・・と線引きするとわかりやすいかもしれないです
イベントごとに処理内容を分けていくわけですか。
それだと整理されてて、何か不具合が起きたときなどの対処が
やりやすくなりそうですね。
アドバイスありがとうございます。
542NAME IS NULL:2007/03/05(月) 13:23:27 ID:???
>>540
> DataTableをUpdateメソッドに渡すと、全行に対して行状態チェック->コマンド実行
> DataRow()をUpdateメソッドに渡すと、その行に対して行状態チェック->コマンド実行
>  -> Select文で行状態を絞ってUpdateに渡せば、挿入のみ、更新のみ、削除のみといった実行も出来ると。
この解説文章読んでみて、やっと意味が分かりました。
ありがとう。

MSDNって解説が簡易すぎたり、説明の言い回しが分かりにくく感じますよね。
543NAME IS NULL:2007/03/05(月) 13:33:24 ID:???
>>540
> (゚Д゚)ノアイ
> 帰宅したら書き直しますね。
C#よりもVBの方が需要が高いと思うし、やっぱりサンプル配布
としては両方あったほうがいいと思います。
Tips系のサイトがそうなっているので。

時間がかかってもいいのでよろしくお願いいたします。

zipファイルに、readme.txtをつけて再配布OKの記述を入れておくと
多くの人に喜ばれるかもしれない。
544NAME IS NULL:2007/03/05(月) 15:45:22 ID:???
サンプルプログラムは、今回のものとは別に、
もうひとつ更新を行うテーブルを準備して、
トランザクションの設定を行って更新をする過程とか
あるといいかもしれないね。
(後でテーブル設計やデータの操作の構成を考えておきます)
他にどんなものがあると便利かな?

たくさんのノウハウが詰め込まれた、大量のコードの
サンプルもいいけれど、シンプルで目的別に作られている
サンプルも、勉強する人にとっては非常に便利でありがたい
と思います。

ま、確かに、何でも前例主義は良くないというのも分かるけれど、
仕事をしている人は、早く物を作れるようになる必要があるわけで、
最初は理論は別として作り方の一連の方法を体得した後、
OJT方式で深いところを学んでいく方法もありだと思う。
545NAME IS NULL:2007/03/05(月) 16:24:56 ID:???
つうか、その程度のサンプル必要か?w
@ITとか、MSのサイトとか、MSDNをきちんと見れば落ちてるし。
546NAME IS NULL:2007/03/05(月) 17:23:04 ID:???
>>545
そう言ってしまうと身も蓋も無い罠。
スレタイの半分が無意味になってまうw
547NAME IS NULL:2007/03/05(月) 18:20:14 ID:???
>>545
そういうところに落ちているサンプルって、デザイナやウィザードを
使ってはい終わりって感じのものだろ?
すべてコーディングで実現しているサンプルってないと思うが。
コーディングのサンプルは、かなり狭い範囲のものばかりだ。

応用を考えたサンプルは、デザイナやウィザードをつかわずに
コーディングで実現しているものじゃないかなぁ。
548NAME IS NULL:2007/03/05(月) 18:23:23 ID:???
>>545
各種目的別にサンプルを作っていって、そのサンプルの
メリットとデメリットをまとめていくようなイメージなんだけどね。

DataAdapterにて単一テーブルを読み込む方式ならば、
リレーションをコーディングする必要があるが、
それを文章で一言で終わりにするんじゃなくて、
具体的なコードの確認が出来るようにする、みたいな。
549NAME IS NULL:2007/03/05(月) 22:49:40 ID:???
>>543
ttp://briefcase.yahoo.co.jp/bc/apollo_bassjp/lst?.dir=/a1e0
Sample1_vb.zip

>>547
デザイナ無しか…動作を理解するのには良いよね。
実際の業務でコピペして使われると悲しいけど。
(デザイナ使ってくれた方が見通しが良いことがある気がする。)
550NAME IS NULL:2007/03/05(月) 23:37:04 ID:???
>>549
サンプル乙。わざわざうpしてくれてありがとう。
デザイナ無しの方がというのは、私の個人的な意見でしかない。
必ずしもデザイナを使うのが良くないというわけでもないので、
メリットとデメリットを具体例をまじえて書いて行くと、
プログラマの参考資料として出来上がって行くんじゃないかなと思う。

自分が作ったものが、業務でコピペして使われるというのが嫌な気持ちも
分かるけれど、Tips系サイトみたいに、「VBで○○をやるには?」みたいに、
大量のサンプルをみんなで考えて出し合う流れが出来ればいいんだけどね、と思う。

VBやAccessのインターフェースに関するTipsは大量にあるけれど、
データベースのノウハウについてはTipsがあまりないので、
自分の設計に不安があることもしばしばだ。しかし、相談してみても、
それぞれっていわれてしまい、あまりしっくりこない。
そういうものを解決出来る流れがあればなと感じている。
551NAME IS NULL:2007/03/06(火) 00:05:41 ID:???
>>550
あぁ、誤解させてごめん。
コピペされるのが嫌ってのは、新人なんかが動けば良いやって感じで
サンプルの内容を理解せずにコピペして使うってこと。

自分とこの新人がハマった例をネタとして投下。

Using trans As New TransactionScope
TableAdapter.Update(DataTable)
End Usint

※DataTableに2件以上のデータが入っているときエラー

これもMSDNが不親切な例だね。。。
552NAME IS NULL:2007/03/06(火) 00:07:37 ID:???
@ITとかでは、質問をしたりするところがあるが、そういうところは
いまいちノウハウが保存されて活かされてないようなところがある。
それをサンプルコードにして保存しておくと言う考え方。

最初は、サンプルを出すプログラマは、ROMが大量にいるため、
出し惜しみをすると思うが、みんなで意見をだしあう関係になれば、
サンプルを出すプログラマは、自分の設計で気付かなかったところを
添削してくれるというメリットを思い、出すようになると思う。

ま、いきなりこのような流れを作るのは難しいんだろうけれど。
553NAME IS NULL:2007/03/06(火) 00:32:52 ID:???
ADO→ADO.NETの移項について私なりに感じた事をちょっと。

ADOであまり深い事を考えずにrecordsetにテーブルを読み込んで、テーブルの処理をして、
updateを実行するコードを書いていた人にとっては、ADO.NETのupdateは面倒に感じるし、
勉強するのに時間がかかるようだ。
一方で、以前からExecuteNonQueryを使ってこまかく同時アクセスの制御やトランザクションの
設定をするコーディングをしていた人にとっては、「DataAdapterなんて使えないから以前と同じ
スタイルでするしかないな」と判断するので、ADO.NETでのコーディングへはスムーズに移項出来るようだ。
554NAME IS NULL:2007/03/06(火) 08:18:19 ID:???
DataAdapterは、ディフォルトでトランザクションの設定をしていないので、
任意に各commandのトランザクションを設定するコードを書く必要があるというのは、
何か意図があってのことなのかなぁ。分からない。
555NAME IS NULL:2007/03/06(火) 09:31:58 ID:???
>>554
.NET 2.0からはSystem.Transactionをつかえということのようだ。
これの問題は分散トランザクションへの昇格が簡単に置き過ぎる点。
556NAME IS NULL:2007/03/06(火) 09:33:43 ID:???
>>554
分散システム、2フェーズコミット対応。
1.1から2.0への変更点のコラムとかきちんと読むと載ってるよ。

まあ、つかわないけど。

つうか、ADO.netをそのまま使うの?皆さんは?
普通、薄い自作クラスでラップして管理するもんじゃないの?

あと、サンプル云々も、そんなもの数パターンの定型があれば、あとは業務毎の細かい部分だから使えん。
自分で必要なものをクラス化して、スニペットにお約束を書けば、二度とそんなサンプルなんてみない。
557NAME IS NULL:2007/03/06(火) 09:39:41 ID:???
トランザクションはあくまでCommandに設定するもの、
DataAdapteはCommandを自動で振り分けて実行するもの…って感じかな。

2.0だと、TransactionScopeがそのへん改善してくれてるね。
558NAME IS NULL:2007/03/06(火) 09:48:09 ID:???
>>555
>>551で書いたのが勝手に昇格起きてる例だね。
#2つ以上の接続を開くと、分散トランザクションに昇格する。
#Updateメソッドのリファレンスには書いてない(少なくとも日本語リファレンスには)けど、
#接続閉じた状態でUpdateを実行すると、Command実行の度にOpenとCloseを繰り返す罠。

で…手動で開いておくと、勝手に閉じないので昇格しない。
複数のAdapterを利用するときは、同じConnectionのインスタンスを参照するようにして同上。
559NAME IS NULL:2007/03/06(火) 09:54:54 ID:???
開いた閉じたもプール設定によってはどうでも良いこと。
というか、.netになってからプール前提で処理機能単位でのOpen-Closeに変えた。
VB6のころのアプリ全体でグローバルでConnectionより、モジュールの独立性、再利用性が高まる。

560NAME IS NULL:2007/03/06(火) 10:11:51 ID:???
>#2つ以上の接続を開くと、分散トランザクションに昇格する。 
この部分の動きがすごく変で、TransactionScope内で
open open close close と接続と閉じるがネストしたときだけでなくて、
open close open closeといったん閉じてまた開いた場合も昇格してしまう。
561NAME IS NULL:2007/03/06(火) 11:15:56 ID:???
>>560
Transactionオブジェクトは接続をまたいで利用できるもの?
…と考えるとすっきりするかも。

open close open closeで昇格させないとすると、
↓のような動きになってしまうんじゃ?

connection.open
transaction = connection.BeginTransaction
command.ExecuteNonQuery
connection.close
・・・
connection.open
command.ExecuteNonQuery
transaction.commit
connection.close
562NAME IS NULL:2007/03/06(火) 11:50:55 ID:???
>>555-557
解説ありがとうございます。ADO.NETの黄色の分厚い公式解説書を
読んでいて、どうもわからなかったのです。
早速文献を調べてみて、それと思われるサイトをみかけましたので、
一応貼っておきます。

.NET Framework 2.0 の System.Transactions について
http://www.microsoft.com/japan/msdn/net/general/introsystemtransact.aspx
563NAME IS NULL:2007/03/06(火) 13:07:08 ID:???
564NAME IS NULL:2007/03/06(火) 13:50:38 ID:???
基本的な質問で申し訳ないが、分散トランザクションへの昇格が
おきてしまったらどんなことが問題なの?
565NAME IS NULL:2007/03/06(火) 14:43:37 ID:???
更新を行う方法サンプル(案)
・スタンドアロンの場合
・同時アクセスが比較的少ない場合(常に上書き)
・同時アクセスが非常に多い場合(先に更新したほうが優先)

<内容>
基本情報、取得資格、性別マスタ、資格マスタの4テーブルがあり、
基本情報と、取得資格テーブルを更新する。
(詳細は後日書きます。)

書籍は、更新の方法は載せていても、目的別には載せていないので、
このようなまとめ方は意味があると思う。
内部を理解していなくても、とりあえず組む必要がある場合や、
これから勉強する人がとりあえず動くプログラムを見たい場合に使えると思う。
566NAME IS NULL:2007/03/06(火) 14:55:33 ID:???
>>564
トランザクション処理が重くなる。
上の例のUpdateメソッドで分散に昇格した日には、かなりコワいことになる。
更新レコード数にもよるけど。

分散トランザクション使うためには、
後ろで必要なサービスが起動してなきゃならないってのもある。
567NAME IS NULL:2007/03/06(火) 15:03:30 ID:???
スタンドアロンの場合
・デザイナを使って構築して、updateする。

同時アクセスが比較的少ない場合(常に上書き)
・デザイナを使わずにコードで主キーを基準にupdateする。
 トランザクションは用いない。DataAdapterを用いる。
・シンプルさを持たせるために、DataAdapterはひとつのテーブルを
 読み取り、更新を行う。リレーションはコードで実現

同時アクセスが非常に多い場合(先に更新したほうが優先)
・コードで、主キーとタイムスタンプを基準にupdateする。
 トランザクションを設定する。ExecuteNonQueryを用いる。

※基本的にコマンドビルダは使わない。

細かいケースを考えていくときりがないけれど、そういったものは、
無視で、王道となるサンプルを作っておき、あとは解説文章を
つけるという感じでどうかな。
568NAME IS NULL:2007/03/06(火) 15:33:06 ID:???
>>566
ありがとうございます。
569NAME IS NULL:2007/03/06(火) 16:14:40 ID:???
データを取得し、フォーム上に表示する(案)
・DataReaderで取得する
・各テーブルを単一で読み込んで表示する。
 (DataAdapterは、テーブルの数だけ宣言する)
 リレーションはコードで実現したり、
 リレーションオブジェクトを宣言して設定する。
・リレーションを組んだSQL文で読取り、表示する。
570NAME IS NULL:2007/03/06(火) 18:47:58 ID:???
サンプルを作る事に批判的な意見もあったけれど、
こういう項目別にサンプルを作るのって意味がないのかなぁ?
571NAME IS NULL:2007/03/07(水) 20:22:40 ID:???
System.Transactionがすぐに昇格して使えないと言う事であれば、
やはり、自分で更新用のSQL文を書くしかないって事なのかな。
その場合、汎用性のある書き方はどうなるんだろうか。
スキーマを読み込んでテーブル名、フィールド名、主キーを取得し、
自動で更新用コードを生成するクラスを定義したとしても、処理が重くなりますよね。
572NAME IS NULL:2007/03/07(水) 20:26:38 ID:???
サンプル用テーブル構成

基本情報
・KihonID(主キー、数値)
・氏名(文字列)
・性別(数値)

取得資格
・ShikakuID(主キー、数値)
・KihonID(数値)
・取得日付(日付)
・取得資格(数値)

性別マスタ
・SeibetsuID(主キー、数値)
・性別(文字列)

資格マスタ
・ShikakuID(主キー、数値)
・資格(文字列)
573NAME IS NULL:2007/03/07(水) 20:31:58 ID:???
サンプル用フォーム構成

ID(TextBox、変更不可)
氏名(TextBox、変更可能)
性別(ComboBox、変更可能)

取得資格一覧(DataGridView、IDは非表示、取得日付はダイレクトに変更可能、
  取得資格はコンボボックス)

[読取り]ボタン:データベースからデータを読み取る。
[更 新]ボタン:変更内容をデータベースへ反映する。
[次 に]ボタン:基本情報のIDで次の人を表示する。
[前 に]ボタン:基本情報のIDで前の人を表示する。
574NAME IS NULL:2007/03/08(木) 00:05:52 ID:???
再利用性の高い更新を行うためのクラス設計を考えてみた。
この3つがあれば、大抵の事は事足りそうな気がするけれど、どうかな。
・DataRowを1つ受け取り、updateを行う。
・DataRowを1つ受け取り、insertを行う。
・DataRowを1つ受け取り、deleteを行う。
・DataTableを1つ受け取り、updateのみを行う。
・DataTableを複数受け取り、update, insert, delete を行う。

マスタの操作は、上の3つを使用する。
マスタ以外のものは、下の2つを使用する。
575NAME IS NULL:2007/03/08(木) 07:47:45 ID:???
なんか間違えてるな。正しくは、
マスタの操作は、1、2を使用する。
それ以外の操作は、2、3、4、5を使用する。
576NAME IS NULL:2007/03/08(木) 10:40:11 ID:???
トランザクションの実行について質問です。
ADO.NETのトランザクションオブジェクトを使用してトランザクションを
実行すれば、データベースが MS SQL Server でなくとも実行出来るけれど、
データベースがMS SQL Server限定ということであれば、Transact-SQLを
用いて実行した方が処理速度は早いという解釈で宜しいのでしょうか。

ADO.NET によるトランザクションの実行
http://msdn.microsoft.com/library/ja/default.asp?url=/library/ja/cpguide/html/cpconperformingtransactionusingadonet.asp

Transact-SQL リファレンス「トランザクション」
http://msdn.microsoft.com/library/ja/default.asp?url=/library/ja/tsqlref/ts_ra-rz_471q.asp

基本的なことで申し訳ありませんが、お願いいたします。
577NAME IS NULL:2007/03/08(木) 10:59:02 ID:???
>>576
Connection.BeginTransactionと比較するなら処理速度は変わらない。
578NAME IS NULL:2007/03/08(木) 13:14:17 ID:???
>>577
ありがとうございます。
ならば、ADO.NETでプログラムする場合は、Transacto-SQLで
トランザクションのコードを書く必要性は無いと考えてよさそうですね。
579NAME IS NULL:2007/03/08(木) 16:11:41 ID:???
文献やこのスレの過去ログを読んでみての確認なのですが、
分散トランザクションをするという場合は、EnlistDistributedTransactionを使う方が、
System.Transactionよりも軽く、意図しない昇格がおきることことも無いので
便利だということですよね?基本的なことばかりですみません。
580NAME IS NULL:2007/03/08(木) 20:08:03 ID:???
>>579
それは分散トランザクションを使わないなら全く必要ないもの。
分散トランザクションを使う前提なら暗黙で参加させるべきで、
手動でどうしても参加させざる得ない場合を除いて使うべきではない。
どこの資料を見てそう思ったのか知りたい。
581NAME IS NULL:2007/03/08(木) 22:50:44 ID:???
>>580
>>554以降と、MSDNを読んで思いました。

ちょっと整理しますと、以下のようになると思います。
・一つのデータベースの一つのテーブルを更新する場合
→トランザクション設定は必要ない。
・一つのデータベースの複数のテーブルを更新する場合
→Connection.BeginTransactionを用いてトランザクションを設定する。
  System.Transactionは、分散トランザクションに昇格するので使うのはあまり良くない。
・複数のデータベースへアクセスし、それぞれを更新する場合
→分散トランザクションを設定する。(ここのやり方がよく分かりません。)
582NAME IS NULL:2007/03/08(木) 23:47:24 ID:???
ひょっとして、複数データベースへの更新の場合は、多少処理が重くなったり、
使いにくいと感じる部分を我慢してでもSystem.Transactionを使うしか他に方法が無いということかな。。。
583NAME IS NULL:2007/03/09(金) 08:58:38 ID:???
>>582
分散トランザクションを使用する場合には必要なコストでそれについては問題はなくて、
分散トランザクションが不要なケースでも意図せず分散トランザクションが
使われてしまうことが問題という話だよ。
584NAME IS NULL:2007/03/09(金) 11:48:50 ID:???
>>583
わからんちんへの説明をありがとうございました。
585NAME IS NULL:2007/03/09(金) 14:11:15 ID:???
このスレを読んでいると、みんな「DataAdapterのupdateは使えない。
Commandでやらないと処理内容が見えないで気持ち悪い」という
意見が大多数だけど、ADOの時からそういうスタイルだったのですか?
(recordset.updateは使わないというスタイル)
私はまだこの世界に入って間もなくて、ADOはちょっとかじっただけで、
ADO.NETから本格的にやっていこう、という物なので、ちょっと
気になって聞いてみたくなりました。
586NAME IS NULL:2007/03/10(土) 07:29:19 ID:???
>>585
DataAdapterのUpdate()とRecordsetのUpdate()って全然別物でしょ。

RecordsetのUpdate()はモードにもよるが、サーバーカーソルを
使っての位置決め更新(SQLで書くと「UPDATE 〜 WHERE CURRENT OF カーソル」)
に相当する。テーブルをスキャンしながらレコードを更新したいような
仕事にはこれが適当であることが多かった。ストアドプロシジャで
書くなら、まずこう書くだろう、という書き方だ。

DataAdapterの場合はサーバーカーソルを使わない。
普通にUPDATE文なりなんなりを投げるだけだ。つまり、更新時に
再検索が発生してしまう。
残念ながらADO.NETはサーバーカーソルに対応していないようだ。

あまりにIDE任せなのが気持ち悪ければ、Visual StudioのIDEが
自動生成するSQL(InsertCommandだのUpdateCommandだののプロパティ)を
見てみればよい。
Optimisticな排他制御をエミュレートするための、ややキモいSQLに
なっていることが分かるだろうが、嫌なら自分でプロパティを編集すればよいし、
DataAdapterの〜Commandに明示的にTransactionを設定することもできるし、
SelectCommandのSQLに明示的にUPDLOCKヒントを与えてやっても良い。

ただし、そこまでやるなら、自分で明示的にコマンドを組み立てるのと、
労力は変わらないだろうが……
ま「分かってやっているなら」何も問題はないと思うよ。
587NAME IS NULL:2007/03/10(土) 17:22:27 ID:???
>>586
なるほど。内部の動きや理論をしっかりと理解出来ているのが大事なんですね。
「正しい使い方を行っている」よりも、「内部をしっかりと理解している」という感じでしょうか。
ありがとうございます。勉強になりました。
588NAME IS NULL:2007/03/10(土) 19:35:00 ID:???
CommandがSQLの結果をDataTableに格納する機能を持っていたら、ADO.NET開発の意図に反して、
DataAdapterを使う人が極端に少なくなるのかなw
589NAME IS NULL:2007/03/10(土) 21:56:09 ID:???
>>588
というか、DataTableやDataViewでなくとも〜DataReaderを
データソースとして扱えるので、本当にDataTableが必要なケースというのは
実は結構少ないのではないかと思える。

自分でCommand組み立てる式の人は、DataTabe要らないんじゃないの。
590NAME IS NULL:2007/03/10(土) 23:28:06 ID:???
ちょっと質問よろしいでしょうか
みなさんは、同時実行制御において、更新時に「他ユーザによるデータの変更」を
確認する場合はどのようにしているのでしょうか。
(「ネットワークなどハード的な障害」との区別をつける必要があると思います。)

私なりに調べてみたものを書いておきます。
●MSDNに載っていた方法
→DataAdapterにてupdateし、例外:DBConcurrencyExceptionの時は
他ユーザによる変更とみなす。
http://msdn.microsoft.com/library/ja/default.asp?url=/library/ja/vbcon/html/vboridataupdatesconcurrency.asp
●あるサイトに書かれていた方法
→更新直前に別にConnectionを開いてデータが変わっていないかを確認し、
 データが変わっていなければ、DataAdapter.Update()を実行する。

これらの方法は、使えないわけではないと思いますが、処理が重くなったり、
無駄にコードが長くなったりしていて、開発としての効率があまり
良くないように思えて、いまいちしっくりときませんでした。

特に、update時にDataAdapterを使わずにCommandを使用する方の意見を伺ってみたいです。
Commandの場合は、ネットワーク障害時に例外:InvalidOperationExceptionが
出るのみなので、他ユーザによる変更を調べるには何か工夫が必要だと思います。
お願いします。
591NAME IS NULL:2007/03/10(土) 23:57:43 ID:???
>>589
となると、DataSetとDataAdapterの使用は、ほとんど無いとw

DataSetを使うのは、テーブルを複数読み込ませて、それらをリレーションオブジェクトで
つないで、親子でデータを取りながら、その一覧を出す必要がある場合など、
限られたケースしか思い浮かばない。

会社の各部署の社員一覧(兼務を含む)
事務部
・Aさん
・Bさん
総務部
・Bさん
・Cさん
592NAME IS NULL:2007/03/12(月) 13:29:27 ID:???
>>486
亀レスだけど。

> 早ければ C# 3.0 の時代から。「使えなくなる」わけじゃなくて、「使う意味がなくなる」
> ってことだけど。
それはLINQのことですか?
これはローカルに取り込んだデータの抽出方法のコードの書き方が
2次元配列であろうとDataTableであろうと同じものになる、
ということであって、データベースサーバからデータの取り込みの
手順に関するものではないので、DataAdapterやDataSetを使うかどうかには
影響しないと思うのですが。。。
593NAME IS NULL:2007/03/12(月) 20:27:17 ID:???
>>592
DLINQ について調べてみてね。
594NAME IS NULL:2007/03/12(月) 22:35:22 ID:???
>>593
サンクス。調べてみます。

「ADO.NETは使えるて、LINQは重いからCommandオブジェクト使うスタイルでやるぜ」みたいな
人も結構出てきそうな気もする。。
595NAME IS NULL:2007/03/13(火) 00:56:46 ID:???
LINQって、C言語(構造化プログラミング)に対する、C++(オブジェクト指向プログラミング)
みたいな存在なわけでしょ。高速化をするのであれば、Cを使った方がということになるが、
そんなに速度を気にしないのであれば、C++を組む方が将来のメンテナンスや、分業して
システムを組む場合に効率が良いという話だと思う。
596NAME IS NULL:2007/03/13(火) 12:58:52 ID:???
>>589
> というか、DataTableやDataViewでなくとも〜DataReaderを
> データソースとして扱えるので、本当にDataTableが必要なケースというのは
> 実は結構少ないのではないかと思える。
コンボボックスなどにはデータソースとして指定できませんよね?
DataReaderで取得したデータをコンボボックスやリストボックスに表示する際は、
ArrayListを宣言して、値を代入して、ValueMember や DisplayMember に代入する
過程が必要になるので、DataTableにデータを取り込んだ方がコードが少なくて
楽になると思う。(処理速度やメモリの量もさほど変わらないと思う。)


> 自分でCommand組み立てる式の人は、DataTabe要らないんじゃないの。
DataGridViewなんかをフォームに貼り付ける機会はあまりないけれど、
リストボックスやコンボボックスは必ずあるので、DataTableを使う機会は
あると思うけどなぁ。
597NAME IS NULL:2007/03/13(火) 14:04:30 ID:???
VB.NETでプログラムするとき、
SqlCommandのパラメータとして意図的にNULLを設定したいときは
どのように記述すればいいのでしょうか?

SqlCommand.Parameters("@hoge").Value=Nothing

だとおこられます。
598NAME IS NULL:2007/03/13(火) 14:05:34 ID:???
コンボに値を入れるためにはDataSetは仕掛けが大きすぎるだろ?
それこそArrayListとかの普通の集合で済むならそれでよい。
599NAME IS NULL:2007/03/13(火) 14:07:10 ID:???
>>597
System.DBNull.Valueは?(ValueじゃなくてNULLValueか何か、DBNullの値っていうやつがいるはず)

600597:2007/03/13(火) 14:38:31 ID:???
>>599
System.DBNull.Value でいけました。
ありがとうございました。
601NAME IS NULL:2007/03/13(火) 16:34:41 ID:???
>>589
> DataTableやDataViewでなくとも〜DataReaderを
> データソースとして扱える

これ、知らないので教えてほしいのですが、

Dim dr as DataReader = cmd.ExecuteReader()
DataGridView1.DataSource=dr

とかできるってことでしょうか?自分でやってみたのですが、何も表示されませんでした。
cmdにセットしているSQL文がレコードを出力することは確認しています。
602NAME IS NULL:2007/03/13(火) 16:36:12 ID:???
「トランザクションは既に開始してます」とのエラーで落ちてしまいます。

コネクト

begin
Update
Commit

begin
Insert
Commit

クローズ

って流れの場合、まずいのでしょうか?
603NAME IS NULL:2007/03/14(水) 00:10:19 ID:???
>>601
俺は589ではないが、DataGridViewを貼り付けてそれにデータソースを指定する機会が
少ないから、それは対象外としているという意味だと思う。

DataGridViewのDataSourceは、DataTableを指定しないとエラーが出る。
そもそもDataReaderは読取り&一方通行のオブジェクトなので、
ユーザが全体データを確認したり、変更したりするものとして使うようにするには、
それなりにデータを加工するコードを書く必要がある。
604589:2007/03/14(水) 00:52:42 ID:???
あー下手なこと書いて混乱させちまったかな。ごめん。
ASP.NETのWebControlの場合は、SqlDataReaderなりをDataSourceと
扱えるのよ。それを念頭に置いていた。

リッチクライアントと違って、データソースとコントロールとユーザアクション
がASP.NETでは疎結合だからそうできるんだろうけど。

確かにリッチクライアントの場合はバックグラウンドのメモリイメージとして
DataTableやDataViewを使うことになるだろうね。
605601:2007/03/14(水) 08:36:18 ID:???
ASP.NETのGridViewで
GridView1.DataSource=cmd.ExecuteReader()
として動作することを確認しました。これはこれで、
閲覧用途限定だけど使えるやりかただと思う。

こちらとしては混乱させられたというよりも、
近くに聞ける人がまったくいないので、こういう情報は正直かなりありがたいです。
606NAME IS NULL:2007/03/14(水) 08:47:52 ID:???
同意。
607589:2007/03/14(水) 09:31:17 ID:???
>>605
というか、ASP.NETの場合はPostBackされたときは元のオブジェクトは
残ってないわけだから、単に「描画」ができれば十分なわけさ。
だから、性能的には、単純にシークエンシャルな読み取り専用の
DataReaderを使うのが最適のはず。

やりたければセッションにDataTable保持するっつー手もあるのだが、
いずれにせよリッチクライアントのように、ユーザの編集行為の結果が
自動的にDataTableの中身に反映され更新されるってことは無いし、
それは不可能なわけ。
もし、バックグラウンドにDataTableを持つとしても、DataGrid等に対する
編集結果は、PostBackされたときに、手動で反映してやらなければならない。

この辺、リッチクライアントの世界とWebでは随分違う。どっちを念頭に
置いているかで、話が噛み合わなくなるのもある意味当然かもね。
608NAME IS NULL:2007/03/14(水) 23:15:04 ID:???
同じADO.NETに関する話題でも、構築する環境や、実現する言語が違うという話を聞いてみて
ちょっと気になったのだが、みんなはどんな感じでやっているの?

ちなみに俺は、VB2005でWinアプリを作ってる。データベースエンジンはmdbかSQLExpress
大きなプロジェクトの一員とかじゃなくて、小規模なものを作ることが多いから。
言語はC#を使うことも出来はするけれど、AccessやExcelVBAを書くこともあるのでVBでやってます。
609NAME IS NULL:2007/03/15(木) 11:04:51 ID:???
全く何をいいたいのか、何を議論したいのかが絞れてないし、そもそも話題を混同してるようだが。
610NAME IS NULL:2007/03/15(木) 12:08:33 ID:???
ADOを使いたければVB6しかだめで、VB.NET(C#.NET)以降だとADO.NETを使うしか
方法がないので、VB6のサポートが打ち切られるとそれと同時に
ADOを使えるのはAccessしかだめだと思い込んでいたが、
VB.NET(C#.NET)以降でも参照設定をすればADOが使えるみたいなことが
書いてあったので紹介しておきます。

ADO.NET から ADO レコードセットまたはレコードへのアクセス
http://msdn.microsoft.com/library/ja/default.asp?url=/library/ja/cpguide/html/cpconFillingDataSetWithADORecordset.asp

C#でADO2.6
http://mymio.jugem.jp/?day=20051219
611NAME IS NULL:2007/03/17(土) 09:43:10 ID:???
過去ログ読んでいたんだけどjavaでデータベース接続する場合と
比べてどうだみたいな、他との比較的な意見はありませんよね。
こっちが早いとか、開発効率がいいとか、動作が安定しているとか。

データベース接続関係の技術ではなく、VBのフォームにオブジェクトを
貼り付けたりする開発の使い心地などの理由からADO.NETを
選ぶしかない状況だからかな?w
612NAME IS NULL:2007/03/17(土) 09:53:33 ID:???
>>611
そら単に「ADO.NETの質問・雑談スレ」だからだろ。どっから「Java」が
出てくるんだ。

> データベース接続関係の技術ではなく

単なる煽り厨房ではなく、真面目にそういう話がしたいのなら、
そういうスレを立てれ。自分で。
613NAME IS NULL:2007/03/17(土) 16:07:31 ID:???
普通に使うのであれば、実データが格納されるのは、DataTableのDataRowと
いうところである。という程度の理解でいいけれども、
それがどのような処理で保存されているのかがすごく気になる。
数値型や文字列型などに柔軟に対応しながらメモリは効率よく格納するのは
どういうノウハウをつかっているのだろうか。

ま、それらが分かれば、配列の方が処理が軽いかなどの動作テストを
しなくても済むようになると思うけれど、調べる事は出来ないんだろうね。
614NAME IS NULL:2007/03/17(土) 16:52:45 ID:???
>>613
普通に逆コンパイラでSystem.Dataの中のソース見れるだろ。
615NAME IS NULL:2007/03/17(土) 17:05:47 ID:???
>>614
みても、クラスの継承などが連鎖していて、良く分からないと思う。
何か、解説みたいな記述がないとすべての読解は難しいんじゃないかな。
ヒントとして、このクラスを読めとか。
616NAME IS NULL:2007/03/18(日) 22:02:24 ID:???
ちょっと話はずれるけど、逆コンパイルしたり、その中の情報を書いたりするのは、
いかなる目的であっても違法行為にあたるんじゃないかな。

ま、System.Dataの中のソースについて語り合うスレなどがあれば、
多くの開発者がそれを見るようになり、より多くの開発者がMSの製品を
採用するようになると思うけれど。
617NAME IS NULL:2007/03/19(月) 09:21:13 ID:???
えーと、そんなの気にするなら出来合いのDataSetなんて使うなよ。w
配列のほうが軽いに決まってるじゃん。DataSetは余計なものたんまりつんでるんだから。

とりあえずDataSet = XMLベースの簡易DBと思えばいいだけ。
618NAME IS NULL:2007/03/19(月) 11:15:52 ID:???
DataSetが格納しているデータについては、このあたりが関係しているっぽい
ところまでは分かったが、具体的な動きまでは分からなかった。
XmlNode.Value は Stringということだから、内部的には全部文字列で動いていて、
それに属性の要素を付け加えて、この値は数値型だとか、日付型だとか、
を判断しているのかなと個人的に思った。
クラスが複雑すぎて確証出来なかったがw

Object メンバ
http://msdn2.microsoft.com/ja-jp/library/system.object_members(VS.80).aspx
XmlNode.Value プロパティ
http://msdn2.microsoft.com/ja-jp/library/system.xml.xmlnode.value(VS.80).aspx
XmlElement クラス
http://msdn2.microsoft.com/ja-jp/library/system.xml.xmlelement(VS.80).aspx
619NAME IS NULL:2007/03/20(火) 15:21:32 ID:???
ASP解説のところにもADO.NETの解説があったので貼っておきます。
ADO.NETの解説サイトそのものが少ないですね。何でだろう。
テンプレでリンク集とか作ろうかと思ったが、MSDNと@ITの記事くらいだ。

実例で学ぶASP.NETプログラミング
―― ショッピング・サイト構築で学ぶASP.NET実践講座――
第3回 「実プロ流」ASP.NETデータベース操作術
http://www.atmarkit.co.jp/fdotnet/aspexp/aspexp03/aspexp03_01.html
620NAME IS NULL:2007/03/22(木) 02:12:36 ID:???
マイクロソフトが提供している、オプティミスティック同時実行制御は、タイムスタンプではなく、
取得したデータが全件一致しているかを確認する仕様になっているけれど、これはどうしてなんだろう。
タイムスタンプの比較のほうが、1項目のみで良く、処理効率も良いと思うのだが。
深く考えるところでもないのかな。
621NAME IS NULL:2007/03/22(木) 03:35:53 ID:???
>>620
.NET 2.0のSqlClientはテーブルにtimestamp(rowversion)があれば使うようになった。
622NAME IS NULL:2007/03/22(木) 09:18:39 ID:???
>>620
DBMSによって違うでしょ?
>>621のいうように、SQL鯖だったらそういうものあるけど、一般的大多数であるオラにはないんだから。
汎用性ってのはそういうもの。
623NAME IS NULL:2007/03/22(木) 18:23:35 ID:???
>>621-622
なるほど。汎用性を考えての仕様なんですね。ありがとうございます。
624NAME IS NULL:2007/03/24(土) 10:04:05 ID:???
DataRow newRow = table.NewRow()した後に値を格納して新規レコードとしてDataTableに
格納する場合、table.ImportRow(newRow)とtable.Rows.Add(newRow)どっちがよく使われるんだろう?
処理時間計ってみたらImportRowの方が二倍くらい早かったんだけど、この二つって内部処理に
何か違いがあるんだろうか?
625NAME IS NULL:2007/03/24(土) 10:12:27 ID:???
ああ、スマン。Importの方はデータをコピーするってのは分かるんだが、
何でコピーする方が早いんだろうと疑問だったんだ。
626NAME IS NULL:2007/03/24(土) 13:29:51 ID:???
直接の回答でなくて申し訳ないが、私はtable.Rows.Addを用いるものだと
思っていた。書籍やMSDNにもそう書いてあるから。
http://msdn2.microsoft.com/ja-jp/library/z16c79x4(VS.80).aspx
627624:2007/03/24(土) 19:48:37 ID:???
あああ、スマン。今試してみたらImportRowじゃNewRowでスキーマ取得したDataRowは
追加できなかった。DataRowStateがDetachedだし。
俺は変な夢を見ていたようだ。
628NAME IS NULL:2007/03/27(火) 13:47:16 ID:???
http://www.atmarkit.co.jp/fdotnet/vblab/vsdbprog_03/vsdbprog_03_01.html
TableAdapterというのも出てきているようだが、要するにDataAdapterの
ウィザード版みたいだね。
どうしてウィザードにこだわるのかなぁ。DataAdapterの不完全さや欠陥に
気づいていながらそれを放置するとは思わなかった。
ウィザードをしてプロパティをいじる作り方は、構築そのものは早いけれど、
それを改変となると全体の流れがすっきりと見えなかったり、やり方が
分からなかったりすると感じるんだけどな。
そういう意味で、>>76の書き込みはMSのモットーを言い当てていて、名言だと思う。
629NAME IS NULL:2007/04/02(月) 02:45:32 ID:???
マクロソフト コンサルティングサービス テクニカルリファレンスシリーズ の書籍には、
非接続型の更新は小規模システムでない限りは向かないとはっきり書いてある。
更新するならば、ExecuteNonQueryを使えと。
ADO.NETの入門用サンプルプログラムには、DataAdapterでupdateして、「ほら、便利でしょ」
みたいなものばかりなのに。

SQLServerの紹介サイトにて、別の自社製品のソフトを批判した書き方をしているのを思い出した
630NAME IS NULL:2007/04/03(火) 12:24:26 ID:???
@ITの記事は、同時実行制御については書かれているが、トランザクションの
設定については書かれていなかった。
谷尻さんの2005の書籍は、同時実行制御もトランザクションについても省略されていた。
ADO.NET の公式解説書には両方の解説が載っていた。

ひとつの記事にすべてを盛り込むことは不可能ではあるけれど、
同時実行制御もトランザクションも入門レベルで抑えておくべき事項だと思うんだけどな。
それとも、ADO.NETそのものが、そういうことを想定しないレベルでしか
使われないということなのかな。
631NAME IS NULL:2007/04/03(火) 21:35:21 ID:???
ここまでシェアを握っていて、新しい言語の提案が出来るくらいの規模の会社ならば、
新しく提案する技術のドキュメントは、良い面ばかりを書いて、悪いところを必死に隠そうと
するのではなく、良いところと悪いところをあわせて紹介するべきだと思うけどね。
学生ならまだしも、プロジェクトで採用されるかどうかは、本質的なところを見られるわけだし。

MSDNや公式解説書の「コマンドビルダは少ないコードですむが、遅いので使えない」みたいな
感じに、データアダプタのupdateについても書いて欲しかった。
トランザクションは自動設定ではないし、実質Commandに丸投げの処理でしかありません。
ExecuteNonQuery使うのがお勧めです。みたいな。
632NAME IS NULL:2007/04/08(日) 11:33:10 ID:???
変更のタイムスタンプで同時実行の排他制御してるんだけど
Fillして
Updateして
再度Fillして
タイムスタンプは前のままなんだけど、これってどういう事?
外部からDBにつなぐとちゃんと更新されているし。

再度Fillする前にDataSetをnewするとちゃんと取れる。
前にDataSetを持ったまま、別のDataSetにFillしても、やはり前のTimestamp。
どこかにキャッシュしてるんだろうか?
633NAME IS NULL:2007/04/08(日) 11:47:21 ID:???
よくわかんないけど、明示的にCommitさせてみたらどうだろう?
634NAME IS NULL:2007/04/08(日) 12:52:14 ID:???
>>633
ダメですね。Commitしてみたけど一緒。
それに外から確認してみるとちゃんと変わってるし。

現象から見ると、UpdateしたDataSetが有ると同じSQLでデータを取ろうとすると
前のDataSetからデータが取れるようなキャッシュのような動き。

Fillする前にCleanしてみたけど、そうすると正しくFillできなくなる。
何かDataSetを初期化?更新状態を初期状態するメソッドでもあるのかな?
635NAME IS NULL:2007/04/08(日) 22:11:42 ID:???
プロジェクトをうpるか、具体的なコードを書いてみたらどうかな。
636NAME IS NULL:2007/04/10(火) 14:36:42 ID:???
DataSet.AcceptChangesとかって話じゃないよね
637NAME IS NULL:2007/04/10(火) 14:49:01 ID:???
っぽいね。
質問者がきちんとFillメソッドのMSDNを見ていないか理解できてない。
Fillは検索結果をDataSetに入れるじゃなく、マージするだからね。

更新後に再検索した場合、前のデータとのマージだからAcceptChangeでRowStatusを初期化しないと。
638NAME IS NULL:2007/04/10(火) 15:58:46 ID:???
私もそういうのをうすうす感じていた。
まずは、AccespChangesメソッドを任意で呼び出さないといけないケースで
あるかの確認をしなければならないので、質問者は情報を小出しにせずに、
ソースコードを出すべきだと思う。
639佐藤藍子:2007/04/10(火) 17:45:11 ID:???
私もずっと前から分かってました
640NAME IS NULL:2007/04/10(火) 20:31:25 ID:???
>>637
http://msdn2.microsoft.com/en-us/library/system.data.idataadapter.update.aspx
によれば、IDataAdapter.Update()の中でDataSet.AcceptChanges()は
呼ばれることが保障されているように読めるが、気のせいか?

When using Update, the order of execution is as follows:

1. The values in the DataRow are moved to the parameter values.
2. The OnRowUpdating event is raised.
3. The command executes.
4. If the command is set to FirstReturnedRecord, then the first returned result is placed in the DataRow.
5. If there are output parameters, they are placed in the DataRow.
6. The OnRowUpdated event is raised.
7. AcceptChanges is called.
641NAME IS NULL:2007/04/10(火) 20:50:19 ID:???
>>640
俺は637ではないが。
updateのコードの書き方によっては、AcceptChangesが必要な場合もあるのよ。
その可能性もあるといいたかったの。それで、ソースをさらせと

あと、あえて英語サイトをソースにしなくていいだろw
http://msdn2.microsoft.com/ja-jp/library/system.data.common.dataadapter.update(VS.80).aspx
642637:2007/04/10(火) 22:44:13 ID:???
それじゃ、ソース晒そうって箇所がばらけてるから、
サンプルを作ったらちゃんと動いた。
Fillした後にAcceptChangesは呼んでるんですがね〜。
サンプルと実ソース見比べてみます。お騒せしました。
643637:2007/04/10(火) 22:53:51 ID:???
複数のSQLをDataSetにFillして、this.ds.Tables[0].TableName = "dummy";
で強制的にテーブル名をつけて、 adapter.Update(ds,"dummy");で更新すると
644637:2007/04/10(火) 22:55:21 ID:???
発生するみたいです。
素直にDataSetを分けるか、インデックスでアクセスするかして見ます。
645637:2007/04/10(火) 22:56:39 ID:???
ちなみにソース(読み込み)
private void buttonClose_Click(object sender, EventArgs e)
{
string connString = Properties.Settings.Default.DBConnString;
using (MySqlConnection cn = new MySqlConnection(connString))
{
cn.Open();
MySqlCommand cmd = new MySqlCommand("select * from dummy where id = 1;select * from customer; ");
MySqlDataAdapter adapter = new MySqlDataAdapter();
cmd.Connection = cn;
this.ds = new DataSet();
adapter.SelectCommand = cmd;
adapter.Fill(this.ds);
this.ds.Tables[0].TableName = "dummy";
this.ds.Tables[1].TableName = "customer";
this.ds.Tables["dummy"].PrimaryKey = new DataColumn[] { this.ds.Tables["dummy"].Columns["id"] };
this.ds.AcceptChanges();
}

}
646637:2007/04/10(火) 22:57:30 ID:???
更新
private void buttonSave_Click(object sender, EventArgs e)
{
string connString = Properties.Settings.Default.DBConnString;
using (MySqlConnection cn = new MySqlConnection(connString))
{
this.ds.Tables["dummy"].Rows[0]["name"] = DateTime.Now.ToString();
cn.Open();
MySqlCommand cmd = new MySqlCommand("update dummy set name = ?name,modified = ?modified where id = 1 "
+ " and modified = ?currentModified ",cn);
MySqlDataAdapter adapter = new MySqlDataAdapter();
adapter.UpdateCommand = cmd;

MySqlParameter param = new MySqlParameter();
param.ParameterName = "?name";
param.SourceColumn = "name";
param.SourceVersion = DataRowVersion.Current;
adapter.UpdateCommand.Parameters.Add(param);

param = new MySqlParameter();
param.ParameterName = "?modified";
param.Value = DateTime.Now;
param.MySqlDbType = MySqlDbType.Timestamp;
adapter.UpdateCommand.Parameters.Add(param);

param = new MySqlParameter();
param.ParameterName = "?currentModified";
param.SourceColumn = "modified";
param.SourceVersion = DataRowVersion.Original;
param.MySqlDbType = MySqlDbType.Timestamp;
adapter.UpdateCommand.Parameters.Add(param);
adapter.Update(ds,"dummy");

//再読込み
cmd = new MySqlCommand("select * from dummy where id = 1 ;select * from customer;");
adapter = new MySqlDataAdapter();
cmd.Connection = cn;
//this.ds = new DataSet();
adapter.SelectCommand = cmd;
adapter.Fill(this.ds);
this.ds.Tables[0].TableName = "dummy";
this.ds.Tables[1].TableName = "customer";

this.ds.Tables["dummy"].PrimaryKey = new DataColumn[] { this.ds.Tables["dummy"].Columns["id"] };
this.ds.AcceptChanges();

}
}
647NAME IS NULL:2007/04/11(水) 09:22:26 ID:???
他人のソースなんぞどうでも良いが。
Updateの後にGetChangesしてその件数見てみるとか。
Fillの後も同じ。
それでそういう動きなら、それなりに対応すればいいんじゃないの?

あと、Fillの前に別のDSなり前のDSを明示的に廃棄するなり。
648NAME IS NULL:2007/04/11(水) 12:04:43 ID:???
これMySql.NETドライバのバグとかそういうことはないの?
649637:2007/04/12(木) 02:42:39 ID:???
>>648
そうですね。なんかMySql.NETのバグ臭いですね。
でも、一度読み込んだDataSetを廃棄しないで、別のDataSetをnewしてFillしても前のデータが読み込めるってのが、非常に奇妙で。
きっとこれってMySQL.NETのバグというより、ADO.NETの仕様に関係するようで。
一体どういう構造になっているのかと、思うわけで。



650NAME IS NULL:2007/04/12(木) 08:36:11 ID:???
ユー、別のDBMSで試してから書き込みなYO!
651NAME IS NULL:2007/04/12(木) 22:55:49 ID:???
>>647
だな
俺も Fill するまえに Clear してる
メモリのマッピングによっちゃそうなるんだろ
確保したらすべてのメモリ領域初期化してくれるわけでもなし

気持ち悪ぃんだったら Dispose して作りなおしたらよいかと
652NAME IS NULL:2007/04/14(土) 16:53:56 ID:???
DataColumn.DataTypeをSqlDbTypeに変換するにはどうしたらいいんでしょうか?
653NAME IS NULL:2007/04/16(月) 13:46:04 ID:???
>>652
やろうとしていることがいまいち見えないので詳しくお願いします。
そもそも、DataTable(DataColumn)はそういうデータベース固有の
形式にとらわれないもの。という設計なので、変換とかする必要がないはず。
654652:2007/04/16(月) 17:11:56 ID:???
別のDBMSからSqlServerにレコード丸々コピーするときのINSERT文でパラメータの設定時
にSqlDbTypeが必要だったんですがそれ以前の段階で色々おかしかったので忘れてください。
ごめんなさい。
655NAME IS NULL:2007/04/22(日) 15:04:57 ID:m3klGbD1
Access のデータベースに新しいテーブルを追加したいときって、
どうすればいいん?

656NAME IS NULL:2007/04/22(日) 15:25:32 ID:???
SQLでCREATE TABLEすればいいんでは?
657NAME IS NULL:2007/04/22(日) 15:50:06 ID:m3klGbD1
CREATE TABLE をキーワードに google で検索したところ、

cmd = new System.Data.OleDb.OleDbCommand(
"CREATE TABLE 社員(社員番号 INT, 氏名 TEXT(30))", cn);
cmd.ExecuteNonQuery();

↑のようなサンプルを見つけました。
どうもありがとうございました。
658NAME IS NULL:2007/04/22(日) 16:06:53 ID:???
9条は改憲してはならない。日本の為にならない。
日本人ではない朝鮮総連や民団でさえ、日本を心配して改憲への反対運動を行ってくれている。
私は日本人だが、「改憲すべき」などという者は、日本人として彼らに恥ずかしいと思います。

Q.中国から身を守る為、戦争に対する抑止力が必要では?
A.前提から間違っています。そもそも、中国は日本に派兵しようと思えばいつでもできました。
  なぜなら、日本には9条があるため、空母や長距離ミサイル等「他国を攻撃する手段」がない。
  つまり日本に戦争を仕掛けても、本国の、命令をだした幹部の命は絶対に安全なのです。
  「安心して戦争を仕掛けられる国」を、中国は、今まで攻めずにいてくれたのです。

Q.それは日米安保によるものでは? そして、その日米安保も絶対ではないのでは?
A.中国の良心を信じられないのはなぜですか? そして、日米安保は絶対です。
  知り合いの韓国人の評論家も「絶対だ」と言っていますし、私も同じ考えです。
  更に、9条が消えても米国の戦争に協力する義務は発生しませんが、米国が被害者の場合は別です。
  米国は日本を守る為に戦っても、(9条があれば)日本は米国を守る為に戦う必要がないのです。

Q.9条が本当に「平和」憲法なら、世界中で(日本以外に)1国も持とうとしないのはなぜか?
A.これは、日本以外のすべての国が誤っているとも言えます。
  「敵国に攻撃が届く国は攻められづらい」というのは、誤った負の考え方です。
  (もっとも韓国や中国の軍に関しては、日本の右傾化阻止の為でもあるので例外ですが)
  更に日本の場合、隣国が韓国・中国・ロシアと、GDP上位の安定した信頼できる国ばかりです。

Q.「9条改憲派」は「戦争反対派」。侵略者に戦争を挑発する、戦争憲法(9条)を撤廃したいのです。
A.それは、貧しい考え方ではないでしょうか?
  中国や北朝鮮を信じる「強さ」があれば、そんな考えにはならないはずです。
  日本が信じれば、彼らも信じるでしょう。そして、真に美しい関係が始まるのです。
659NAME IS NULL:2007/04/24(火) 09:54:45 ID:???
亀だけど。

DataAdapter.Update()にて、引数にGetChangesで取得した結果を指定した際、
AcceptChangesメソッドは呼び出されないので、手動で実行する必要がある。

この記述は、書籍「Visual Basic 2005 による 実践データベースプログラミング
(谷尻かおり)」にはあったが、MSDNの記述は見つけることが出来なかった。
ADO.NETの公式解説書からも見つけきれなかった。

出来れば、見つけきれた方はソースお願いします。
660NAME IS NULL:2007/04/29(日) 19:52:31 ID:???
保守
6615:2007/05/06(日) 17:53:45 ID:???
だよね
662NAME IS NULL:2007/05/08(火) 18:55:43 ID:???
>>661
なにが?
663NAME IS NULL:2007/05/20(日) 18:09:49 ID:???
ちょっとずれる話だが、AccessだとADOのみしか使えないのを何とかして欲しい。
移植は無理なのかな。OfficeVBAが.NETFrameworkの上に乗っていないから。
664NAME IS NULL:2007/05/20(日) 23:34:40 ID:???
>>663
VSTO
665NAME IS NULL:2007/05/21(月) 01:05:56 ID:???
ってことは、Office2007の次が移植されるってことかな?
666NAME IS NULL:2007/05/21(月) 08:29:04 ID:???
何をどうするとそういう結論が??
667NAME IS NULL:2007/05/21(月) 19:10:31 ID:???
>>666
すまん。664は、Vistaと打ち間違えたもんだと思っていて変なことを書いてしまってた。
VSTOっていうのがあるんだね。
また恥をかいてしまった。
668NAME IS NULL:2007/05/23(水) 22:02:10 ID:???
ム板から誘導されました。

ADO.NETでJETのキャッシュの操作ってできませんか?
ADOやDAOでは出来ていたと思うんですが…
669NAME IS NULL:2007/05/24(木) 11:45:57 ID:G4tCoFZ8
ADO.NET(2.0ではない)で、4つのテーブルから複雑なSQLでデータを抽出して
データセットに入れました。
そのクエリの中身が例えば、商品ID、顧客ID、発送年月日だとします。
条件によって、ソートする列を変えたいのですが、データセット内のソートは
できるのでしょうか?
670NAME IS NULL:2007/05/24(木) 12:20:29 ID:???
DataView使えばおk
671NAME IS NULL:2007/05/24(木) 18:06:02 ID:???
>>668
キャッシュの操作って具体的にどんなことですか?
672NAME IS NULL:2007/06/01(金) 10:47:13 ID:???
>>664
VSTOってoffice2003からなんだね・・・
うちは未だに2000使っているからむりぽなわけですよ・・・
673NAME IS NULL:2007/06/01(金) 21:01:24 ID:???
>>672
Interop しかないな。自分で ADO.NET の COM ラッパーを作る。
674NAME IS NULL:2007/06/02(土) 03:39:14 ID:???
C++、ADOでmdbにアクセスするアプリをc#に移植中なんですが、
c#で OleDbCommand.ExecuteReader でアクセスすると、mdbとsql文は同じなのにパフォーマンスが劇的に遅くなまりした。1秒→7秒
どうもインデックスを使ってくれてない感じです。
解決方法ってありますか。それとも何か間違いを犯してるんでしょうか。
675NAME IS NULL:2007/06/04(月) 22:01:41 ID:???
>>674
そんな質問で答えられる人はいないと思われる
676NAME IS NULL:2007/06/05(火) 00:22:49 ID:???
使っている関数に問題あるとか
677NAME IS NULL:2007/06/05(火) 14:23:56 ID:???
まずは、selectなど簡単なsql文ではどうなのかという話からじゃないかな。
678NAME IS NULL:2007/06/05(火) 14:30:14 ID:???
ただ「動きません」と報告してきた後輩に、最初から流れを説明させて
たら急に黙り込んで「すいません、わかりました」と仕事に戻ることが
ままあるもんだ。

ひどいのになると自分で書いたコードすら読めないやつもいるけどさ。
679NAME IS NULL:2007/06/07(木) 21:47:27 ID:???
SQL2005 ADO.NET2.0って
MARSとかスナップショットなんとか使えて便利そうだけど
バージョンストアでパフォーマンス削がれるんだよなぁ
微妙
680NAME IS NULL:2007/06/07(木) 23:44:25 ID:???
PostgreSQL から ODBC 接続して素で Boolean 型を渡すと
.NET 側では Boolean 型と認識してくれないね

あと CurrencyManager に Boolean 型バインドして
AddNew すると Position プロパティに値が反映しないし、更新がおかしくなる
(これは MS からバグ報告としてあったねぇ)

どっちも回避できるからいいけど、.NET で Boolean 使うときは
めんどくせーなーと思った今日一日ですた
681NAME IS NULL:2007/06/08(金) 01:25:23 ID:???
ポスグレのODBCドライバが糞ってだけの話だな・・・
682NAME IS NULL:2007/06/08(金) 09:00:55 ID:???
Npgsqlはどうよ?
683NAME IS NULL:2007/06/14(木) 01:20:22 ID:3zn18ozx
SQLSERVER2000からDB2に移行したいんですけど
ADO.NET1.1でSQLSERVERでは使えるけどDB2では
使えないor使い方が違うクラスとかってありますか?
684NAME IS NULL:2007/06/14(木) 07:11:04 ID:???
>>683
Connection や Adapter など
685NAME IS NULL:2007/06/26(火) 16:46:23 ID:???
だよね
686NAME IS NULL:2007/06/30(土) 07:29:06 ID:???
初心者です。質問があります。

DataSetに取得したデータをGridに表示したいと思っています。
ある列において、0なら「なし」、1なら「あり」と日本語で表示したいです。

Grid.DataSource = DataTable とし、
DataAdapter.Fill するだけでは、0は「0」、1は「1」と表示されるだけです。

どんな風にプログラムすればよいのでしょうか?
よろしくお願いします。
687NAME IS NULL:2007/06/30(土) 09:26:08 ID:???
1.取得時のSQLでCASE式等使って変える
2.http://msdn2.microsoft.com/ja-jp/library/system.data.datacolumn.expression(VS.80).aspx
688NAME IS NULL:2007/06/30(土) 09:32:59 ID:???
>>686
別テーブル作って繋げ。参照整合性制約付けるとデータのチェックにもなるし。
689NAME IS NULL:2007/06/30(土) 15:49:25 ID:???
>>687, 688
レスありがとうございます。
いろいろな方法があるんですね。

DataGridとDataTableの間のデータ授受をプログラムで横取りし、
そのプログラムの関数内で変換処理することができると
いいと思っています。そんな方法はないのでしょうか?

0->なし、1->あり くらいならExpressionでもSQL Case文でも
できそうですが、もっと複雑な変換処理をする場合もあると
思うので。

知っている方いましたら、教えてください。
690NAME IS NULL:2007/06/30(土) 17:09:15 ID:???
2.0以降ならDataGridViewでいろいろいじれる。
691NAME IS NULL:2007/07/01(日) 01:23:57 ID:???
>>689
DataGridのDataSourceにDataTableを指定した場合、
DataGridの表示とDataTableの実データを異なった状態にするみたいな
概念はないので、やはり、データベースサーバからデータを取ってくる段階で
プログラムで処理を行い(例えば、数値から文字列への変換)、
さらに更新時にプログラムで処理を行う(例えば、文字列から数値への変換)、
という考え方になると思う。

複雑な処理になるなら、DataGrid用のDataTableと、データ取得用のDataTableを
別々に宣言するというぐらいしかないんじゃない?
692NAME IS NULL:2007/07/01(日) 01:28:31 ID:???
こんな感じの構成

データベースサーバ
↑|
|↓
データ取得用DataTable
↑↓
ユーザによるデータ編集用DataTable = DataGrid
693NAME IS NULL:2007/07/01(日) 12:05:49 ID:???
DataGrid と DataTable がどのタイミングでイベント発行してくれるか
調べればよろしいいかと

作成時にイベントハンドラ定義できないなら プログラム内で AddHandler
もしくはクラス作成時に WithEvents
694NAME IS NULL:2007/07/03(火) 15:54:01 ID:???
テンプレ用として貼っておきます。
PostgreSQLに接続する際に参考になるサイト
http://www.interwiz.koganei.tokyo.jp/
http://www.partsware.net/
695689:2007/07/04(水) 06:10:40 ID:???
>>690,691,692,693
レスありがとうございます。


>DataGrid と DataTable がどのタイミングでイベント発行
>してくれるか調べればよろしい

ヘルプでイベントを見てみましたが、みつかりませんでした。
686のような使い方は、誰でも頻繁に必要になると思うのですが、
常套手段といえる方法はないのでしょうか?

それとも、ExecuteReaderで1行づつ取ってきてGridに格納
するのが常套手段なのでしょうか?
(でもこれだと、DataSetを介さないので、レコード追加、更新、削除
なども多くのコーディングが必要になりますよね?)
696NAME IS NULL:2007/07/04(水) 07:56:50 ID:???
普通はDataGridView使いますから
697NAME IS NULL:2007/07/04(水) 09:27:28 ID:???
DataSetは閲覧用、更新にはSQL直打ちで対処する派です。
Updateメソッドなんて使い物にならないっしょ?
698NAME IS NULL:2007/07/04(水) 17:15:58 ID:???
過去ログに、DataAdapter.Update()は使い物にならないのでExecuteを
使ったほうがいいという話が結構出てるよ。(>>629など)

あと、トランザクションは自動で設定じゃないから、付け加える必要がある。
>>136>>555

で、コードが長くなったり勝手に昇格して重くなったりするので、Executeを
使うのと労力が変わらないという結論となる。(>>586
699NAME IS NULL:2007/07/04(水) 17:28:46 ID:fg5TH2Y3
ということは、テーブルのRowStateによって、INSERT,UPDATE,DELETEを直打ち
するってこと?確かにUpdateはパラメータの指定とか面倒だし。
あと、コマンドビルダーも役に立たないって聞いたことある。
700NAME IS NULL:2007/07/04(水) 18:06:22 ID:???
更新用のコードを自動生成するツールを自作して対処してる
701NAME IS NULL:2007/07/04(水) 23:47:34 ID:???
>>699
コマンドビルダーは処理が重いからあまり使わない方が良いと、公式な文章に書かれている。
自動でやるから変なSQL文を生成して、それによってエラーを出す場合もあるしね。


>>700
それって、スキーマを読み込んだりしてフィールド名などを自動的に取る方法ですか?
他人がやっている方法が気になったもので。。。
702NAME IS NULL:2007/07/05(木) 21:18:33 ID:???
参照はデータセット
更新は自分でSQL書いてexecutenonqueryでやってます
楽観的ロックもtimestamp型使えばいいし
703NAME IS NULL:2007/07/06(金) 09:23:14 ID:???
春はあけぼの
704NAME IS NULL:2007/07/06(金) 10:55:58 ID:???
やうやう白くなりゆく山ぎは
705NAME IS NULL:2007/07/06(金) 16:48:44 ID:gQTP0i/B
皆さんは「厳密に型指定されたDataSet」はどのような時に使っておられますか?
必ず使っておられますか?
706NAME IS NULL:2007/07/06(金) 19:58:27 ID:???
>>705
使ったことないな
.Tostringでやっとります
707NAME IS NULL:2007/07/07(土) 09:33:02 ID:???
>>705
使ったことはない。
書籍を読んだが、具体的にどんな場面であるのかもいまいちつかめなった。
いくつか具体例を出して解説があれば分かるんだろうけどね。
708NAME IS NULL:2007/07/07(土) 12:17:49 ID:???
フィールド名・テーブル名のtypoが怖いからって理由だけで使い始めたんだが、それなりに便利だよ
typo回避策は他に色々あるけどデザイナで自動生成簡単修正できるし、詳細表示フォーム用
のコントロール作成するときも勝手にやってくれるので便利
扱うテーブル数が少ないなら使う価値はあるんじゃないかと思う
709NAME IS NULL:2007/07/07(土) 16:05:07 ID:???
気分的な理由であまりウィザードやデザイナは使いたくないので、
型指定されたDataSetは使わないかな。
VB.NETやVB2002の時期は、OSや.NETFramework、VBのバージョンは
同じなのに、一方でだけエラーが出て、もう一方ではそれが
再現できないなんて事があったし、コードが動かないとかあった。

Access2000でプログラミングしてAccess2003で開いたら動かなかった
という事もあったしね。そんなに特殊な処理をしているわけではないのに。

ここまで頻繁にバージョンアップや仕様変更がなければ使おうかという
気持ちになるんだろうけどね。
710NAME IS NULL:2007/07/08(日) 20:24:07 ID:ehn/JfnG
sa
711NAME IS NULL:2007/07/09(月) 14:53:38 ID:WLR34h5u
型指定されたDataSetを使いたいけど
メソッド名とかが気に食わない
また、それを修正してもちょっとデザイナでいじるとアウト
もとにもどる

おれはそれが使わない理由

自分で作れば?
といわれれば、そういたいけれど作ってる時間がもったいない
712NAME IS NULL:2007/07/09(月) 15:14:28 ID:???
どんなメソッド?
partialクラスだからそっちで好きなようにいじれるけど
713NAME IS NULL:2007/07/09(月) 15:19:50 ID:WLR34h5u
関数だけど
[ColumnName]IsNULLとか
おれはIsNull[ColumnName]とかの規則にしたいんだよ・・・・
714NAME IS NULL:2007/07/09(月) 15:30:32 ID:???
ああ、それ分かるわw
IntelliSense有効に使えなくもなるしな
715NAME IS NULL:2007/07/09(月) 16:01:26 ID:WLR34h5u
いるのか 同士が!!!
>>714
ちょっと嬉しくなっちまったぜ


716NAME IS NULL:2007/07/10(火) 17:00:19 ID:peEzUMaA
接続型と非接続型に関して質問があります。

フォームのコンボボックスやリストボックスなどに表示させるマスタ情報は、
非接続型で取得して、追加/更新/削除をするデータには接続型でするのが、
良い方法という事なのでしょうか?
717NAME IS NULL:2007/07/10(火) 19:08:46 ID:yBXV226s
>>716
取りあえず楽観的更新と悲観的更新をググってみると傾向がよくわかると思う
718NAME IS NULL:2007/07/10(火) 19:08:58 ID:???
>>702
>>参照はデータセット
>>更新は自分でSQL書いてexecutenonqueryでやってます

GridDataViewへの追加、更新、削除のイベントは、何を捕捉
すればよいのでしょうか?
参考になるURLなどあったらお教えください。

>>楽観的ロックもtimestamp型使えばいいし

この意味を詳しく教えていただけないでしょうか?
719NAME IS NULL:2007/07/10(火) 19:24:59 ID:yBXV226s
> GridDataViewへの追加、更新、削除のイベントは、何を捕捉
DataRowのRowVersionかなんかでいいんじゃない?
基本的にデータアダプタで更新かけるときはそのRowVersionみて処理してると思うけど
詳しくはまずヘルプをみてみて

>楽観的ロックもtimestamp型使えばいいし
SQL鯖のTimeStampはほかのDBのtimestampとちがってSQL鯖内で一意であることが約束されている特別な型だったっけ?
(詳しくはSQL鯖のカラムの型の説明を参照)
だから更新するときにTimeStampが更新されるようにしとけば自分がデータ取得して書き込む時に
TimeStampのカラムのデータが同じ→誰も更新していない
TimeStampのカラムのデータが違う→誰かが更新した というのが保証される
普通にミリ秒とかのカラムだと処理時間によっては重複してしまうことがありえるけど、この場合100%ありえないことが保証されてる
てことじゃないかなぁ?

わかってはいるつもりなんだがうまく書けなくてすまん
いいわけすれば、実際同時実行制御をどこまでわかってるかも分からないから
720NAME IS NULL:2007/07/10(火) 21:50:03 ID:HqGt7hop
>>699
コマンドビルダー
721NAME IS NULL:2007/07/10(火) 21:53:58 ID:HqGt7hop
>>720
コマンドビルダー
722718:2007/07/11(水) 06:03:20 ID:???
>>719
ありがとう。
楽観的ロックのtimestampについては、よくわかりました。
ご返答の通り、SQLServer2005のヘルプによれば、timestamp は、その
データベースに対して一意になっているそうです。

GridDataViewについては、ヘルプ見てもわかりませんでした。
RowAdded, RowValidated, EditModeChange などのイベントハンドラを
調べて動作確認もしてみましたが、DataGridViewの行の追加・修正・削除
を検出するには適当ではなさそうです。
723NAME IS NULL:2007/07/11(水) 12:07:20 ID:zeep73dE
該当のDataTableかDataRowのイベントあたりにステータス変更イベントなかったけ?
それ使えばどうかな?
不確かな情報だけど
724718:2007/07/11(水) 19:46:15 ID:???
DataGridViewのDataSourceは、DataTableにバインドせず、
DataGridViewの各セルにプログラムで直接データを書き
込んでいます。
この場合、DataRowのイベントハンドラは使えません。

DataGridViewのイベントだけで、データの追加修正削除を
捕捉する方法はないでしょうか?

それとも、DataGridViewはDataTableとバインドしなければ
使えない代物なのでしょうか?
725NAME IS NULL:2007/07/11(水) 20:23:18 ID:???
バインドしない理由をまず書いてみて
726NAME IS NULL:2007/07/12(木) 00:11:49 ID:gO43fZUT
>>724
別にしなくてもいいけど
速度とか段違いに違うだろうに
あとの登録しなおしの手間考えても

俺も理解しがたいんで>>725のいうように聞いてみたい
727NAME IS NULL:2007/07/12(木) 10:30:17 ID:???
編集されたデータの型チェックも自分でやるつもりなのか
728NAME IS NULL:2007/07/13(金) 05:35:32 ID:???
バインドしない理由は、表示とメモリ上の
データを別々に管理し、DataSourceで繋ぐという
手法に違和感があるためです。

DataGridViewの各セルにテーブルのデータを直接
書き込み、DataGridViewのイベントを直接ハンドリングして
SQLを発行したほうが、直感的でわかり易い。

理由はこれだけです。

DataGridViewはDataTableとバインドしなければ
使えない代物であるなら、それに合わせざるを得ま
せんが・・・
729NAME IS NULL:2007/07/13(金) 08:31:52 ID:???
自分だけが分かりやすいものを引き継がされる人間のことも考えてね
730NAME IS NULL:2007/07/13(金) 12:09:07 ID:+HHaIWg8
>表示とメモリ上の
>データを別々に管理し
むしろ>>728のやり方のほうが別々な管理になっていると思うが…?

>直感的でわかり易い

データ取得してして
A:
・表示はコントロール任せ データソースプロパティにほりこむ
・入力チェックも殆どコントロールまかせ
・データアダプタ作って表示しているデータソースを与えて処理

B:
・ループでまわしてグリッドを作成したりデータ追加したり
・入力チェックをすべて自前で
・元のデータに反映させる時も元のデータに入れる前に型をすべてチェックして入れる
・そのデータをもとにSQLを発行してExcuteNonQuery(だっけ?)

Aのが直観的でわかりやすいと思うんだがどうだろうか?
731NAME IS NULL:2007/07/13(金) 12:16:42 ID:???
頭がすこし固い人は自分で全部作ったほうがわかりやすくていいんだよ
732NAME IS NULL:2007/07/13(金) 12:19:39 ID:???
全部を自分の制御下に置きたがるって欲求はわからんでもない。
が、チーム組んで作ってるプロジェクトではやってほしくないなぁ。
勝手にへんな動きをするMSは信用置けないってのもわかるんだけどさ。
733NAME IS NULL:2007/07/13(金) 16:12:54 ID:???
全部を自分の制御下におきたいのであれば、MSの商品を使うこと自体に
疑問を持ったほうがいいと思うw
C, C++, Java あたりでモジュールを作っていけば十分に対応出来るんじゃ
ないかな。
734NAME IS NULL:2007/07/13(金) 17:25:44 ID:+HHaIWg8
まぁドトネトで自作コントロールだな
ユーザーコントロール使ってフルにオーナードローでw
735NAME IS NULL:2007/07/13(金) 17:45:13 ID:???
オーナードローというよりは、セルフドローでは
736NAME IS NULL:2007/07/13(金) 18:15:54 ID:+HHaIWg8
>>735
た…確かにそういったほうが正しい気がする(;゚Д゚)
737724:2007/07/15(日) 13:05:31 ID:???
>730-736
レスありがとうございます。

当方、MSのツールは初めてであり、.NET Frameworkを使わざる
を得ない状況のため、嫌々使っているのです。考え方やツールに
慣れていないため、これまで培ったスキルをゴリ押ししてプログラム
を組もうとしているわけで、頭が固いですね。

ところで、DataGridViewを使うのに、DataBindingSourceは必須ですか?
DataGridView.DataSource=DataTable としても、変更した行などを
取得するには、DataTableとDataBingingSourceを接続しないければ
いけないような気がするのですが・・・
()
738NAME IS NULL:2007/07/15(日) 14:50:10 ID:???
>>737
必要ない
多分普通に使う「バインド」と .NET の DataBinding が頭の中で
ごっちゃになってると思う

DataGridView での変更などは DataSource に設定した DataTable にすべて
反映されて保持してるから、そこから拾えばいい
DataGridView の各 Cell は DataTable と一対一で入力エラーも DataTable
の設定が反映されるからそういう意味では「DataTable にバインドする」
ってことになるかな

ただ .NET で言う DataBinding プロパティは
「Form の BindingManagerBase が管理するデータの各要素を DataBindingCollection に追加する」
っつー意味なので多分 724 が思ってることとは違う

仕事でいやいや使うのが辛いのはわかるけど、使わなきゃいけない
状況なら MSDN 見るなり自分で各コンポーネントチェックしなされや
発言見てると .NET 覚える気もない感ありありでっせw
739NAME IS NULL:2007/07/15(日) 20:38:14 ID:kUe0nW9E
むしろ仕事だからと 愚痴を言うより
その技術のいいところを盗んでほかに応用するのもいいんじゃないかと・・・?
740724:2007/07/16(月) 18:31:24 ID:???
皆様レスありがとうございます。

いろいろわからないことがあるためシツコク質問させてください。

DataGridViewを使い、行のデータを変更するのは別の画面で
行いたいと思っています。
この場合、グリッドの選択項目(FocusedItem)に対応するDataRowを
取得する必要がありますが、この取得のためにDataBindingSourceは
必須でしょうか?

MSDN調べた限り必須だと思うのですが、DataBindingSourceが無くても
可能な方法があったら教えていただきたいです。
741NAME IS NULL:2007/07/16(月) 19:53:57 ID:Jel/SKAo
>>740
別に必須じゃない
それは自作でデータを挿入できていることからもわかると思うけど・・・・


DatagridView.Rows().Cells().Value
これじゃだめなのかな?
これすら調べられないようでは話にならないと思うんだが・・・・
742NAME IS NULL:2007/07/16(月) 21:10:12 ID:???
>>740
DataRow は DataTable の構成クラスの一つなんだが・・・

まぁなんだ、ここで質問する前に初心者本買って来て一から覚えたほうがいいな。
目障りだから消えてくれ。
743NAME IS NULL:2007/07/16(月) 22:42:08 ID:???
System.Windows.Formsの質問もADO.NETの範疇に入るのか?
744738:2007/07/16(月) 23:14:54 ID:???
>>740
何をわけわからんことをと思ったけどわかった
724 の言ってる BaindingSource ってのは実は DataTable のこと

多分 MSDN にそう書いてあるんだろうけど BindingSource ってのは
Form で使うデータを管理ためクッション的なクラスで、これを理解するには
上にも書いた BindingCollection や BindingManagerBase, そして BindingContext クラスとかも
一緒に理解しなきゃいけないからそれこそ MSDN 見ろって感じ。

で、BindingSource に SQL 渡すと裏では何やってるかっつーと
(多分、多分ね)自動的に DataTable を作成して、BindingSource に処理が渡されると
作成した DataTable に丸投げってことをやってる(はず)

Form 内でいろんなコンポーネントにデータをバインドしなきゃいけない
場合はこれは必要な処理になってくるんだけど、DataGridView のみで完結する程度の
処理なら BindingSource をわざわざ間に入れる必要はなくて、直接 DataSource プロパティに
DataTableを設定してやったほうが処理は簡潔になるっつーことですよ
疑問に思ってる DataRow も DataTable から取得すればいい


いろいろ書いたけど、多分わけわからんだろうなぁ・・・
やっぱ MSDN より初心者本買って覚えたほうがいいな
MSDN も余計なことを書いてくれる・・・厳密にはそーかもしれんけどさー
745744:2007/07/16(月) 23:23:56 ID:???
>>743
そうだ・・・そうだよなぁ・・orz コタエテスマソ
746741:2007/07/17(火) 00:07:50 ID:Jv+VllVN
トンチンカンな回答をした自分が恥ずかしいorz

747740:2007/07/17(火) 19:35:55 ID:???
いろいろ回答をいただき、勉強になります。

>>741
>>DatagridView.Rows().Cells().Value
回答ありがとうございます。
実は、この方法しかないのかお聞きしたかったのです。

DataGridView.DataSource = DataTable とした時点で
データとビューが関連付けられるため、わざわざ
DataBindingSourceなど使わなくても
DataBindingSourceが実装するようなメソッドやプロパティが
使えてもよさそうなのに、と思った次第です。
748NAME IS NULL:2007/07/17(火) 19:40:12 ID:???
DataSourceはObject型なのに何でそう思えるの?
749NAME IS NULL:2007/07/18(水) 02:06:32 ID:VQDiTlZO
>>748 のいうとおりだが
Object型ってのが今一歩判ってないっぽいんじゃないか?
デバッグで止めてみてみればわかると思うが?

つうか>>740なぜ楽にできる方法を使わないでわざわざ茨の道を行くんだ?
しかも、それは近道ではなく遠回りでしんどいだけだと思うんだが?
750NAME IS NULL:2007/07/18(水) 12:37:58 ID:???
すいません、データベースを更新後に最新のデータを表に表示したいのですが、
FILLを使っても昔のデータが出てしまいます。

this.testDataSet.infoSet.Clear();
this.infoTableAdapter.Fill(this.testDataSet.infoSet);

とかやってみたのですが無理でした。
2行目を消したら何も表示されなくなったので、Clearはされていると思うのですが…
DBはちゃんと更新されているのは確認済みです… 何かいい方法ありますでしょうか?
751NAME IS NULL:2007/07/18(水) 12:54:10 ID:gqIaltWW
じゃぁ
this.infoTableAdapter.Fill(this.testDataSet.infoSet);
にあるとしか・・・・
試しに取得するときに新しいインスタンスDataSetとかDatatableとかに対してFillしてそれ表示したらどうなるの??
752750:2007/07/18(水) 13:33:51 ID:???
>>751

VC#任せで作ったので、取得する方法がわかりません…
もう少し勉強してから質問します。

どうやらデータセットを更新する必要があるみたいです。
SELECT文の結果をデータセットにいれたらいいのでしょうか・・・
753NAME IS NULL:2007/07/18(水) 13:37:34 ID:gqIaltWW
まさかとはおもうが
>データベースを更新後に最新のデータを表に

これは

データベースからデータ取得

表示

内容の更新・追加・削除

データベースへの登録

最新データの取得←いまここ

こういうわけじゃなかったとか?
754NAME IS NULL:2007/07/18(水) 15:57:11 ID:???
DataSetの中身を変更しただけでは、ローカル変数の中身がかわっているだけで、
データベースの中身は変わってないから、fillしたら昔のデータが表示されるだけです。
あたりまえ。
755750:2007/07/18(水) 16:10:22 ID:???
>>753

まさにその通りです。

データセットの中身は全く触らずに、
いきなりinsert文やupdate文で中身を変更しています。

756750:2007/07/18(水) 16:18:09 ID:Fsa6VxVX
DataGridViewについては全く触らなくてもOKですよね・・・ なんででしょう
757750:2007/07/18(水) 17:12:50 ID:???
いけました・・・

おとなしくデータセットにクエリの追加して、insertとupdateをデータセットに関してもやってあげたらいけました
758NAME IS NULL:2007/07/18(水) 21:21:54 ID:???
SQL文はDataSetに対しては実行(Execute)できないから、
以下のような文章はおかしいと思う。
> insertとupdateをデータセットに関してもやってあげたら

解決したといっているのだからいいのだけど。
759NAME IS NULL:2007/07/18(水) 22:14:19 ID:???
何が分からないのか分からないレベルの初心者だから仕方なかろう
760NAME IS NULL:2007/07/21(土) 20:10:29 ID:???
ROMしてたが、一言。

相手が初学者であることだけで、横柄な態度でレス
するヤツがいる。

エンジニアならば、謙虚であれ。
761NAME IS NULL:2007/07/22(日) 06:20:09 ID:???
>>759
初心者をあざけって優越感にひたって楽しいか?
低級な人間であることが想像できる。
762NAME IS NULL:2007/07/22(日) 13:59:50 ID:???
>>761
お前もな。
2chなんてそんなもんだろ。
763750:2007/07/23(月) 21:20:52 ID:???
C#歴三週間、ADO.NET歴2.5週間になりました。
先週はお世話になりました。

おかげさまで一通りDBを利用した簡単なアプリを作れるようになりました。
最初はデータセットやデータアダプタやテーブルアダプタってなんだーーーーーって感じでしたが、
何とか理解できました。
DataBindingというのがいまいちよくわかっていませんが。。。


今、意外に見つかりそうで見つからなくて困っていることがあるのですが、
OleDBのデータ型にLongVarCharってありますよね?

あれって何バイトまで対応できるのでしょうか?
ちなみに現在MDBファイルをDB代わりに使っています。

764NAME IS NULL:2007/07/24(火) 11:47:57 ID:GcsD0LjG
そんなちょっとMSDNとか調べるだけで出て来るような質問はどうかとおもうんだが・・・・
765NAME IS NULL:2007/07/24(火) 16:03:34 ID:???
>>764
初心者をあざけって優越感にひたって楽しいか?
低級な人間であることが想像できる。
766NAME IS NULL:2007/07/24(火) 18:58:01 ID:???
技術板なんだから、技術以外の話はやめようぜ。
どんどんレベルが落ちる。
767NAME IS NULL:2007/07/25(水) 09:07:09 ID:RrA9X9Mw
>>765
あざける?
このレベルであざけるという人間のほうがレベルが低すぎて人として認めたくないんだが?
じゃぁお前が答えてやれよカス
768NAME IS NULL:2007/07/25(水) 09:12:00 ID:???


769NAME IS NULL:2007/07/25(水) 10:47:10 ID:???
意味不明な逆ギレかこわるい
770NAME IS NULL:2007/07/25(水) 13:27:56 ID:???
んじゃ俺が書いとくよ

>> 763
.NET で文字を代入する変数として用意してあるのは Char と String のみ

LongVarChar ってのは LongVarChar っていうデータ型があるデータベースと
通信するために「この列は今通信してるデータベースではこういう型なんだよ」
ってわかるようにするための単なる目印でしかない

.NET に持ってきた時点で文字列はすべて String 型で処理される

OleDbType で定義されてる型は皆ただの目印
普通はプロバイダとの通信で自動でやってくれるとこなので意識することもない

MDB には LongVarChar 型がないからそりゃわからんわなw
まぁちょっと知識が先行しすぎだな

使わないものでも覚えておきたい熱意は買うけど
目の前のプログラムを強固に作っていった方が後々ためになるよ
もうちと自分で調べてから質問したほうがいいな
771NAME IS NULL:2007/07/25(水) 13:30:54 ID:RrA9X9Mw
>>770
お前みたいなのが俺の先輩にいれば・・・・orz
772NAME IS NULL:2007/07/25(水) 14:48:52 ID:???
技術板なんだから、技術以外の話はやめようぜ。
どんどんレベルが落ちる。
773763:2007/07/25(水) 15:09:57 ID:QLcXTaha
>>770

ありがとうございます。
すべてstring型に変換されているだけなんですね。
MySQL+PHPで3年ほどやってたのですが、この度急にC#でアプリを作らないといけなくて猛勉強中です。
Varcharって255byteまでしかいけないんじゃないのか!?
とおもって焦りましたが、結局Stringで送るならDBに依存するということですね。

ありがとうございました。
774NAME IS NULL:2007/07/25(水) 15:14:24 ID:RrA9X9Mw
>>773
逆にC#のStringの制限に依存するともw
775NAME IS NULL:2007/07/25(水) 21:52:00 ID:???
向学心をもつことは大事なことだぞ。
エンジニアとして必須の心構えだろう。

そんな向学心を持つ前向きな人に敬意を
持てない族は、レスする以前に社会性や
道徳性を学んでいただきたい。
776NAME IS NULL:2007/07/25(水) 22:33:53 ID:???
【教えて君増産計画審議中】
    ∧,,∧  ∧,,∧
 ∧ (´・ω・) (・ω・`) ∧∧
( ´・ω) U) ( つと ノ(ω・` )
| U (  ´・) (・`  ) と ノ
 u-u (l    ) (   ノu-u
     `u-u'. `u-u'

777NAME IS NULL:2007/08/01(水) 10:01:52 ID:EWBoJIaA
JETSQLで、INSERTした後に追加された主キーの値を取得する方法ってあるのでしょうか?

主キーとフィールド1があって、

INSERT (フィールド1) VALUES ('TEST');

みたいにinsertしたときに追加した主キーを取得したいのですが…
778NAME IS NULL:2007/08/03(金) 11:21:38 ID:???
ない
779NAME IS NULL:2007/08/03(金) 12:20:49 ID:???
>>777
1.オートナンバーが100まであるテーブルから、No1〜50まで抽出
2.DataGridView等で新規レコード作成
3.テーブルアダプター使って更新反映
4.Formを閉じずにさっき作成したレコードを変更
5.テーブルアダプター使って更新反映

とすると、No51のレコードがNo101の内容に上書きされちゃうから
mdbでオートナンバーが主キーのテーブルを操作する時は気をつけて
DataSetのAutoIncrementが自身の持ってるデータの最大値+iを新規行に
しちゃうのが悪いんだけどさ
780NAME IS NULL:2007/08/03(金) 15:09:46 ID:G29UWrC3
VisualStudio(Visual Studio 2005 Academic Edition)を使い始めて2日目の入門者です.
odbcDataAdapter を使ってリモートマシン上にある postgresql のテーブルを更新するプログラムを
作ろうとしているところです.

Windowsで odbcドライバの設定を行い,VSのサーバエクスプローラで
データベース接続OK&テーブルの中身が見られる状態にはなっています.
# odbcドライバの設定でリードオンリーはしていません.
# postgresでもテーブルにはとくにリードオンリーの設定はしていません.

データアダプタ構成ウィザードの詳細オプションで
「INSERT,UPDATE,およびDELETEステートメントの生成」
をチェックしたにもかかわらず,odbcDataAdapterインスタンスのプロパティには
SelectCommandのクエリしか作成されてません.Delete,Insert,Updateのクエリーが
自動生成されません.

「ウィザードの結果」
-----
データアダプタ"odbcDataAdapter1"は正常に構成されました。
詳細:
v SELECTステートメントは生成されました.
v テーブルマップは生成されました。
これらの設定をアダプタに適用するには[完了]をクリックしてください。
-----

すべてのクエリーを自動生成してもらいたいのですが,どうしたらよいでしょうか?

ネットをいろいろ検索してみましたが,同じような症例が見当たらず,
かといって直接クエリーを書くよりも,やはりUpdateメソッドで楽をしてみたいなという想いがあり,
ぜひ解決法をご教授願いたく思うしだいであります.
781NAME IS NULL:2007/08/03(金) 15:19:46 ID:???
追伸:
ポスグレでのテーブル作成
create table test( id varchar(32) primary key, att text, val text );
782NAME IS NULL:2007/08/03(金) 15:40:57 ID:???
UpdateやBuilder自動生成を使おうなんて考えない方がいいよ。
冗長で訳わからんクエリになるし、トラブったときに原因追及するのが
超絶面倒だからさ。
783NAME IS NULL:2007/08/03(金) 16:26:36 ID:???
まあ勉強なんだろうし。
主キーが無いとか?
784NAME IS NULL:2007/08/03(金) 16:27:01 ID:???
ってあるな。
785NAME IS NULL:2007/08/03(金) 16:29:12 ID:G29UWrC3
ご返信ありがとうございます.

たしかにそうであると思います.
ですが,基礎教養として抑えておきたいという気持ちもあります.
チュートリアル(ではsqlDataAdapterとかですが)にしたがって
プログラム作成を進めて
「このようにデータベースのほうも更新されています」
とか言われても,されてねぇじゃんっ(ツッコミ) みたいな,
チュートリアルもできないという挫折や寂しい気分を少しでも
慰めてあげたいという自己愛もそこにはあるのです.
なんらかの原因で自動生成されないのだと思うのですが,
せめてその原因だけでもわかればと考えています.
786NAME IS NULL:2007/08/04(土) 09:20:17 ID:???
AdapterのSQL文の自動生成は、「テーブルが1つで主キーを含む」という
条件だったような気がする。使わないから詳しく覚えてないやw
このスレに来ている人たちは、「機械が勝手に生成したものは、安心して
使えないから自分で書いた方がいい」という考え方の人が多いよ。
787NAME IS NULL:2007/08/04(土) 23:08:42 ID:???
みなさまお返事ありがとうございます.
けっきょく自分で書いてやっとります.
788NAME IS NULL:2007/08/09(木) 11:29:38 ID:mX9z6hoG
複数のスレッドで同じDataTableを操作しているのですが、
たまにDataTable.Select内部で下の例外が発生する場合があります。

-----------------------------------------------------
System.IndexOutOfRangeException:位置*に行がありません。(*には数字が入る)
System.Data.RBTree'1.GetNodeByIndex(Int32 userIndex)
System.Data.RBTree'1.get_Item(Int32 index)
System.Data.Index.InitRecords(IFilter filter)
System.Data.Index..ctor(DataTable table, Int32[] ndexDesc, IndexField[] indexFields, DataViewRowState recordStates, IFilter rowFilter)
System.Data.Select.CreateIndex()
System.Data.Select.SelectRow()
System.Data.DataTable.Select(String filterExpression)
(手打ちなのでスペルミスがあるかも)
-----------------------------------------------------

排他していないのが原因と推測しているんですが、簡単に再現させる方法ってありますか?
サンプル(SelectとUpdateを別スレッドで同時実行)で実験してるけど、
なかなか再現しないんです。

789NAME IS NULL:2007/08/10(金) 13:43:20 ID:???
>>682
今ちょうど Connection 周りテストしてたから Npgsql もテストしてみたら
Boolean も問題なく認識するしフォームへのバインドも普通にできるね

職場のアプリだからもうちとテストしてみるけど Unicode で問題なければ
しばらくこれ使ってみるよ

遅レススマソ
790NAME IS NULL:2007/08/26(日) 14:29:21 ID:mA+SLkGt
>>788
探しに行こうとしている行のインデックス番号がないだけじゃないか?
DataRowsが5行しかないのにインデックスの5みにいってるような・・・

まぁマルチスレッド使うようなやつでそんなやつはいないか(´ヘ`;)
791777:2007/08/27(月) 12:13:38 ID:w1KFwrAL
>779
マジトンクス。

そんな問題があるのか…
データ追加はDataGridView使わずに、毎回ちゃんとフォーム入力されてINSERT発行するようにしてるよ。
助かったー

でも、そのデータ追加で困ってることが…

mdbってDateTime型しかなくて、Date型がないんですよね・・・
書式で 日付(S)を指定してるのに

UPDATE testTable
SET 最終日 = '2007/01/01'
WHERE (通し番号 = 3)

ってSQLを送ると、なぜか 2007/01/01 00:00:00 と入力されている・・・
日付の部分いらんのに(>_<)
792777:2007/08/27(月) 12:24:28 ID:???
sage忘れた。スマ

>ってSQLを送ると、なぜか 2007/01/01 00:00:00 と入力されている・・・
>日付の部分いらんのに(>_<)

これ時間の部分の間違いです。
793NAME IS NULL:2007/09/05(水) 08:42:48 ID:kKr4913s
あげ
794NAME IS NULL:2007/09/06(木) 00:01:29 ID:???
datatableの内容をストアドプロシージャのテーブル変数に渡すことは可能ですか?

それが無理であればdatatableの内容を一時テーブルにセットしたいのですが
datatableを1行ずつ読んでinsertするしか無いのでしょうか?
795NAME IS NULL:2007/09/07(金) 21:27:29 ID:???
>>794
>datatableを1行ずつ読んでinsertするしか無いのでしょうか?
そうだろうねぇ
できれば便利だなぁと思ったことはあるけど

SQL2005のCLR使ってなんとかならんのかな?
796NAME IS NULL:2007/09/08(土) 10:05:52 ID:???
できるようになったとしても SQL Server だけだろうな
SQL ベースの他社製でオブジェクト渡すなんぞできるはずもなく

つか手作業で insert 発行するのがそんなに手間か?
797NAME IS NULL:2007/09/08(土) 10:32:53 ID:???
>>794
DataTable の中に入ってるなら、InsertCommand を書き換えて
Update() すればいいんでね?
798NAME IS NULL:2007/09/09(日) 20:34:59 ID:???
バルクコピーとか配列を用いたinsertとかになるのかな?
どっちみちADO.NETは対応してないと思うが
799Anchan:2007/09/10(月) 20:59:09 ID:E8JC2cpC
みなさん、分からないことがあるので、教えてください。
ado.net で oledb の接続で、アクセスのmdb ファイルに接続しています。
mdb には sqlサーバーへリンクしたリンクテーブルと、
アクセスのテーブルがあります。

問題は更新クエリなんですが、
アクセスでは、両テーブルのキーで inner join で結ばれたデータの一括の更新(アクセステーブルにあるデータが更新対象で、sqlのテーブルを更新)
のクエリは問題なく動くんですが、

.net からの 同じsql 分を作成して、executenonqurey だと
更新できません。ado.net だと一件ずつ処理するしかないのでしょうか?

よろしくお願いします…
800NAME IS NULL:2007/09/10(月) 22:29:20 ID:???
>>799
そんな事ないべ
>更新できません
具体的に
801NAME IS NULL:2007/09/10(月) 22:48:57 ID:???
エラーを出すならそのメッセージを一言一句違わずに書き出してみよう。
802Anchan:2007/09/10(月) 22:59:06 ID:E8JC2cpC
書き込みありがとうございます。

エラーメッセージは…
すいません、すぐには詳細はかけませんが…確か、
呼び出しに失敗と 言うようなエラーだったと思います。
クエリは、アクセス上で動かすと動きます。
ちなみにクエリは、

update sqlTable as A inner join accessTable as B
set A.[aa] = B.[bb]

と言った様な感じです。お願いします。
803NAME IS NULL:2007/09/18(火) 11:07:51 ID:3V4XUTTs
>>794

postgresで失礼

create table 一時テーブル as select * from coyp元

でまるまるコピーできます。
抽出条件書いたらその結果のみをコピーします。

SQL鯖では知らんけど(^^;)
804NAME IS NULL:2007/09/28(金) 01:46:59 ID:???
>>802
それじゃその断片的な情報からエラーメッセージを特定できない限りわかんねーな。
回答は期待できないから、エラーメッセージを全部コピペしてくれ。
805NAME IS NULL:2007/10/22(月) 07:48:51 ID:pch+h7TS
保守
806NAME IS NULL:2007/10/23(火) 10:08:04 ID:???
SQLServer以外のDB使うとき、O/RMapperって使います?

ASP.NETとSQLite.NETなんですが…。
807NAME IS NULL:2007/10/23(火) 10:43:57 ID:???
使うひとは使うだろうし、そうでないひとはそれなりに。
オレは使わない派、直でごりごりクエリー書く方が性に合ってる。
808NAME IS NULL:2007/10/23(火) 10:45:25 ID:???
>>806
ADO.NETの型付けされたデータセットで何か不自由してるのか?
809806:2007/10/23(火) 11:04:56 ID:???
>>807-808
トンクス。
普段開発がJavaなので、.NETの開発方法が
どんなのか知りたかったのです。

直にクエリー操作しても扱うデータが大した
量じゃなければ良いのですが、表示画面が
結構あるのでなんかないかなぁ…、と。

助かります。
810NAME IS NULL:2007/10/23(火) 11:40:15 ID:???
操作元と同名のテーブル名を持つ別のMDBファイルをINや[]で直接指定している場合
参照するテーブル名にどうやって別名を与えればいいんでしょうか?
SQLはこんな感じです、テーブル名が違う場合はこれで動きました

Delete tbl1.* From tbl1 Inner join [path].tbl2 ON (tbl1.fld1 = tbl2.fld1)
811NAME IS NULL:2007/10/23(火) 21:03:30 ID:???
>>810
普通にそれぞれのRDBMSの流儀に則って別名つければOKだと思うけど
812810:2007/10/24(水) 15:35:44 ID:???
操作先も参照元もMDBでJet4.0を使ってます
上記のSQLの記述を生かしつつ別名を与える方法が解らないんです・・・・・
813NAME IS NULL:2007/10/26(金) 12:30:22 ID:VGzUxJqZ
FROMのところのテーブル名の後に TABLE1 AS HOGEHOGE
でいいんじゃないの?

ほかのところのアクセスは TABLE1 →HOGEHOGEで
814NAME IS NULL:2007/11/11(日) 21:47:56 ID:Q6d7lQe/
age
815CfdByoOEFilAoPHp:2007/11/12(月) 09:36:08 ID:???
816NAME IS NULL:2007/11/12(月) 10:48:16 ID:???
何のリンクか恐くて見られない。
817NAME IS NULL:2007/11/12(月) 13:22:57 ID:???
みんなトランザクションするときは手動で BEGIN COMMIT 送ってる?
それとも Transaction クラス使ってる?

どーでもいいことなんだけど、仮に Transaction クラス使うとすれば
どういうメリットがあるのかちと気になったもんで
818NAME IS NULL:2007/11/12(月) 22:41:46 ID:v5cjQ56U
>>817
Transactionに関しては、>>554-556あたりで話題に出てるよ。
スタンドアロンだったり、DBを複数に分けていない場合は、
Transactionクラスを使う必要性は無いと思うよ。
819NAME IS NULL:2007/11/13(火) 13:19:40 ID:???
>>818
参考になりやした。ありがとね
俺もだめだな過去ログ&MSDNくらいちゃんと見ないと
820NAME IS NULL:2007/11/14(水) 02:35:40 ID:ILbp4//g
>>819
でも実際迷うだろ

俺は迷って1日調べるのに費やしたことがある
821NAME IS NULL:2007/11/15(木) 14:15:16 ID:???
>>820
迷うなぁやっぱ、、俺自身が DB 経験&.NET 経験薄いのもあって余計。
.NET に依存した書き方のほうが保守はわかりやすいかもしれんけどなぁ

っつーことでしばらくは簡単な処理に関しては、汎用の Transaction 用クラス作って
どっちでもできるようにラッピングして様子見することにしましたわ

ありがとね
822NAME IS NULL:2007/11/15(木) 19:22:34 ID:703KYpiO
ADO.NET OLEDB にて C# を利用して Excel ファイルの編集を考えています。

そこで発生した例外なのですが、

"INSERT INTO [sheet$](WordName, Param) VALUES('データ', -1)"

という SQL 文に対して、

「INSERT INTO ステートメントに認識できないフィールド <フィールド名> があります。
正しい名前を入力したかを確認して、もう一度操作してください」

と言われました。

Excel のシートは存在します。
また、 HDR = NO にて一行目には WordName と Param という列名も存在します。

他に考えられる原因はありますでしょうか?

よろしくお願いします。
823NAME IS NULL:2007/11/15(木) 19:36:03 ID:703KYpiO
すいません、 HDR=YES です。
824NAME IS NULL:2007/11/15(木) 19:40:02 ID:703KYpiO
すみません、自己解決しました。
825NAME IS NULL:2007/11/15(木) 21:16:19 ID:???
ここまで詳しく書いたのならば、その自己解決の内容を書いたらどうだw
826NAME IS NULL:2007/11/15(木) 22:18:50 ID:???
HDR = YES のつもりが、コピペ作業の過程で NO に書き換えられていました。
>>823 の書き込みに際してコードを確認していたところ発覚しました。
827NAME IS NULL:2007/11/15(木) 22:59:45 ID:???
聞きたいことをひとに伝えている間にバグを見つけるのは良くあること。
説明するためにそれまでの視点から一歩離れて流れを追っているうちに、岡目八目
な状況になるからだろうね。
828NAME IS NULL:2007/11/20(火) 20:45:31 ID:???
OLEDBを利用して、mdbファイルにアクセスしています。
データセットデザイナで以下のsql文を発行しているのですが、パラメータの部分が無視されているようです。

SELECT * FROM test1
ORDER BY ?

という風に、カラム名に?を指定して動的に並び順を変えたかったのですが…

「?」が指定できるのは、パラメータだけで、カラム名を指定することはできないのでしょうか? 
何かいい方法があれば教えていただけると嬉しいです。

829NAME IS NULL:2007/11/20(火) 21:23:31 ID:???
>>828
ORDER 句で指定するカラム数分、あらかじめクエリーを
作っておくくらいしかないね。

もしくは、動的にSQLを組み立てるか。
830828:2007/11/20(火) 21:31:03 ID:???
>>829
クエリを一杯作らないといけないから面倒なんですよね・・・

やっぱり動的に組み立ててDataReader作るしかないですか…
VS2008あたりでここらへん対応してくれないかなぁ…

831NAME IS NULL:2007/11/20(火) 22:11:48 ID:???
>>830
DLINQ、といいたいところだけど、MDB は未対応か・・・
832NAME IS NULL:2007/11/20(火) 22:53:27 ID:Qo77iwJh
C#で下記VB6の処理と同じ事をしたいのですが、
VB6+DAO接続のようにうまくいきません。

(Oracleの社員マスタをmdbにインポートする)

Dim db1 As Database

'DSN接続文字列
Const DSN As String = _
"ODBC;DSN=abc;SRVR=orcl;UID=USER;PWD=Admin;"

'DAOでOracleに接続
Set db1 = Workspaces(0).OpenDatabase("", True, False, DSN)

Dim strSQL As String

’社員マスタのインポート
strSQL = "SELECT * INTO USER_SHAIN " & _
"IN '" & "C:\abc.mdb' from SHAIN"
db1.Execute strSQL

mdbにODBCでOracleにリンクして上記SQLを発行すれば
うまくいきそうなんですが
空のabc.mdbに直接Oracleのデータをインポートするには
C#+ADO.NETではやはり無理なのでしょうか?
VB+DAOでできてC#+ADO.NETではできないのは
何か悔しいです。
833NAME IS NULL:2007/11/29(木) 00:03:52 ID:???
>>832
もう見てないかも知れないけど
・まずC#は分かってるんだろうな?
・C#わかんないならVB.NETにしましょう。悪いことは言わない。
・C#/VB.NETでもDAOは使えるので将来性を考えないなら
 参照設定でCOMのタブから探してきて使いましょう。
・「うまくいきません」だけだと罵られるのがオチです。
・無知を棚に上げて「やはり無理」とか知ったかぶりするなボケ。
・Oracleは知らんのですが、SQL ServerのDTSみたいなデータ変換サービスは
 ないんでしょうか?
・OdbcDataAdapter を AcceptChangesDuringFill で DataTable に読み込んでから
 別のOdbcDataAdapter で Access に INSERT すればいいと思います。
・「mdbにODBCでOracleにリンクして」ってなところで怪しいなあ・・・
834NAME IS NULL:2007/11/30(金) 10:14:41 ID:iP4Q6gml
どなたか対応策をご存知ではないですか?
環境:
Win2003ServerR2 SP2 英語版 最新パッチインストール済み
Microsoft SQL Enterprise Manager Version8.0

現象:
ADOを使って、以下のコマンドでを使ってDBを新規作成しました。
"CREATE DATABASE MyTestDB
ON PRIMARY (NAME = MyTestDB_DAT ,FILENAME = 'D:\MyTestDB\MyTestDBData.mdf', SIZE = 1MB,FILEGROWTH = 10%,  MAXSIZE = UNLIMITED)
LOG ON (NAME = MyTestDB_LOG, FILENAME = 'D:\MyTestDB\MyTestDBLog.ldf',SIZE = 1MB,  FILEGROWTH = 10%,  MAXSIZE = UNLIMITED )"

次にEnterprise Managerを使って、作成したDBの完全バックアップ→差分バックアップを行いました。
この時点では完全・差分共にバックアップは正しく取れています。
この後ntbackupを使ってD:\以下にあるDBには関係の無いファイルをバックアップすると、
MyTestDBのリストアダイアログを表示したとき作った覚えのないバックアップセットが自動的に作られてしまい、リストアができなくなります。

また、D:\MyTestDB1 D:\MyTestDB2 と複数DBを作って同じことを試すと両方のDBに影響が出ます

もしスレ違い、板違いのようなら誘導お願いします。
835834:2007/12/07(金) 10:47:13 ID:???
スレ違いのようなので、Microsoft SQL Server 総合スレに移動します
836bGUyClcynKftAuE:2007/12/10(月) 12:27:00 ID:???
837NAME IS NULL:2007/12/15(土) 00:29:35 ID:RcQd2CIu
ADO.NET+Data Provider For Oracle でOracleへの接続ですが
Oracle10gR2とOracle11gには接続可能でしょうか?

当方、Oracle9iでは接続の実績があるのですが上記のバージョンに変更しようと思っています。
838NAME IS NULL:2007/12/16(日) 19:09:50 ID:???
>>837
こっちにその環境が無いので実証してからの返答は出来ないが、
ニュースには大丈夫だと書いてあるから接続可能だと思うよ。

オラクル、「11g」は開発者にも有用と自負
http://www.itmedia.co.jp/enterprise/articles/0707/17/news027.html

> Oracleはまた、あらゆる.NET言語からOracleデータベースへの効率的な
> ネイティブアクセスを実現する、「Oracle Data Provider for .Net」も
> 提供している。同技術は、MicrosoftのADO.NET 2.0に対応している。
839NAME IS NULL:2007/12/16(日) 19:18:10 ID:???
Microsoft(R) Visual Studio(R) 2008 日本語版の開発を完了、完成版の提供を開始
http://www.microsoft.com/japan/presspass/detail.aspx?newsid=3300
> 2 月 1 日よりボリューム ライセンス、2 月 8 日にパッケージ製品を発売
> Visual Studio 2008 Express Edition の Web ダウンロード提供を 12 月 18 日より開始

「Visual Studio 2008」の日本語版をリリース
http://www.itmedia.co.jp/enterprise/articles/0712/14/news137.html


また今まで作ったプロジェクトが動かなくなったりするのかなぁ。。。
利便性よりも、安定性を考えたものにして欲しいな。
840NAME IS NULL:2007/12/16(日) 19:57:34 ID:???
>>839
>>また今まで作ったプロジェクトが動かなくなったりするのかなぁ。。。

2003で作ったのを2005に変換するだけで、わやくちゃになったしなぁ。orz
VB6の関数を残しているくせに、前バージョンとの互換性がなくなるってどんだけー。
841NAME IS NULL:2007/12/20(木) 20:39:12 ID:???
今の時期は、.NETへ移項中なので安定しないという状況なのかなぁ。
それとも安定をさせる気が無いのかなぁ。
無料配布方に切り替えたから、代わりに頻繁にバージョンアップ方式にしたとか。
ここまでひどい状況だと、だんだんと勉強する気がなくなってくる。
842NAME IS NULL:2007/12/20(木) 20:41:06 ID:???
おまえら、.NET Framework 3.5 の仕組みを見てから言えよ・・・
843NAME IS NULL:2007/12/20(木) 23:11:52 ID:8r4piS37
>>842
見てきた見てきた!
東の空でオレンジ色に光って不規則に飛んでたよ!
844NAME IS NULL:2007/12/21(金) 17:43:47 ID:???
プロジェクトを作る際、対象となるフレームワークを選択したり
出来るというものを言っているの?
それ以前に、開発したPC以外において、WindowsUpdateを
最新にするなどして環境を整えていてもアプリが動かない場合が
結構あるといいたいの。
開発をしたのと同じバージョンのVisualStudioを入れてみても
動かなかったしなぁ。
845NAME IS NULL:2008/01/14(月) 01:42:47 ID:???
今回のバージョンアップでは、ADO.NETは大きな変化はなかったのかな?
846NAME IS NULL:2008/01/14(月) 01:48:20 ID:???
>>845
- LINQがらみ
- エンティティフレームワーク(未搭載)
- SQL Server 2008 がらみ
847NAME IS NULL:2008/01/15(火) 22:11:15 ID:OwNq3nB/
C#のTableAdapterに関して教えてください。

TableAdapterを使って関連付け(Relation)されている
テーブルのDBの行を削除することって出来ますか?
例えば以下の二つのテーブル(親:Table1 子:Table2)で
Table1のIDの"ID1"の行を削除すれば
Table2のIDの"ID1"の行が自動的に
削除されるみたいな・・・。

ここでなくてC#スレですかね。

[Table1]
ID Name Age
----------------
ID1 Yamada 20
ID2 Hanako 18

[Table2]
ID Height Weight
-------------------
ID1 170 65
ID2 160 50
848NAME IS NULL:2008/01/16(水) 18:27:51 ID:???
>>847
ここはやや過疎りぎみなので、C#スレでも聞いてみるといいと思う。
解決方法が分かったら報告してくれると、なおよろし
849NAME IS NULL:2008/02/02(土) 19:46:10 ID:???
最近は、「ADO.NET」でぐぐったりすると、いろいろヒットするようになってきたね。
前は、「"ADO.NET"」としなければ、ADOのページがヒットしたりしてた。

DB接続に関して初めて学ぶ時、使いやすさを徹底したMSの製品を最初に
勉強すると良いかなと思ってやったけど、逆に非常に苦労したな。
これじゃなくて、PerlのDBIやPHPのpg_Connectを先にやればよかった。
850NAME IS NULL:2008/02/02(土) 21:06:14 ID:???
2.0対応の書籍が出てたんだね。いつの間にって感じだ。

プログラミングMicrosoft ADO.NET2.0
http://www.amazon.co.jp/gp/product/4891005491/ref=sib_rdr_dp
851NAME IS NULL:2008/02/10(日) 10:36:43 ID:???
TableAdapter使ってる人いる?
ウィザードはどうもあわないんだよね・・・
852NAME IS NULL:2008/02/17(日) 01:18:56 ID:???
サーバカーソルの搭載しないのかな
853NAME IS NULL:2008/03/01(土) 23:06:44 ID:???
linq使うから、ado.netはもう使わないって方向になるのかな?
せっかく使いこなせてきたかなって感じにまでなれたのに・・・
854NAME IS NULL:2008/03/09(日) 19:03:52 ID:???
ほす
855NAME IS NULL:2008/03/21(金) 07:56:33 ID:???
ほさない
856NAME IS NULL:2008/03/31(月) 01:28:10 ID:???
ほす
857NAME IS NULL:2008/04/14(月) 11:52:44 ID:???
.NET って濁点付き半角カナもきっちり一文字で認識してくれるのね

便利だし親切だなぁ、素敵・・・orz
858NAME IS NULL:2008/04/14(月) 13:38:09 ID:???
>>857
データベースの照合順の問題なのでは?
859NAME IS NULL:2008/04/15(火) 10:08:30 ID:???
>>858
あ、別にそんな大層な話でもなかったりするw

DataView の RowFilter で半角マッチさせる時に
'カ*' とかで検索かけると ガ にヒットしてくれないのよ

文字として見れば当然だし多くの場合はこっちの方が便利だと思うから
いいんだけど、知らないとはまるなぁと思った。
半角ってどうもバイト単位で考えちまうもんで・・
860NAME IS NULL:2008/04/15(火) 18:54:42 ID:???
>>859
カがあったら
or ガ とか条件追加してやれば?
861NAME IS NULL:2008/04/16(水) 10:41:16 ID:???
>>860
だよな、そうした

データベース側の正規表現マッチだと ゙ も一文字認識だったから
ちょっと違和感があっただけなんよ

dね
862NAME IS NULL:2008/04/24(木) 13:37:11 ID:???
SQL Server2005とADO.NET 2.0についてだけど

2.0から dataset.RemotingFormat =SerializationFormat.Binary
てのが追加されたけど
dataadp.Fill(dataset) みたいな使い方には効果ないの?
863NAME IS NULL:2008/06/01(日) 23:02:55 ID:???
保守
864NAME IS NULL:2008/06/02(月) 01:26:41 ID:???
5月はどこいった!?
865NAME IS NULL:2008/06/02(月) 16:15:41 ID:gBCGUa8J
>>851
>>850 にいろんな使い方あるよ
866NAME IS NULL:2008/06/17(火) 08:08:02 ID:???
>>865
サンクス
867NAME IS NULL:2008/07/03(木) 04:42:55 ID:???
>>864
いい事いうじゃねえか。
出来るんだな?
今すぐ頼むぞ。
868NAME IS NULL:2008/07/27(日) 23:14:42 ID:BMrKOhf6
保守
869NAME IS NULL:2008/08/07(木) 17:43:11 ID:V/wrdbRm
アドネットのどんなDBも同じようにコントロールできるという機能は、
誰がいつどんな方法で開発したかさっぱりなDBでも
意識せずにコントロールできるのでしょうか?
870NAME IS NULL:2008/08/07(木) 20:14:11 ID:???
>>869
むり
871NAME IS NULL:2008/08/08(金) 02:40:31 ID:???
>>869
ADOが対応しているRDBならどんなものでも意識せずに使える
872NAME IS NULL:2008/08/14(木) 11:24:06 ID:eNZ1xwTt
日付の追加を含むINSERT文作ってExecuteNonQueryしたら、「抽出条件でデータ型が一致しません。」と怒られる。

INSERT INTO EMP (MYDATE) VALUE (#2008/08/14#)

ってな感じなんだけど何か間違ってる?
ちなみに相手はMDB(Microsoft.JET.OLEDB.4.0)です。
873NAME IS NULL:2008/08/14(木) 11:38:03 ID:???
>>872
たぶん日付の指定が間違ってると思う。

DBはSQL Server?
SQL ServerならDBのヘルプのデータ型のところに
Datetime型の指定方法が詳しく載ってる。
時刻まで含めるとかなりのパターンがある。

あとそのシステムはasp(.net)ということはないよね?
874NAME IS NULL:2008/08/14(木) 11:40:49 ID:???
>>872
実際のコードでブレークかけて、そのSQL文が本当に生成されているか確認した?
変数をMYDATEやVALUEに入れてあるってだけじゃダメで、全文をトレースして
みよう。
875NAME IS NULL:2008/08/14(木) 11:43:45 ID:???
>>872
日付リテラルを#MM/DD/YYYY#にしてみるのも手だぞ。


>>873
相手はMDBって書いてあるだろwww

876NAME IS NULL:2008/08/14(木) 12:15:36 ID:eNZ1xwTt
みんな有難う。
事故解決しましたよ。


何気に、2008/08/14 12:00:00#としてみたら、今度はエラーが

「クリ式'2008/08/14 12:00:00#'の構文エラー :演算子がありません。」


2008/08/14#とすると、

「クリ式'2008/08/14#'の日付の構文エラーです。」

#2008/08/14#としたときと明らかにエラー内容が違う。
これはおかしいといろいろ調べたら、VALUE句の中でSELECTして持って
きている数値にNULLが含まれてました。

納得。

そのテーブルは俺が作ってる訳じゃないので、犯人に直させますw

877NAME IS NULL:2008/08/14(木) 14:47:23 ID:???
>>876
吊ってこいwww
878NAME IS NULL:2008/08/31(日) 16:47:53 ID:zVJzNbJk
保守
879NAME IS NULL:2008/09/07(日) 17:12:59 ID:xiwEOZ0b
保守
880NAME IS NULL:2008/09/09(火) 14:45:43 ID:???
Linqの登場で、DataSetを使ってAdapterでFillとかUpdateの方法って廃れるんですか?
881NAME IS NULL:2008/09/10(水) 19:29:43 ID:/Y9/Qvra
>>880
LINQはデータ取得の方はともかく、Updateは一応出来るってレベルだから
まだまだ廃れないと思う。
882NAME IS NULL:2008/09/11(木) 16:50:25 ID:XTz4FZ8n
環境 C#2.0 + OLEDB(Microsoft.Jet.OLEDB.4.0) + ACCESS2000

通常DBにSQlを投げる際、日本語のカラム名にはダブルクォートをつけて投げているのですが
ACCESS の日本語カラムをダブルクォートで囲ってSQLを投げると構文エラーになります。
ACCESSの場合は何か特殊な方があるのでしょうか?

以下のようなSQLを投げると
クエリの構文エラーです。クエリの句が不完全です。
というエラーが帰ってきます。

SELECT
   "コード"
   ,"名称1"
   ,"名称2"
FROM
   "テスト"
ORDER BY
   "コード"

実際にはダブルクォートは\"としてエスケープしていますが投げられるSQLとしては上記のような感じです。
よろしくお願いいたします。
883NAME IS NULL:2008/09/11(木) 17:40:03 ID:???
標準SQLでは、文字列はシングルクォートで囲みます
884NAME IS NULL:2008/09/11(木) 22:58:45 ID:???
sql = "@
SELECT
  'コード'
FROM
  テスト
ORDER BY
  'コード'
"
これでなげてみ
885NAME IS NULL:2008/09/12(金) 09:12:11 ID:???
>>883-884
回答サンクスです

シングルクォートで囲うと正常にGetDataTableが成功したので中をのぞくと・・・

Exper1000 Expre1001 Exprer1002 というカラムになり
中の値は
コード 名称1 名称2
というデータのレコードが実際の件数分・・・orz
886NAME IS NULL:2008/09/12(金) 09:15:15 ID:???
予約語やブランクを含んでなければ日本語名称でもそのまま使えると思うけど。
JETの場合は [ ] で囲むのじゃなかったっけな。
887NAME IS NULL:2008/09/12(金) 09:17:19 ID:???
>>886
即レスサンクスです

[]で囲ってみたところ正常に動作しました!
ありがとうございました!!
感謝です
888NAME IS NULL:2008/09/16(火) 14:53:50 ID:D2fPfihD
OdbcConnection.GetSchema("Tables", New String() {Nothing, Nothing, Nothing, "TABLE"})
↑これは有効な接続ね

これを呼び出すと

「要求されたスキーマ('Tables')がサポートしているよりも多くの制約が指定されています。」

って怒られるんだけど、何でだろう?

889NAME IS NULL:2008/09/16(火) 20:53:07 ID:???
要求されたスキーマがサポートしているよりも多くの制約が指定されているんだろう
890NAME IS NULL:2008/09/18(木) 00:30:24 ID:???
多分、要求されたスキーマがサポートしているよりも多くの制約が指定されてるんじゃない?
891NAME IS NULL:2008/10/04(土) 01:37:27 ID:8846L9bL
なんだよ。DataSetってRecordSetに替わるものじゃないんですね。
どっちかっていうとDataTableなんだね・・。

da.Fill(ds)して、ds.Tabls(0).Rows…ってやって、必死になってコーディングしてたよ。
da.Fill(dt)して、dt.Rows…のほうが綺麗じゃないですか。んもぉお。
892NAME IS NULL:2008/10/04(土) 11:03:24 ID:???
データアダプタには特定のデータテーブル専用のSelect文があるのに
データセットをFillさせようなんて無理じゃん。常考
893NAME IS NULL:2008/10/04(土) 15:19:18 ID:???
Datasetって、複数の表を溜め込んで、
アプリ側で複数の表のイメージを一括管理・使用できます的なものなんですよね。

ただテーブルをひとつSeletするだけならDataTableったほうが良さげですね。

このスレをきっかけになんとなく分かりました。
894NAME IS NULL:2008/10/04(土) 18:47:41 ID:???
List<DataTable> や Dictionary<string, DataTable> 使うぐらいなら、
DataSet使いましょうって事?

それプラス何か有るんじゃないの?
895NAME IS NULL:2008/10/04(土) 19:25:38 ID:???
>893
今までは、DataTable同士を集合演算できなかったから
Datasetってほとんど意味なかったが、
Linq to Datasetでようやく使い道が出てきたな。
896NAME IS NULL:2008/10/04(土) 20:45:16 ID:???
>>888-890の流れ噴いたw
ジンワリ来るなw
897893:2008/10/04(土) 23:09:46 ID:???
DBのひとつの表からデータをSelectして、
取得した列データをアプリ側でただ単に展開(使用)するだけのケースの話をしてました。

DataSetみたいな複数表を格納するデータ構造で管理する必要がないので、
それだったらDataTableのまま使った方がいいじゃんという話です。

そもそもFillで取得出来るのは、DataSetだけだと思い込み、
Fill(DataSet)によるSelectに拘ってたのが間違いでした。

なんていうか、DataSetに複数のDataTableを格納できるメリットを
よく理解してなかったので「DataSetでFillしとけば間違いないや・・」
と思いよく調べてませんでした.
898NAME IS NULL:2008/11/06(木) 19:00:51 ID:???
LINQについて調べていての感想
LINQは便利だけど、内部の動きを知っていないとパフォーマンスが悪くなる
場合もあることから、すべてがそれに置き換わることはなさそうだ。
入門の解説などには、SQL文を把握してから使った方がいいよ。みたいな
事も書いてあるしね。
なので、ADO.NETにおいても把握する必要がなくなるとは思えなくなった。
しばらくは、LINQは使わずに、ADO.NETを使ったコードを書いていこうと思う。
899NAME IS NULL:2008/11/10(月) 23:20:46 ID:???
ADO.NETって、ADOの進化系ではないよな。
ただの、非接続型のモジュール群だ。
となると、ADOを.NET上に移植した接続型の
モジュールがこの先出てくるんじゃないかと
思ったりするのだが、どうかな?
もう、LINQの方向に力を注ぐだけかなぁ
900NAME IS NULL:2008/11/10(月) 23:38:41 ID:???
馬鹿だろ。プログラミングADO.NET2.0を100回音読してから来い。
901NAME IS NULL:2008/11/11(火) 02:04:02 ID:???
無闇に馬鹿とかいうなよ
多分、古いADOのプログラムしか書いたことが無い奴が、.NETへ移行するのに悩んでいるだけ
902NAME IS NULL:2008/11/11(火) 15:59:40 ID:???
この話題はこのスレの1-100くらいで散々やってるね。既出もいいとこ。
903NAME IS NULL:2008/11/11(火) 21:37:32 ID:???
>>901
ちゃんとどうすればADO.NETを理解できるか教えてあげてるから
むやみに馬鹿よばわりしてるわけじゃない。
904NAME IS NULL:2008/11/11(火) 23:47:19 ID:???
SQLの書き方はSELECTくらいしか知らなくても、更新したり、削除したりが
出来るから、ほとんどSQLの書き方を知らない状態でもそれなりに動くものが
作れるADOは凄かったと思う。(INNER JOIN で読み込んでも、update出来るしね)
ちゃんと理解して無いのであれば、同時実行制御やネットワークの負荷などで
問題が出る部分はあるが。

そういう知識の状態でADO.NETやりはじめたもんだから、相当苦労したw
なんでINSERTやらDELETEやらを覚えないといけないのかと疑問に思いつつ
SQLを勉強したよw
905NAME IS NULL:2008/11/11(火) 23:55:08 ID:???
質問です。
DataReader使う時のサンプルコードは、new しないのばかりなので、
newしなくて良いということなのでしょうが、この理由について、
きちんと説明されてるものを探すにはどうしたら良いでしょうか?

DataReaderは、DBのデータを参照するだけの役割ではありますが、
クラスであり、そのメソッドを実行するのであれば、インスタンスは
必要だと思うのですが。
http://homepage2.nifty.com/inform/vbdb/net_mdb.htm

キーワードなど、ヒントとなるものでも結構ですのでお願いします。
906NAME IS NULL:2008/11/12(水) 00:41:37 ID:???
>>905
OleDbCommand の中の人が、あなたの代わりに new してくれてる。
907NAME IS NULL:2008/11/12(水) 22:08:13 ID:???
908NAME IS NULL:2008/11/18(火) 23:45:50 ID:???
レス遅れてすみません。>>905です。
ありがとうございました。
909NAME IS NULL:2008/11/19(水) 22:08:55 ID:???
死ねぐらい言われても仕方ない覚悟で書き込みます
でも、いきなり死ねわなしでよろ
C#+SQLサーバー)無料お試しセットで勉強してるんですが
dataGirdViewで、親子関係がある(リレーション)他のテーブルの参照って
<<<ドラッグ&ドロップ>>>で可能なのでしょうか?
クエリーとかXSDいじったのですが うまくいかなくて
コード手書きしないと できないんでしょうか?


商品コードから商品名を引っ張ってくるようなイメージ

CD001 うまうま棒(←こいつを商品マスターから持ってくる)
910NAME IS NULL:2008/11/20(木) 07:42:42 ID:???
SQLサーバで商品コードから商品名を引っ張ってくるようなビュー作ったら?
とか言ってみる
911NAME IS NULL:2008/11/20(木) 17:14:22 ID:???
SEEじゃLinqtoSqlできないんじゃなかったっけ
912NAME IS NULL:2008/11/21(金) 20:50:12 ID:???
SEEって、なんだろう海?
913NAME IS NULL:2008/11/21(金) 21:19:58 ID:FJqz2E1H
Netで見たけどコネしてSQLが常識と見た
datagridの達人求む
914NAME IS NULL:2008/11/21(金) 22:56:53 ID:Ftb3ChUG
>>912
俺もわからん。
VS2008 ExpressEdition sp1にSilverlight2 Toolkit入れたんだけど、SilverlightでDataGridとLINQのテストをしようと思って
VWDプロジェクトを作ってみたが、LINQ to SQL、ADO Entitysのどっちも名前空間不足でコードジェネレートとインテリセンスが
不完全。ビルドできねー。 [参照の追加]の.NET一覧リストにも出てこないし、わかんねー。(VC# WPFだと出てくる) orz
915NAME IS NULL:2008/11/22(土) 08:31:39 ID:rVCwylLd
909の件は・・・すれちがい?
916NAME IS NULL:2008/11/22(土) 19:23:08 ID:???
>>915
DB板は全般的に閲覧している人が少ないから、レスがつきにくいだけだと思う。
マ板のC#やVB関連のスレで質問してみると良いと思うよ。
917NAME IS NULL:2008/11/22(土) 23:30:31 ID:hKcaAN7u
>>916
らじゃ サンキュウです
918NAME IS NULL:2008/11/23(日) 03:32:45 ID:???
DataGridViewComboBoxColumn でだめかな
919NAME IS NULL:2008/11/23(日) 12:57:28 ID:AwUhrFhC
>>918
するどい
やはりそれですよね
でも選択にしか使わないのにコンボ使うのもどうかなと思いまして
でも作業効率考えると一考の価値がありますよね

しかし、私のイメージからするとPgは一レコード一レコード処理するイメージがあるんですけど
VBC#系はSQLでドーンって感じなんですかね
自分はデータの先頭から一行一行処理みたいな考え方なんですけどねぇ^^
920NAME IS NULL:2008/11/24(月) 16:42:51 ID:SCGbkJ/y
hoshu
921NAME IS NULL:2008/12/02(火) 20:58:05 ID:/ZZP+pb1
922NAME IS NULL:2008/12/05(金) 23:02:20 ID:8tUTVZdg
923NAME IS NULL:2008/12/08(月) 17:52:48 ID:???
924NAME IS NULL:2008/12/08(月) 19:15:28 ID:???
アメリカ本社の開発チームが凄いと思うとか書いてるって事は、君の実力の方は・・・
925NAME IS NULL:2008/12/14(日) 19:13:41 ID:8j0fAwAX
保守
926NAME IS NULL:2008/12/15(月) 07:44:52 ID:???
DB板ってこういうプログラム系の情報交換ってされてないから過疎りやすいよな。
ム板に移動した方がいいのかなぁ?
まだまだすべてがLINQでってわけにもならないんじゃないかと思うから、スレとしての
需要はあるとおもうんだけどな。LINQ使うにしても、その内部の動きは把握してなければ
非常に遅いプログラムになってしまったりするわけだし。
927NAME IS NULL:2008/12/29(月) 07:55:34 ID:???
保守しときます
928NAME IS NULL:2008/12/30(火) 21:50:23 ID:NDC5vo5R
LINQ単にSQL並び替えてMSの技術者囲い込みにしか見えないんですけど
SQLにくらべてLINQの優れてるところおしえて
929NAME IS NULL:2008/12/30(火) 23:30:47 ID:???
MSってこれまでの流れをみてみると、後追い&微妙に仕様を変更したものを開発・公開って気がする。
930NAME IS NULL:2008/12/31(水) 05:46:31 ID:???
LINQの優れてるところは対象がsqlだけじゃなくobject、xmlみたいなのも同等の処理で扱えるところ。
931NAME IS NULL:2008/12/31(水) 09:18:09 ID:ZwvDmfIc
でも オブジェクトはともかくxmlは実務で使いますか?
そんな希望聞いたことないです
いまひとつ利点が弱いような
オブジェクトのほうは便利なんでしょうか?
932NAME IS NULL:2008/12/31(水) 10:28:28 ID:???
むしろ、LINQ to XMLだけが実用的で便利で、他のは要らない。
933NAME IS NULL:2008/12/31(水) 16:13:12 ID:9ix+bu5f
>>932
猫 <またまたご冗談を・・・)
934NAME IS NULL:2009/01/04(日) 01:20:08 ID:???
SQLは手書きでゴリゴリ書いてるけどLINQはやる気にならないなぁ
データセットFillしたあとは表示したりするだけでそっからさらにLINQで
ゴニョゴニョするような事しないし
xmlもiniファイル代わりにしか使ってない・・・
935NAME IS NULL:2009/01/04(日) 09:58:14 ID:???
最近のMSの製品はXML対応っていうのを前面に出したアピールをしているが、
いまいち流行ってない感があるんだよなぁ。VRMLみたいにならなければ良いのだが。
936NAME IS NULL:2009/01/04(日) 11:53:13 ID:???
>>934みたいにiniファイル代わりに使うか、
ローカル・個人で使うツールでDB代わりに使うぐらいしかやったこと無いな。
937NAME IS NULL:2009/01/11(日) 00:36:10 ID:???
ADO.NETのメタデータ関係のAPIは、DBの違いを意識しないといけないから、
JDBCに比べると使いにくいな。
それ以外は圧倒的にADO.NETの方が好きなのだが。
938NAME IS NULL:2009/01/18(日) 23:28:23 ID:???
保守
939NAME IS NULL:2009/01/21(水) 11:12:17 ID:fTKjDGPM
C#でSQLServerファイルを扱うシステムを作っています。
データセットのデザイン画面で、TableAdapterのプロパティに表示される、UpdateCommandが
自動に生成されません。

何か考えられる原因がありませんか?

右クリック-構成で、詳細オプションを選択した画面で、
「INSERT,UPDATE,およびDELETEステートメントの生成」
をチェックするのですが、UpdateCommandは作られません。
また、「データファイルの更新」にチェックを入れても、次に同画面を開いたときには
チェックがはずれています。

何かアドバイスをお願いします。
940939:2009/01/21(水) 11:33:40 ID:???
自己解決しました。

テーブルに主キーが設定されてないと出る現象のようでした。
お騒がせしました。
941NAME IS NULL:2009/01/22(木) 00:20:18 ID:???
質問の内容とは違うことをいうけれど、過去ログにもあるように、ウィザードが
自動生成したSQL文をそのまま使用するのはあまりお勧めしないよ。
自分で書くのをお勧めする。
942NAME IS NULL:2009/01/22(木) 01:09:47 ID:???
>>941
なぜ?

いつまでも成長しないから?
それとも他に不具合の可能性とかあるんですか?
943NAME IS NULL:2009/01/22(木) 01:11:16 ID:???
>>942
自動生成されたSQL文見ればわかるでしょうに。
944NAME IS NULL:2009/01/22(木) 01:22:38 ID:???
>>943
簡潔に答えてやれよ。
もったいぶるほどのことか?

みみっちい奴だなあ。
945NAME IS NULL:2009/01/22(木) 01:23:31 ID:???
>>943
簡潔に答えてやれよ。
もったいぶるほどのことか?

みみっちい奴だなあ。
946NAME IS NULL:2009/01/22(木) 01:42:14 ID:???
パフォーマンスが著しく悪いからだよ。
あれしか使えない同僚が不憫でしょうがない。
947NAME IS NULL:2009/01/22(木) 01:53:20 ID:???
パフォーマンスが悪いw
948NAME IS NULL:2009/01/22(木) 02:22:26 ID:???
>>自動生成コードはパフォーマンスが著しく悪い。

自称Webデザイナーの知り合いがよく言ってた。
「最高のWebデザインツールはメモ帳」なんだってさ。
949NAME IS NULL:2009/01/22(木) 20:39:46 ID:???
なぜって聞いてるってことは、自動生成されたSQLを読んでないか、
読めないって事だな。
確かにGUIツールの発達によってSQLは書いたり読んだり出来なくても
いいようになってきてるが、そんなんだと必ず壁にぶちあたるぞ。
950NAME IS NULL:2009/01/22(木) 20:46:25 ID:???
たぶん業務でやってる人じゃないんだろう。
趣味でちょっとしたサイト作っててせいぜい100件程度のデータ、
更新等も型どおりの簡単なヤツのみとかなら
ムリに手書きを進める必要も無い。
951NAME IS NULL:2009/01/22(木) 21:04:58 ID:???

こんな奴ほど自動生成よりも汚いのを書いてることも多々ある
952NAME IS NULL:2009/01/24(土) 14:15:56 ID:SNFD0Fjw
仲間割れはやめろ見苦しいぞ
953NAME IS NULL:2009/01/24(土) 16:00:06 ID:???
自動生成されたSQLがどんなことしてるのか理解できないから
使いたくないってことね、おまえらもっと勉強しろよw
954NAME IS NULL:2009/01/24(土) 16:08:18 ID:???
SQLってそんなに難しいか?
勉強ってほどのもんでもないぞ。
中学卒業してる奴ならすぐマスターできる。
955NAME IS NULL:2009/01/24(土) 16:19:17 ID:???
だからそんな簡単なこともできないゆとりがフエテンだろw
956NAME IS NULL:2009/01/24(土) 16:22:40 ID:???
本一冊2-3時間ばかり読めばわかることなのにな。
ま、その程度のことすらしないのもどうかと思うが、
その程度のことでここまで高飛車になる奴もどうなんだろう。
957NAME IS NULL:2009/01/26(月) 00:00:48 ID:???
>>956
できるフリはやめておけ。
あ、自覚がないだけか。
958NAME IS NULL:2009/01/26(月) 13:46:02 ID:???
自分だけがずっと保守していくなら別にかまわないかも知れないが、
誰かにプロジェクトを継承させることを視野に入れた場合は自動生成されたSQLを保守していくのは地獄だぞ。
959NAME IS NULL:2009/01/26(月) 14:29:44 ID:???
自動生成されたSQLを手動でいじろうとするのが間違ってないか?
960NAME IS NULL:2009/01/27(火) 12:29:36 ID:???
自動生成では簡単なSQLしか発行できない。
961NAME IS NULL:2009/01/30(金) 08:25:26 ID:???
最近はdatasetに一気にデータをいれてdatasetで編集してDBに戻すみたいなんが主流なの?
オレみたいにdatareaderで一件ずつ読んで専用のクラスにセットしてから使うみたいなんは時代遅れ?
962NAME IS NULL:2009/01/30(金) 10:39:54 ID:???
アプリケーションの形態で使い分ける。
ADO.NETは疎結合が有効な場合に使おう。
963NAME IS NULL:2009/01/30(金) 14:57:03 ID:???
>>961
専用クラスの具体的な内容は知らんけど、
DataAdapterやDataTableのイベントを利用すると結構細かい制御も利いて便利だぞ。
予め型付DataSet用意しとけば、Intellisenseも利用できるんでコーディングもそこそこ楽。

そんな感じで扱うと、適当にデータバインド利用して画面に放り込めるんで
何も意識する必要がなくて楽。


DBに戻すときは内容やデータ量で判断。
データ量が多いときや、あちこちのマスタを参照して…なんてめんどいときは、
DataSetをそのままストアドにぶち込んで処理してしまったりする。
DBのテーブルとDataSetのテーブル結合させて手抜き処理w
964961:2009/01/30(金) 20:35:35 ID:???
専用クラスってのは、例えば社員クラスみたいなのがあって、社員A.給与みたいなんで
給料計算してくれるみたいなのを今までやってたんだけど、datasetを使うと
foreachでまわして給与計算(社員A)みたいな感じで関数呼ぶようになるよね?
で、この給与計算する関数をどこのクラスにいれてやるのがスマートなんだろうかと
悩んでいるところなのです。
965963:2009/01/31(土) 02:52:40 ID:???
>>964
数年前に給与計算やったときは、Partial Classを利用して型付DataTableの中に計算ロジック放り込んだ。

DataTableのColumnChangedイベントをチェックして、単価Columnや時間Columnなどに変更が加えられたらば
計算ロジックを呼び出して、DataTableの給料Columnを更新してやるよな感じ。

一度に全部計算するのではなく、必要な部分だけ計算・更新していくのでデバッグは楽だった。
スマートとは言えんw
966NAME IS NULL:2009/01/31(土) 04:52:49 ID:???
>961
俺もその辺は気になる。
datareader使ってる例の方がよく見かけるような気もするし。
967NAME IS NULL:2009/01/31(土) 17:08:58 ID:???
DataReader使うのはコーディングの上では手間が掛かるけど理解しやすいし
DataSet、DataTableは便利だけど使い方を調べるとき何処から手をつけていいか結構なやんだ
968NAME IS NULL:2009/02/01(日) 10:51:22 ID:???
ま、結局は保守や引継ぎはどの範囲で行うのかを予測した上でってことになるんだろうな。
クラスは基本的に多機能な方が便利であるが、その都度使い方を覚えなおさなければ
ならないというデメリットがついてくる。
ADO.NET そのもののバージョンアップによって仕様変更が行われることも想定すると、
動作などが単純な DataReader の方が仕様変更が少ないと思う。
となると、自分で作るプログラムは DataReader を使ったほうが流用が利きやすいのではないだろうか。

>>76 にあるように、ADO.NET は「簡単なことを簡単にすませる」という要件のものでしかないので、
そうでない状況のプログラムでは使えないので使わないほうが良いと思う。
これまでの Accessを使った、スタンドアロン、もしくはそれに近い案件の場合は、DataSetなどを
ばんばん使ったほうが早くて良いと思う。
969NAME IS NULL:2009/02/01(日) 20:22:18 ID:???
現場のマとして条件反射で噛み付いてしまうが、
使い回しが効くという名分の元にゴミを維持・生産してるケース多すぎ。

LoopとIfが大好きで、ADO.NETに適応出来ないする気も無いって連中が
免罪符としてそれを利用することが多いのだな。
なので、明確にDataReaderでなければいけない理由を説明できないのなら
ADO.NET標準でやるようにしてくれ・・・趣味の範囲で自己完結する分にはどうでも良いけど。
970NAME IS NULL:2009/02/01(日) 20:57:01 ID:???
ADO.NET標準についてkwsk
971NAME IS NULL:2009/02/01(日) 21:04:02 ID:???
>>969はどのようなコーディングを推奨しているの?
1.>>963のようなコーディング(楽なため)
2.過去ログにあるようなDataSetを使わず、DataTableに格納する方法(軽いため)
3.上記以外

もちろん、「場合による」なんて回答は辞めて欲しい。
どういう状況で、LoopやIFを使いまくってて困ってるのかを書いて欲しい。
972NAME IS NULL:2009/02/01(日) 21:29:26 ID:???
>>971
DataReaderで一件ずつ取って
label1.text =
label2.text = ・・・ループ回しながら繰り返し
その中で条件分岐してまた別のSQL実行してマスタの中身だけ取って来て、
その値を見てまた分岐して…みたいな。更新ときも似たようなもん。

で、途中でどこにいつ何が入ってるのか自分でもわかりにくくなったのか
Public変数使い出したりしてな。

そんな底辺会社に2度も引っかかった自分もマヌケだが
どうしてそういうコーディングするかを聞いたら使い回しが出来るんだとさ。
全員では無いが、大半そんな返事だったよ。
973NAME IS NULL:2009/02/01(日) 22:27:24 ID:???
>>971
それはダメなコーディングで969推奨のは?
974NAME IS NULL:2009/02/02(月) 00:25:57 ID:???
>>973
普通にデータバインドぐらいは使ってくれ、
何でもかんでもLoopとIfで処理しないで、ドトネト利用してくれ。
ついでに横長テーブル作りたがる奴は死ね。
それ以上に書くことなんてあるかいな。

ダメなコーディングの理由を「流用が利く」にする連中が居て、
「他でもそうしている」(もちろん、どんなケースで何故そうしたかはスルー)を
言い訳に使いたがるのが居る。

わざわざ現場でそんな連中に言い訳くれてやんなと。

と、書いてるうちに自分も有害だと思えてきたのでこのままデスマの中で吊ってくる。
975NAME IS NULL:2009/02/02(月) 04:13:59 ID:???
DataReaderは、速度的にはどうなの?
976NAME IS NULL:2009/02/02(月) 07:35:29 ID:???
DataReader は、速度最優先で設計されてるらしい。
だから、データを読む時は一方通行にしか動かせない。

独自でベンチを計ったことは無いが、速度や軽さ優先で
あれば、DataReaderを使うしかないと思う。
977NAME IS NULL:2009/02/02(月) 20:14:13 ID:???
DataReaderは、速度優先で設計されてるものだから、そればかりを優先的に
使う状況もあるかもしれないが、その理由が、「流用が効く」はおかしいと思う。
特に大きな制約が無い状況で、自由に使っていいという状況であれば、
DataTableを使うのがメインになると思うけどな。さらに、Updateは
DataRowの状態を見てSQLコードを生成させる方法とか。
978NAME IS NULL:2009/02/02(月) 20:50:00 ID:???
>>974で触れている、DataReaderを優先的に使いたがる人って、
AccessやVB6でADOをバリバリに使ってた人たちってことでおk?
あれは、こんな感じのソースを書くのが定番になるみたいだし。

' rsはrecordsetのこと
Do Until rs.EOF
' Ifなどの処理
rs.MoveNext
Loop
979NAME IS NULL:2009/02/03(火) 01:43:46 ID:???
using rs as Recordset = cmd.ExecuteReader
while rs.read

end while
end using
980NAME IS NULL:2009/02/03(火) 03:20:10 ID:???
メモリ上にDataTableやDataSetの形で置いとくより、HogeClassのListなり
Dictionaryの形で置いといた方が便利な事が多くない?

フォームへの半自動表示を考えるとDataTableの方が便利な事も
あったかもしれないけど、WPFだとデータテンプレートでその辺どうでも
よくなったし。
981974
>>978
それでおk おかげで、ここ一ヶ月酷い目にあってきたぜ。
赤字になったのは俺のせいじゃねぇ・・・orz


Dim int手数料合計 As Integer
Do Until rs.EOF
 If rs![種別] = DLookup("種別", strSQL, "区分 = 'HH1101'") THEN
   int手数料合計 = DLookup("手数料", strSQL, "区分 = 'HH1101'")
 End If

 '−脳が思い出すのを拒否してるロジック−

rs.MoveNext
Loop

'出力が遅いのでワークテーブルに入れておく
Call G_Cnn.Execute("INSERT INTO ワーク・・・略