1 :
NAME IS NULL :
05/01/02 10:54:49 ID:XCpHoqqm ADO.NETに関する質問・雑談・評価 etc 何でもどうぞ。
2 :
NAME IS NULL :05/01/02 10:55:45 ID:XCpHoqqm
3 :
NAME IS NULL :05/01/04 23:23:17 ID:gtuR+WFj
ADO.NETはADOから派生されたという表現だが、この両者って別物のような感じがするのだが・・・・ 使用しているクラスにしても共通点が少ないし、 ADO.NETは.NETフレームワーク上に位置し、ADOはOS上に乗っている。 漏れはADOをこなしてきて、ADO.NETに入った性質だが最初が苦労した。 考え方が全然違う感じがしたよ。
>>3 つーか、本当に考え方違うでしょ。
ADOは接続しながらデータ操作するのが普通だけど、ADO.NETは非接続推奨っていうか、他に手段が無い。
うん。だから、逆にADO.NETっていう名前がまぎらわしいと思う。 別の名前にすればよかったのに。。。 漏れも、ADOをこなしてきてADO.NETに入った性質だが DataSetとかDataViewとかクラスの使い方がいまだに分からん ところがある。。。欝だ。
ソースコードで、ADOと近いのはADO.NETよりも、DAOの方だな。w
7 :
7 :05/01/09 20:34:18 ID:wBFa/DC9
データセットの生成を行うと 「生成中にエラーが発生しました。この問題を解決するには、 プロジェクトをビルドし、エラーを修正してから、データセットを再生成してください。」 と出ます。 xsdというのは作成されるのですが、そのままビルドすると ビルドエラーとなり、 「クラス 'dataRow' は、それ自体から継承することはできません」 と出ます。 どのようにしたらいいのでしょうか? 'dataRow' は 'dataRow' から継承されます。
>>7 どういうプロジェクトを作っていて、どういう過程でデータセットの生成
を行おうとしたのかを教えて欲しい。
その情報がないと、再現しようがないのでなんとも。。。
9 :
7 :05/01/09 20:56:57 ID:wBFa/DC9
>>9 私は今までその方法でデータセットを作ってきたが、生成時にエラーが
起きたことは一度もありませんでしたです。。。
で、試しにmdbファイルを移動させてみたり、テーブルを削除してみたり、
読み取り専用ファイルにしてみたりしたが、
>>7 に書いてるような
エラーはでなかった。。。
もうだめぽ。
何かコードを書いたり、表記してたもの以外のオブジェクトを配置して
たりはしてないんだよね?
だったら、プロジェクトファイルとmdbファイルをさらして
もらうしかないかも。。
11 :
7 :05/01/09 21:58:24 ID:wBFa/DC9
>>10 プロジェクトに関しては新規作成して、まっさらなフォームに対して
行ってます。
mdbはAccess2000です。
わざわざやっていただいてほんとにありがとうございます。
12 :
10 :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
クラス 'datarow' は、それ自体から継承することはできません 'datarow' は 'datarow' から継承されます。 というエラーメッセージは、ソリューションエクスプローラで 新しい項目の追加でクラスを追加して、以下のソースコードを追加すると 出てきたが、やっぱりデータセットはちゃんと作れる。。。 わからんぽ。誰か助けて・・・(泣 Public Class datarow Inherits datarow Public Sub Test2() Trace.WriteLine("Test2 called") End Sub End Class
クラス 'datarow' は、それ自体から継承することはできません 'datarow' は 'datarow' から継承されます。 というエラーメッセージは、ソリューションエクスプローラで 新しい項目の追加でクラスを追加して、以下のソースコードを追加すると 出てきたが、やっぱりデータセットはちゃんと作れる。。。 わからんぽ。誰か助けて・・・(泣 Public Class datarow Inherits datarow Public Sub Test2() Trace.WriteLine("Test2 called") End Sub End Class プロジェクトの名前やmdbファイルの名前とかかなぁ。。。
15 :
10 :05/01/09 23:02:44 ID:???
プロジェクトの名前やmdbファイルの名前とかが原因のエラーなのかなぁ。 たまにあるよね。それが原因でエラーだすことって。。
16 :
10 :05/01/09 23:07:02 ID:???
プロジェクトの名前やmdbファイルの名前とかが原因のエラーなのかなぁ。 たまにあるよね。それが原因でエラーだすことって。。
17 :
10 :05/01/09 23:12:52 ID:???
プロジェクトの名前やmdbファイルの名前とかが原因のエラーなのかなぁ。 たまにあるよね。それが原因でエラーだすことって。。
なんかネットがつながらなくなったから(うちの回線しょぼいから) 再度書き込んだらいっぱい投稿してることになって しまっていた。。。汗 スマソ
なんかネットがつながらなくなったから(うちの回線しょぼいから) 再度書き込んだらいっぱい投稿してることになって しまっていた。。。汗 スマソ
ちょっと餅突け
>>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と完全修飾名から継承してくれ
ますから名前空間がぶつかることはありません。
22 :
7 :05/01/10 13:29:34 ID:eQhm3LsI
昨日全然つながりませんでした。
レス返せなくてすいません。
10さんほんとにありがとうございました。
>>21 思いっきりテーブル名は「data」でしたので、
変更したら正常に作成されました。ありがとうございました。
みなさんほんとにお騒がせして申し訳ありませんでした。
Accessでテーブルを作る際、フィールド名を数字で始まるものに 作ることはできるが、そのテーブルにVBAでADOのrecordsetで アクセスしようとするとエラーになるんだよなぁ。 名前の付け方が原因の動作不具合って多いよね。。。汗
ADO.NETで更新可能なResultsetとかDynasetとかというのをなくしたのは英断だと思うけどな。 更新系はupdate/insert/deleteでやるのが基本だと思ってるので、 DataSetだやDataAdapterを使わなければあんまり変わらん感じですよ。 ResultsetとかDynasetとか、中で何やってるかわからなかったのでなくなってすっきりです。
C#でローカルのMSDEにアクセスしています。 使っているテーブルはテキスト、テキスト、イントの3つのフィールドを持つものです。 単純なInsertのストアドを使った場合、またAdapter.Updateを使った場合でも10000行をインサートするのに90秒かかります。 これはまだまだ遅いんでしょうか? データベースは素人です。
>>25 マシンのスペックでだいぶ変わってきますからね。
単純な表に単純な挿入だけならロジックで差が出るとも思えんので
そんなものでしょう、としかいえな。
>>26 なんかWEBいろいろみてると、DBの設定とかで(たとえばトランザクション切るとか)いじれなくもなさそうなんです。
けど、片手間だし資料ないしあまり手もかけてられないので・・・
ふつうのパソコンレベルでどのぐらい出るかの大雑把な相場が知りたかったんだけど、規約にあるせいかデータwebにない(´・ω・`)。
>>25 90秒が遅いかどうかはあなたがやりたいこと次第で、他人に聞く事じゃないでしょ。いや、マジで。。。
>>28 10秒なら十分満足ですが、90秒ではもっと早ければいいという感じですが?
素人なので大体の基準を知りたく思い、聞くことがそんなにおかしいんですかね。
>>29 聞くことはおかしくないのだがそれは無意味だというのが素人じゃない人たちの回答ですね。
これこういうやり方で書き込んでるが改善できないかって質問には答えられますよ。
MSDEならSystem.Data.SqlClient系をつかおうとか、Adapter使うと挿入後に読み直しのための
わずかなオーバーヘッドがかかるのでsqlCommandを直接使うとか、4000文字(8000byte)以下な
らtextよりvarcharを使おうとか、復旧モデルを変えても速度的な効果はあまりないとかなどなど。
insertの最速を目指すならbcpなのだが運用ツールだからね。普通のアプリじゃ使わない。
>>30 でも大体このぐらいのマシンスペックならこのぐらいは行くはずだぐらいの感覚は持ってるんじゃね?
デザイナでアダプターやらデータセットやらを配置していくのは、 旧VBプログラマーもすぐにアプリ構築できるようにするためなのかなぁ。 なんか、言語をクラス化させる方向と逆向きのように思うのだが。。
33 :
NAME IS NULL :05/02/06 19:21:39 ID:+/ua3Vc0
ADO.NET ってトランザクションを発行した後に、SELECT文を使用することが出来ないんですか? 現在は別セッションを1つ作って対応していますが、リソースが無駄になるからやりたくない。 ADOの頃は出来たのですが・・・・ 誰か良いやり方を知りませんか? VB.NET2003 SQLServer2000
>>33 何をしたいのかがちょっとよくわからないですが、
DataSetの中にSELECT文が保持されてるようなものだから、
それをFILLするだけで良いんじゃないでしょうか。
age
監督お願いです。 D V D で は、 T V で 端 折 っ た 話 を 追 加 & 補 正 し て く だ さ い 。
37 :
NAME IS NULL :05/03/08 21:49:18 ID:WrTc1v3o
SharpDevelop で ADO.NET つかえる?
ADO.NET開発が出来るスキルと、ADO開発ができるスキルとでは、 プロジェクト開発を考えると、今は圧倒的にADO開発のほうが 有利に思える。。。
分散環境で楽観排他を使っていた香具師にとっては、ADO.NETは全然違和感が ないのだが、接続型の選択肢がないのは、それはそれで困るんじゃないか?
>>39 >接続型の選択肢がないのは
ありますが?
非接続型って、メモリの中にテーブルを格納するわけだから、 adoで読み込んだテーブルを変数に格納しておくこととそう変わりが無いような きもします。
42 :
NAME IS NULL :2005/04/12(火) 21:55:21 ID:rOEDApzW BE:134971878-#
DataSet つかって捜査するのって、 ある程度以上の規模のテーブルを扱うのは不可能ですか? サーバとのあいだですごい転送量になりそうで。
>>42 >ある程度以上の規模のテーブルを扱うのは不可能ですか?
クライアントに搭載されてるメモリによる。
>>42 何レコードも走査するような場合はDataSetでなくて
xxCommand、xxDataReaderを使うことになる。
DataSetはO/Rマッピング風なものを狙ってるんだろうなきっと。
45 :
NAME IS NULL :2005/04/14(木) 21:52:10 ID:Gq7Mlisl
ADO.NETがオープンソースに
みんな、ADO.NETで、データ接続の部分のクラス化って どういう設計してるんだろう。。。
>>45 なるわけね〜え?本当になったの?なるわけないよな。
でも mono でももっとたくさんのアプリケーションが動くようになるといいな。
なんかいいサンプルないかなぁ。 いまいちオブジェクトの概念とか使い方がわからんぽ。。。
>>49 その同時アクセスの制御って、おかしくないか?
データを書き換えた後、更新しようとした段階で
「できません」ってなって作業が無駄になるのは。
>>50 おかしいと思うなら、それはお前さんの頭がおかしいだけ。
ADOは読み込んでレコードをたどる際はmovenextかmovepreviousしか なくて、番号がなくて順序だけで操作する考えだったのに対して、 ADO.NETはDataset.DataTable[0].Rows[0][0] ってな感じに配列の添え字で操作するようになってる。 その考え方がいまいちしっくりとこないし入りにくい・・・
53 :
NAME IS NULL :2005/05/08(日) 11:39:33 ID:ycbXXzo5
>>52 非接続型は添字だが、接続型ならADO風だろw
良く考えたらその通りだな。w
そっか。。。非接続型なんだ。 小さなDBにしか、使えないねえ。。。信頼性が。。。
ADO.NETなんて糞だろ
接続型でダイナセット開きっぱなしで操作するより、 非接続型で楽観排他前提のデータ操作のほうが中身が良く見えて 安心できるけどなぁ。データが増えるほどそうだ。 もっとも両方使えたほうがうれしいけどね。
メモリに余裕があって、処理の高速化を図る場合、 ADOで読み取った内容を配列に入れて操作していました。 この配列に格納したデータをソートしたりフィルタをかけたり できるので、便利だと思います。 あと、データを上書きするまでの編集時は、オリジナルのデータとは、 別なところにおいておくことを設計したりしなくてよくなったから、 便利になったと思います。 でも、思いっきり重いです・・・汗汗汗
ADO.NETが遅いのはマーシャリングにSoapFormatterを使っているせいで、 .NET2.0からはBinaryFormatterに変更でスピードが向上している。 ADO.NETは完全に読み込んでしまってから処理を始めるため、 グリッドコントロールへの表示開始はどうしても遅く感じてしまう。 トータル時間は変わらないはずなのだがこの辺の体感的な部分は重要だと 思うので改善が欲しい。
Windows98の時、「Windows95よりも体感速度が速くなった」っていうのと 同じ機能だな。w
業務系アプリはWeb型インタフェースが流行だから、それに合わせてるんでしょ。 Webフォームがメインになるんだよ、今後は。
と思われていたが、AbobeのFlashフォームとMSのMetroフォームになるのであった。 もちろん最後は(ry
ADO.NETからデータベースに接続する場合、 細かいところ見てたら相性とかでてくるんだろうか。 おなじMS製品のほうがいい、みたいな。
>>63 .NET Data Providerを直接サポートしている場合はデータ型をはじめ
独自実装を大幅に認めてるので相性の問題はあまりないと思う。
(ただしそのせいで異なるデータベース間での移植性は低くなる)
サポートしてない場合はOLE DB経由になるのでデータベース製品と
OLE DBとの相性の問題が当然発生する。
65 :
NAME IS NULL :2005/05/15(日) 19:53:53 ID:p5AU4cZr
DataGrid用意してFillしてDataSetマンセーって 言ってる記事多いよな。DataGridだけのアプリが あるかと・・・ 単票形式もコントロールにDataBindingして ほらすごいでしょ?みたいな記事も 単票が別フォームの場合が説明されてなかったり フォーム間のデータの受け渡しが載っているのも あるが、受け渡し方が統一できてなかったり はっきり言ってADO.NETフレームワークは使うほどに窮屈を感じるのだが
.NET2.0で改善してないものかなぁ・・・つーか、早く試しておかないとマズー
DataGridにコンボボックスを貼り付けるのもあらかじめ用意 されてないし、紹介記事読んだだけじゃ複数テーブルの扱い方が まともに解説されてないから、アプリを組む概要もイメージできない。 はっきりいって、つかいにくいのだが。。。
69 :
NAME IS NULL :2005/05/16(月) 17:55:21 ID:/hrRvA3a
稼動1ヶ月ぐらいで遅くなったと苦情が来てたので調べてみたのだが、 条件なしの全件取得でグリッド表示していた。 ADO.NETのアーキテクチャでそれはまずいだろうと思って、 担当のPGに聞いてみたらADO.NET以前もこんなことをやってたもよう。 ADO.NETは使いにくいとかぼやいてる。たとえ密結合でもそれはいかん だろうと思うのだがどうなんだろう?
データセットいやなら別に使わなきゃいいじゃん。 IDbConnection,IDbCommand,IDataReaderあたりで ADO風に接続形の世界で生きることは普通にできる。
やっぱり、開発にかかわるとなると、「自分だけは使わない」とかって 出来ないわけで。。 connectionとadapterあたりまで何とか理解できた。 複数のテーブルを利用してデータの読み取りから更新までおこなう、 DataGridだけとかウィザードのみで終わりじゃない、 チュートリアルってないかなぁ。。
ADOと切り離してDataSetを見てみると、StrutsのActionFormみたいに使えるよな。 Dataアダプタとセットにしてしまうと、ViewとModelがくっつきすぎで、単純な画面ならいいが複雑な結合じゃつかえねー。 一般に売られてる書籍も1つのテーブルから一覧だして終わりだもんな。 そんな仕事はあまりありません・・・。
74 :
NAME IS NULL :2005/05/18(水) 16:40:37 ID:V6I2A/hd
まともにDataSetと向き合わないほうがいいよ DataSetはADO.NETのオマケと思ってないと、 無理に使おうとすると縛られて疲れちゃうから
なんか具体性のない
>>74 だけど。
プログラムのあらゆる場面で出てくる、データとその集合を取り扱う基本クラスとしては十分だと思うが。
こんなの自作してたらかったるいし。
DBと画面表示が直通だとDataSetもいいんだけどな。 実際にはちょこっと編集したり色々する必要があることが多くて、 DataBind()して、変更された結果をUpdate()するだけ、みたいな お手軽なケースは少ないんじゃないかな。変更部分はDataSetが 覚えてるし、単純なケースではこれで確かに楽になるんだが。 ま、「簡単なことを簡単にすませる」という要件には適ってると思う。
でも中途半端な上司がこれを触って、なんだ簡単じゃないかと、無茶な工数算出をしたら・・・
ココ読んでると、みな同じような不満をもってるんだなぁと親近感を感じるな。 漏れの方法をアド。 データ処理は参照系処理と更新系処理に分離して、前者にだけデータバインド 使う。データは予め参照用ビューを定義して1テーブルにしとく。 後者には、オプティミスティック制御でトランザクションにして書いておく。 DataSetの機能をそのまま使ってもいいけど、参照系処理 で使ったデータでオ制御をやれば、TP低いシステムなら十分かと。
>>76 直通じゃなくても十分使えないか?
DataSetをStrutsでいうActionFormと考えれば結構使えると思うんだが。
簡単な画面はDataアダプタから直で取る。
複雑な画面は、自分でSQLごいごい書いて、その結果を登録して渡してあげる。
後者のパターンで二元配列だと個々のカラム型が入らないから問題。
構造体(というかクラス)の集合を自作・・・ってこの部分をDataSetでやるだけ。
自分で書くよりビジュアルなのと、DataSetそもそもの機能(検索や更新前値の保持、複数テーブル格納)など使えるし。
入門書にのってるような、FillしてOKなんてのは使う場面はほとんど無いと思うよ。
>>80 そうだよなぁ。ADOの時だってリザルトセットからGirdコントロール
までを通しでそのまま使ったことはあまりなかった。
Visual Studioのウイザードだけである程度のものはできるけど、
実用的なものを作るにはそれなりのコードを追加する必要がある。
Adapterで作成したDataSetをそのままGridの表示に使うことは
まれな気がする。
82 :
NAME IS NULL :2005/05/19(木) 15:14:04 ID:GtQz+Y9u
フォームがたくさんあると、 BindingContextとかCurrencyManagerのことも 考えないといけないからめんどくさいね
>81 確かに。ADO.NET無視して、 自前に生っぽく作るほうがいい気がする。
>>83 無視はしなくてもいいけど必要に応じてチョイスして利用しようということ。
AccessVBAのADOに使い慣れてると入りにくいな。 フォーム上のオブジェクトにデータ表示させる段階で結構つまずく。 Comboboxのメソッドで、rowsourceが無いのは分かるけど、 column()とかvalueとかないし。
使い方がちょっとかわるのなら、そのあたりを考慮したドキュメントも 作って欲しいものだ。一太郎ヘルプみたいに。 どうしてこのように使い方が変わるのかの説明がなかったら、 無意味なバージョンアップにしか思えない。 フリーソフトによくある、メニューの位置やデザインが変わるだけ っていうやつ。今までの操作の慣れが無意味になって、 かえって使いにくくなるだけ。
型指定されたデータセット、カラムにプロパティアクセスできるのは いいんだが、値が入ってない場合に例外をスローするのは勘弁して欲しいものだ。 カラムの値がNULLなのての、DBじゃ例外でも何でもねえだろ。
>>87 生成されるソース書き換えればOK・・・だけどめんどい。
型指定のエディタで指定させて欲しかったね。初期値とかNULLチェック有無とか。
メモリにがっぽりデータを読み込む仕様にしたのなら、 その制限を自由に設定できる仕様も必要だが、それが 準備されていない気がするわけなのだが。。。
>>89 多分その認識がそもそも間違っている。
今までのRDOとかならそういう考えでのクライアントキャッシュ・サーバーカーソルの考えだけど。
DataSetはそういう考えではなく、あくまでHTTPなどワンタイムセッションのためのキャッシュ。
System.Web.UIWebControls.DataGridはページングの機能あるけど、 裏のDataSetに全部のデータ読み込んでおかないといかんみたいだな。 せっかくページングしてもこれじゃメモリの浪費で意味ねーじゃん。
>>91 せめて、@ITとかでも読んだら?
ちゃんと全部データを読まなくても動作させる方法がある。
ページングに関しても同様に、表示させる件数だけデータを取得して、
ページを変えるときにそのページのデータを読み込ませる手段がある。
此処で言われてるような不満とかって、大抵は使い方を知らない低レベルな技術者ばかり。
実際には問題無く出来るような事を不満として出すんだから馬鹿としか言い様が無い。
複数テーブルを読み込んでデータ更新までやるサンプルが なかなか手に入らないのも事実。
一太郎ヘルプみたいにしっかりと解説してるドキュソあるか?
とりあえずMSDN以上の求めるのは困難じゃないか?
>>95 マイクロソフトが、新文法を提案するのなら、
それ相応のドキュソを残してもいいじゃないかっていみだよ。
>>96 そういったドキュメントはちゃんとあるよ。
ただ、探し方が悪いだけ。
98 :
NAME :2005/06/06(月) 16:01:45 ID:???
ま、一太郎ヘルプの話はいいとしてさ、 一つのテーブルをグリッドにbindingしておわり。 見たいな解説で終わってる書籍に不満がある人向けの ドキュメントは無いの?
狂気の法案を拉致問題の安部晋三先生と阻止しよう!!【■■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 秒 も 早 く 党本部に伝えて下さい!
>>101 MSのサイトは、データセットやデータテーブルなんかを
直接扱う範囲の狭いサンプルしかのってないじゃん。
それらがどんな風に繋がっていくのかがいまいち
イメージできなくてさ。。。
>>103 だから、調べ方が足りないって言ってるんだよ。
101=104か? まともなドキュメントがない(か邦訳できる技術力がない)のを隠す のに必死なMS社員でなければとりあえず、あんたが参考になったと 思ったURLを貼ってみれ。 ちなみに俺は英語のドキュメントでも歓迎だ。
>>103 つうか、それをどう使うかなんてMSに聞くことじゃないだろ?
それこそ理解してどう扱うかの設計の問題。
それもマニュアルないとNGってのは、単にあなたのイメージが・・・。
>>78 に書いてあるじゃん。
データセットがマルチテーブルなのは、分散DB用途だよ。
シングルDBなら、DBMSのビュー使った方が遙かに楽。
更新は当然SQLで。アップデート・メソッドはトランザクション対応
してないので更新レコードが1件で無い場合には使い物になりませぬ。
データセットがマルチテーブルなのは階層構造を持つデータをそのままの形で扱うため。 これはO/Rマッピングで設定するリレーションと似てると思う。 関連のあるデータを生のテーブルの構造で保持することでAdapterによる書き戻しが意味を持ってくる。 ただしこういう使い方が本格的にできるようになるのは.NET 2.0からの模様。 今の版のADO.NETは不完全な箇所が多く、書き戻し時のトランザクションの制御をはじめ まともに使おうとすると相当のコードを追加しなくてはならない。 現状AdapterやDataSetは読み取りだけに使用して、更新時は直接SQLを投げるのが現実的だと思う。 全体が見渡せて応用が利くような良くできたドキュメントがないのはADO.NETがまだ不完全なことが 原因だと思う。
>>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"など、リテラルな値もそのまま記述できる。
>>87 >カラムの値がNULLなのての、DBじゃ例外でも何でもねえだろ。
プログラマ的にはなんでもないけど、RDB理論的には例外だよ。あっちゃいけないこと。
NULL値アクセスでデフォルト例外って、普通に考えて良いと思うけど。 だって、DBのNULL値って表現できない値でしょ。不定。 じゃあ、それをMSが勝手に何らかの値を与えてたら、それこそバグの温床だよ。 とりあえず例外にしておいて、実装するプログラマが例外処理するか、規定値を与えるか考える。
113 :
NAME IS NULL :2005/06/09(木) 13:44:20 ID:IPWJYuoX
開発者にとって複雑になるであろう点は、関係者は分かっているのにも かかわらず、巷の本などの情報ではカバーされていて、開発方法論を 模索しているうちに次のバージョンが出て、過去の欠点は改善&変更されましたみたいな。 これじゃMSの追っかけするのも楽じゃないな。Javaのほうがいいかもしれんとか 思っているところ どうなんだろうか
まあ、俺はDQNだからね。だからもっと情報が欲しいな、と・・・
MSの追っかけするのも楽じゃないのは同意だが、Javaも楽じゃないぞ。 やっぱりCOBO(ry・・・が一番。
>>112 100カラムぐらいあるテーブルの値参照するのに
毎回
if (dataSet.Emp[0].IsEmpNoNull) {
empNo = null;
} else {
empNo = dataSet.Emp[0].EmpNo;
}
とか
try {
empNo = dataSet.Emp[0].EmpNo;
} catch {
empNo = null;
}
とかやってらんねーじゃん。
ま、型付データセットでは規定値与える手段があるから良しとする。
Javaのおっかけの場合はソース読む必要があることが多くねーか その分理解は深まるけど、おっかけんのつらいでしょ まあソース読むという選択肢さえないMSよか自由かもね
>>116 だから文意をきちんと読んでくれ。
この部分の仕様、MSは例外処理をしろといってるわけじゃないんだよ。
MSとしたら、NULL値に何を割り当てても、実際に使う側からしたら文句が出るのは判ってるから、
実装側にそれを決めてもらうという意味で、デフォを例外にしてるんですよ。
>>112 に書いたが、数値0とか空文字とかをMSが割り当ててるのがデフォルトだったらもっと問題。
>>113 >>117 何言ってるんだよ! おまいら追っかけるのが仕事だろ。
いつまでも、どこまでも、倒れて立ち上がれなくなるまで
スポ根で追いかけるんだぁー。
技術者が新しいことに興味がもてなくなったら終わりだけど 次々とせっかく学んだものが古くなりつつ 追っかけるだけの人生も空しいなと 後に残るもんならいいんだが、ADO.NETだのなんだのは表層だからね そういうものの知識はまるで残らないし意味が無くなる まあでも、追っかけられなくなったら引退の潮時かもな
ADO.NETに限らない話だけど、 .NETは抽象化しずぎて、イマイチ開発の自由度が殺されている
抜け道はあるでしょ C#ならポインタも使えるし P/Invokeもある Managed C++ならもっと自由だ 何にせよ綺麗に抽象化することが出来なかったMFCや 不便さと面倒さばかりが目立つCOMよりぜんぜん筋がいいと思うね
.NET全般まで範囲を広げると脱線しそうだからADO.NETに戻すが、 ADO.NETはADOより機能を絞っていて、特定のモデルを強制しているのは確かであり、 それで自由度が少ないと思われているのは仕方がないことだと思う。 サーバーカーソルはクライアントの数が多いとサーバーへの負荷が大きいため全廃。 クライアントカーソルはクライアントあたりのユーザーが多いとクライアントへの 負荷が大きいため、内部を見渡しやすいフレームワークでの実装に切り替えている。 残ってるのは読み取り専用の前方カーソルと結果を返さないコマンドの実行機能のみ。 利便性より多ユーザー時のパフォーマンスを重視した結果だと思う。 このモデルはWEBアプリのような多ユーザーで少数クライアントの場合に有効であるが、 C/Sのようにクライアント=ユーザーでクライアントがパワフルなケースや、 ユーザーや同時実行が少なくDBに密着したデータ制御をしたい場合など 旧来のクライアントカーソルやサーバーカーソルが有効なケースも少なくないはず。 この辺のフォローをADOを引き続きサポートすることで行うのか、ADO.NETの機能強化で 吸収するのか、まったく切り捨てるのか方向性が見えない。
ADO.NETそのものが切り捨てられるという可能性はどうよ。
>>121 メッセージのルーティングが見えなくなってるよね。
OOが使えるのは良しとして、世界観はVBだな。
>>123 MSSQLServerの大幅な機能強化があるんでしょ、確か。
ストアドにC#が使えるようになるらしいし。
たしか、MSSQLServerって多バーション式だったよね?
だったら、ストアドでサーバ側カーソル作れるんじゃない?
>>125 MSDNを見たらSystem.Data.SqlServer.SqlResultSetというのがあって、
これで更新系の操作ができる模様。これがSQL CLR用っぽいです。
snapshot分離レベルはOracle式のロールバックデータを世代管理する方式ではなく
tempdbにスナップショットを作る方式の模様。基本はあくまで共有ロック式で、
運用中に時間のかかる集計や帳票作成処理をするケースを想定してると思われます。
ADOのサーバーカーソルはこれらの機能で代用できそうですが
SQL2005以外のDBはどうしろというのでしょうかね。
>>107 参照系は、Adapterで複数のテーブルを一つにまとめるSQL文を使って
DataSetに格納してDataBindingsするまでの一連のやり方は分かるけど、
更新系は、具体的にどうやるのかが分かりませんので教えていただけない
でしょうか。DataSetをつかわないんですよね?
>>127 やり方は色々だと思いますよ。
DataSet内のTableの各Row毎に変更状態のステータスと元データ持ってるから、
DataSetをもらって、各Row毎にSQLでごりごりと処理する関数を自作することも可能。
(つうか、実務じゃその使い方しかないだろ?)
>>107 > アップデート・メソッドはトランザクション対応してない
これマジ?
DataAdapterに突っ込むInsertCommand, UpdateCommand, SelectCommand
にトランザクション設定しておいてもダメなの?
>>128 基本的な事で申し訳ないですが、質問させていただきます。
> DataSetをもらって、各Row毎にSQLでごりごりと処理する関数を自作することも可能。
DataSetをもらって、Row毎にfor文などでごりごりと処理する関数を・・
ではないのでしょうか。
ADO.NETは、DataSetに読み込んだテーブル群に対しては、SQL文を
実行できない仕様になっていると思うのですが。
>>130 Rowの状態を見て、追加・変更・削除のSQLを組み立て
ExecuteNonQueryで実行すると言う意味では?
132 :
NAME IS NULL :2005/06/14(火) 01:00:18 ID:wt5YTRiZ
>>129 その各コマンドは、Row毎に呼び出される仕組みだったはず。
しかし、
Update の前に、同じコネクション使って begin transaction を送っておけばうまくいったりして。
報告待つ。
>>131 どのみち効率が恐ろしく悪いよね。
ストアドがデータセットを引数に受けてくれたらいいんだけどね。
>>132 案が行けそうな気がしてきた。
Update失敗したらロールバック、成功したらコミットでどうかな。
>>132 余裕で可能
トランザクション効くよ
つか、普通思いつきそうなもんだがな
つうわけで
>>107 は大ウソ
>>134 >余裕で可能
トランザクションをオンにするプロパティかなにかあるのですか?
>>135 DataAdapterの{Insert,Update,Delete}Commandプロパティに設定する
CommandオブジェクトのTransactionプロパティに設定すればよい。
DataAdapterはConnectionが閉じている場合は暗黙に開くので、
前もって
1) ConnectionをOpen()
2) BeginTransaction()
3) Commandオブジェクトにtransactionをセット
をやっておいてから、Update()すればよい。
>>130 言葉足らずでしたね。すみません。
皆さんがもう回答かいてますが、元の
>>128 はDataSetを丸ごと受け取って、サーバ側でForループの意味で書きました。
でもって、少し前に書いてるが、ADOとDataSetを直で連携させて使うってことは考えていない。
DataSetはあくまでデータ受け渡し用のクラスとして非常に有用と思ってるだけ。
SQL操作はサーバ側で従来的に行うのがいいと思うこのごろ。
ADO+DataSetだとDataSetに制約がかかりすぎて使いにくい。
>>136 それだと、複数テーブルのトランザクションを用いたUpdateには
アダプタを一つにまとめておく必要があるってことか。
>>139 同じTransactionオブジェクトをそれぞれにセットすれば複数のアダプタでも
独立したCommandオブジェクトでも大丈夫。その為にConnectionを別にオープンしてるんだろうな。
DataAdapterを活用しようと思ったらかなりのコードを追加が必要になる。
単純なアップデートの場合は
>>136 の方法で全更新を1トランザクションにすればよいが、
エラーや競合の場合にユーザーに判断を任せる場合はFillError/RowUpdated/RowUpdatingと
いったイベントにかなりのコードの追加が必要になる。
現状では独立したCommandオブジェクトで直接Update/Insert/Deleteした方が安全で早いと
判断する人間が多いのはやむなしだろう。
ウイザードだけで作ったDataAdapterを単純にUpdateすると、途中でエラーや競合が起きた場合
そこで処理を中断してしまって途中まで更新した状態になる。これをみて
>>107 のように考える
人間がいてもそれもやむなしだと思う。
>>141 ていうか更新がなんか半自動で走っちゃうのはやっぱキモチ悪いって抜きがたい感覚は
どうしてもあるよね。
ウィザードで自動生成したUpdateCommandとかはキモチ悪いから手でSQLは
書き換えるし。
ただ、コード量のことを言うなら、
>>128 の言うみたいなデータセットの差分取得して
ゴリゴリとかのが結局多くなるっつか、やっぱ無駄な気もするよ。
>>142 まあこの問題はそもそもORマッピングって使えるのか?って事でしょ。
>>144 こういうのって難しいよな。
機能が多機能になればなるほど、フレームとしての自由度が下がるし、習熟が必要になる。
それなら自分でつくったほうが・・・、ってなるし。
狂気の法案を拉致問題の安部晋三先生と阻止しよう!!【■■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超大物国会議員登場・皆さん大挙してご参加を■□■
>>145 O/Rマッピングのようなものは使いどころが難しいからね。
データ量を限定すればそれなりに汎用で便利なライブラリやフレームワークが作れるのだが、
データベースの場合データ数が半端じゃないことが多いから、汎用で便利にするための
多少のオーバーヘッドのせいで、致命的に処理速度が遅くなったりリソースの使いすぎたりする。
結局フレームワークとRDBの両方を特性を意識して注意深く使わないと実用に耐えない。
>>147 そうか?
O/Rマッピングに何を使うのか、そしてDBサーバのチューニング次第じゃない?
俺の会社でも3ヶ月ぐらいかけて色々テストしてみたけど、
1億レコードでも検索にかかる時間は平均1秒以内にまで出来たぞ。
ORでもデータベースの索引にヒットした検索なら速いのは当然じゃない?
150 :
NAME IS NULL :2005/06/15(水) 17:30:32 ID:JbFI81w8
OdbcDataAdapterをウィザードで作成すると落ちたりしない?
つうか、新規案件でデータ主導型で画面設計してよくてっていうならORマッピング使えると思うよ。 既存DBからの場合はまず却下だし。 画面とビジネスロジックが複雑で、データ操作が多岐でかつデータを集合として扱う場面が多い場合、ORマッピングは使いにくい。 SQLでいうところのWHERE節で集合限定して一括更新みたいな部分が弱すぎ。
>>151 >つうか、新規案件でデータ主導型で画面設計してよくてっていうならORマッピング使えると思うよ。
そこでUML2.0でつよw
>SQLでいうところのWHERE節で集合限定して一括更新みたいな部分が弱すぎ。
将来的には更新可能なビューが増えてDBMS側で対応される希ガス。
それまでの議論だな。
ポジティブかネガティブかわからないレスですまん。
>>152 そこまでいくと、ORマッピングなんぞ考えずに、オブジェクトDBでいいような。
更新系テーブルは、やっぱり単独読み取りして、ローカルで プログラミングのほうがいいのかなぁ。 ADOプログラマはどのように考えられてるのかしら?
155 :
NAME IS NULL :2005/06/21(火) 13:48:24 ID:J+gvxeCG
肝心なところが扱いにくいADO.NET
156 :
NAME IS NULL :2005/06/23(木) 20:45:08 ID:Eox5AqoZ
>>154 全部が全部じゃないが、
SqlDataAdapterは表示系、
SqlCommandは更新系と使い分けてる。
開発元は、「更新も自動で出来て便利。」とうたっているが、 その自動機能が実務で使えるレベルじゃないから、 実際は表示系にしか使われないってことなのかな・・・
>>156 使い分けると言うより、
更新系にはアダプタが使えない(使う価値なし)ということですよね。
159 :
156 :2005/06/25(土) 11:47:47 ID:GM3QDYFi
ま、全部が全部じゃないが、そういうこと。
使い方次第じゃない? MSが提供してるサンプルでも、参照から更新・削除に至るまで、 SQLServer(MSDN)でプロシージャ作って、それを呼び出す形になってるし。
>>160 それはSQL CLRのことじゃないか?
次のVSは乗り換える価値ありなのかな? 最近VS2003で作ったクライアントをばらまいたんだけど、 2003SRVを使ってるヤシ以外全員が、動かん、と申し立ててきた。 通常のWindowsUpdateでは1.1Frameworkは入らないのね… 2.0も同程度にしか普及しないのかな。OSのバージョンアップの計画もないし。
> 通常のWindowsUpdateでは1.1Frameworkは入らないのね… こういう仕様なのは確かに困りものですよね。 MS製なのに、なんでこんな仕様なんだろう。 手動で1.1Frameworkを入れたら、再度アップデートでセキュリティー アップデートしないといけないし。
使いもしないもの勝手に入れられるなんていやだし。
メーカー物PCに入ってるアプリケーション体験版とは違うでしょ。 1.1Frameworkを入れたから不安定になるとか重くなるとか 無いはずで。
WindowsUpdateの「優先度の高い」じゃないが「追加選択」のところでできたような。
>>166 一般ユーザは、追加選択なんて試みないよ。
あんなのを毎回チェックしてるのは漏れたちだけw
ここで聞いていいかわかんないんだけど。。。。 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文自体はクエリアナライザで問題なく実行できました。 何が間違っているんだろう。。。誰か教授願います。
clsDBとか言われてもな。 CMyDBって言われても困るだろ?
>>168 もしかして文字定数のシングルクオーテーションが抜けてないか?
strSQL &= " 得意先コード = '" & costormerCode & "' and " & _
" 得意先名 = '" & costormername & "' "
あとは間違いじゃないが、strSQLの代入部分は継続行をつかって1行で書くか、
StringBuilder使う。余計なvbCrLf何ぞつけない。
セキュリティホールになりやすいので変数部分はParameterクラスを使う。
171 :
168 :2005/07/01(金) 10:13:15 ID:???
ちょっと略し過ぎました、、
>>170 氏
指摘部分と意見参考にしてもう一度見直して、書き直して再TRYします。
dクスです。
>>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
得意先コードは出るようになったのですが得意先名が出ません。
また、つまってしまいました。
またどなたか指摘、意見もらえると幸いです。
自己解決しました。 無事DBアクセスして項目内容Webに出力できました。 どうもお手数でした。
解決したら、どう解決したのか書けよ。 それが公衆向け掲示板で質問するもののマナーだろうが。
あきらめることで解決にしたんだよ。きっと。
項目が一個出てれば、残りも出る。 出てなきゃコーディングミスさ。
得意先名が空白だったとか
>>174 マナーねえ。。まあ、言わんとしてる事は一理あるとは思うけど。
だけど命令口調でデカイ態度でどうのこうの言われるのは嫌ですね。
いきなり攻撃的な文章描くヤツも十分マナーに反しているとは思うけど。
マナーに関してだけならVB.NET質問スレの住民に見習せたいとは思うけどね。
>>176 氏
その通りです、貴殿の指摘通り単なる凡ミスです。
>>178 まあ一般的な人としての常識をつけてから反論しようね。
聞いておいて出来たからいいなんて失礼千万ですよ。
マナーのなさを指摘されて逆ギレかよ。 典型的なクズだな。 良くニュースで出てるだろ? 注意してくれた人に食いつくやつ。 鏡覗いてみろよ。 そいつがそうだ。そういう顔してるだろ? ww
こういうスレッドが質疑応答の形をとって情報の共有と蓄積をしてるというのが 理解できていればどう行動すればいいかはおのずとわかると思うけどな。
182 :
NAME IS NULL :2005/07/07(木) 16:22:23 ID:+rmuXYAF
DataSetイラネ
ADO.NETイラネ (ODP.NETイラネ)
漏れは無いと困るYO
でっかいテーブルを全走査する最適な方法ってどんなだろ?
SQLサバのテーブル名一覧を取得する、手軽な方法ってあります? Access で For Each 〜 Next で取得できたみたいに。 何を使ったらいいんだろ・・・ DataAdapterとか使うのかな。
select name from [サーバ名].[データベース名].dbo.sysobjects where tyep = 'U' order by name をDataReaderで読むってのはダメ?
189 :
187 :2005/07/21(木) 10:06:08 ID:???
>>188 できた。
でも、dtpropertiesてなシステムテーブルも含まれてしまう・・・
ちょい工夫したら使えそう。
さんkす
ちょっと質問 INで複数(可変個)のデータ取得するときってパラメータどうやって使えばいいかな?? 単純に文字列結合するか、単一行取得クエリをパラメータの数だけ投げてデータセットに追加してくくらいしか思い浮かばないんだよね
191 :
NAME IS NULL :2005/07/29(金) 00:24:31 ID:0me5458W
あげてみる。
>>190 昔、同じことで悩んだよ
・・・結局わからなくてパラメータ渡すテーブルを作ったw
Access系統は、ADO.NET搭載しない予定なんだろうか。。。 そうなると、VB.NETとVBAは別物としてやっていくことになるのだが。。。
つうか別物だし。でも似たようなものだし、何とかなるって。 ちなみに最悪なのがOfficeシリーズ新顔のInfoPath君。 VBAの替わりにVBScript/JavaScript搭載で、 XDocument.View.Window.TaskPanes.Item(0).HTMLDocument.parentWindow.showModalDialog(...略 ) とかやってHTMLなダイアログボックスを呼び出すツワモノだ。正気か。
教えて下さい。 データを削除する方法として、論理削除と物理削除があると思いますが、 どちらが一般的なのでしょうか? 自分は今まで物理削除しかしていませんでしたが、最近仕事で一緒にやっている人間が 論理削除派なのです。 理由はトラぶった時に対応できるからだそうですが、実際にはどちらが良いのでしょうか? また論理削除の場合、物理削除や復活機能は付ける物でしょうか? 何卒教えて下さい。
>>195 ADO.NETとは関係ない話だな。質問の内容にあわせてスレを選べ。
論理削除と物理削除も同じ。データを削除するといってもいろいろなケースがあるだろう。
よく分析して必要に応じてどういう方法をとるかは考えろ。
195です。
>>196 ありがとうございます。
ADO.NETとは関係ない話ですね。
もう少しいろいろ考えてみます。
>>195 すれ違いだけど、本当に絶対にいらなくなるならば物理削除。
(余分なデータを置いておく理由はない、不具合の元になる可能性もあるし、性能の邪魔・資源の無駄)
業務上無視するデータとなるならば一端論理削除したあと、ある時点で物理削除。
(赤黒とか過去データの参照で必要になる可能性がある。)
195です。
>>198 スレ違いでも回答頂きありがとうございます。
自分なりに考えたのですが、マスターデータなど物理削除より論理削除の方が良いのですよね。
これが定番の方法!というのがあればこんなに悩まなくても良いのですが。
>>199 定番何て無いのよ。
それと、
マスターの削除、俺だったらストアドで削除レコードを別テーブルに出す。
マスターに残したら整合性が無駄になる。
AGE.NET
及ばないのは人口だけだな。
>>203 ASPとphpなら同じ系統だから比較できるが、ASP.NETとphpとperlの3つは違いがありすぎて俺には比較できない。
203氏は相当の眼力をお持ちのようだ・・・ADO.NETとASP.NETの違いには節穴らしいけど。
206 :
NAME IS NULL :2005/09/19(月) 17:51:55 ID:+3i+6Ufz
2005でまた仕様変更がどっさりあるんだよね。 勘弁してくれよ‥‥。orz
なんでこんなに仕様変更するんだろうね。 短期リニューアルによる利益向上のためなかなぁ? 実際に使われるかどうかは関係ないとして、とにかく売れる時に 売ってしまえっていう理論。
でも、よっぽどアークテクチャー意思決定者が奇特じゃない限り、2005なんて使うのは来年夏ぐらいからだろ? 特に2005に飛びつく必然(OSが対応しないとか)があるわけじゃないし。
2003で作ったのが2005環境でもきちんと動くか心配でさ。 MSDNでも赤字で注釈入ってるのがいっぱいあるし。
>>210 それって心配することか?
当然・・・動かないことを前提にするに決まってるんじゃないのか?
MSに何を期待してるのって。
そもそも、今回のバージョンアップ、急いであげる必然性は基本的に無い。
まあ、コンポーネント屋さんだったら別だけど。
>209 来年夏と言うと、2006のアナウンスが出ているのでは? まぁ、M$の通例から言うと、2006が安定版だろうし。 >211 同感。
つうか、何の為に
>>210 は.NET使ってるんだろう。
2003だろうが2005だろうが、対応する.NETFrameworkさえPCに入っていれば、
そのバージョンで動くというのがメリットの1つなのに。
214 :
NAME IS NULL :2005/09/23(金) 12:37:32 ID:3e+NxVel
>>208 DAO、RDO・・・
今に始まったことじゃないじゃん。
ま、今回は仕様追加だけど。
MSは実質、内部的にいろんな会社があって、 それらの会社が新しい言語を作って、MSが販売してる構造なの かもしれないね。 MSはWordを0から作ったわけじゃなくて、 Wordの会社を買収して販売して大きくなったわけだし。
.net重いです。 古いOSで動かないです。 本当に主流になるんでしょうか。。。
javaとADO.NETはどちらが良いのだろうか。。
比較がとんちんかん。 違うものをどう比べろと
>>218 javaがjdbcなのかHibernateのようなフレームワークなのかはっきりしてもらわないと答えられないね。
ただひとつ思うのは ado.net が adoの上位互換だったら使いやすかったんだけどね。
つまりadoと同等の密結合のAPIをもっててそれプラスで今のado.netの要素があるような作り。
>>220 サーバー側でレコードロックしてループして・・・が出来ないのが致命的だよね。
受注とかでヘッダを検索してそれぞれの明細をいじりながら在庫を引き当ててとか。
レコードロックが出来れば簡単なのに、楽観的ロックじゃ実は難しい。
>>222 じゃあ、DataReaderがConnnectionを占有するっていう仕様を簡単に回避する方法は?
ADOならば単純に多重ループでカーソル開けたけど。
>>222 System.data.sqlserver ならできるとか言い出すんじゃないか。
すいません 旧バージョンの質問ですが、エクセル相談所で聞いた所VBスレに行くように言われたのですが、 中身からこちらの方なら、と思いましたので。 EXCEL上でADOでパラメータクエリを作成し、複数のアクセスMDBファイルから クエリでデータを取得するプログラムを作っています。 このときいくつかのMDBには存在しないフィールドに対しても、クエリを実行するのですが、 当然エラーが出ます。 On Error Resume Next Set rs = New ADODB.Recordset Set rs = cmd.Execute としても、次に飛んでくれないで、黄色い表示のデバッグになってしまうのですが・・・・エラーメッセージは以下です。 "実行時エラー'-2147217904 (80040e10)': 1つ以上の必要なパラメータの値が設定されていません。 クエリや他の部分はフィールドが存在するときは正しく動いています。フィールド名を事前に取得して チェックさせれば良いのでしょうが、このエラーだけresumeが効かないのが理解できません。
>>225 ADO と ADO.NET は名前が紛らわしいけど別物なので関連するスレはこの辺かのう。
スレ立てるまでもない質問・雑談@DB板
ADO DAO など接続方法について
>>226 では下のに当って見ます。すみませんでした。
ADO.NETでヘッダ+明細形式のDBの入力フォームを作る場合 明細部分をDataGrid以外の方法で実装する方法ってあります? Accessからのアップグレードなんですけど、お客から、明細項目を 横スクロールさせないで見えるようにして欲しいと言われています。
>>228 それはADO.netの問題じゃなく、VB.netのコントロールの問題。プログラムの適切なスレへ。
連結コントロールはGridだけじゃないから。
TrueDBGridとかだと、横スクロール無しで折り返して1レコード複数行みたいなことはできる。
>>229 228です。
確かに、コントロールの仕様絡みの話ですね。失礼しました。
このスレの人ならこの手の実装方法について、経験やノウハウがあると思って
聞いてみましたが、該当スレに移動します。
TrueDBGridって文化オリエント(グレープシティー)の奴ですよね。
標準コントロールだとやっぱり無理なのかな…
これdatasetの下にO/Rマッピングするもんなのか?
今はとりあえずNHibernate
O/Rマッピングのデータをインスタンス化する部分は自作かなんかかな? インスタンス化するクラスはDataSetでOK。 ただ、O/Rマッピングってそんなに必要か?って思う最近。
更新処理でごりごりSQL生成する手間が軽減するならいいなぁ。
ObjectSpacesだったっけアレが出るまで ADOでマッピングしてたほうがマシそう
>>221 これってどうなん?
1.
MSSQLの場合は SELECT 〜 WITH (UPDLOCK) 〜
Oracleの場合は SELECT 〜 FOR UPDATE
など、明示的にSQLによってレコードロック
2.
Transactionのisolationlevelの設定によってどうにかする
ってなあたりが回答?
DataReaderを用いて、従来型のADOのようにカーソル処理がしにくいのが問題なのだけど。 DataReaderを開いている間、Connectionを占有してしまい、他の処理ができないのが糞仕様。 ヘッダをカーソルで開いてロックして更新しながら、そのディティールを更新するような処理。 DataSetの楽観的ロックでよければ問題ないけど、それじゃ拙い場合に使えない。 出して頂いた方法をDataSet生成時に用いても、ロックがかかるわけじゃないでしょ。
O/Rマッピングの良いとこ悪いとこ教えて
専門すれがどっかにあると思うけど。 良いところ。 SQLを意識せずにオブジェクトを生成し、オブジェクトの操作だけでDB操作が出来てしまう・・・といいな。 悪いところ。 世の中そんなに美味しいことは無い。 正直、論理設計、画面設計からO/Rマッピングすることを意識しないと、メリットを甘受できないと思う。 半端なマネすると、結局ツールを使って出したオブジェクトへ手を入れる数が増えすぎて。
240 :
NAME IS NULL :2005/10/24(月) 18:14:20 ID:ypyJJyo+
>>237 .NET Framework 2.0まで待て。
>>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();
}
}
>>241 多謝です。参考になります。
基本的に
>>240 さんの言うとおり2.0待ちなんだろうけど、VS2005が安定するのって2007年ぐらいでしょ。w
ADO.netってサーバーカーソルの非サポート以外は好きなんだけどね。
DataSetとか使いやすいし。
SQLServer2005だとテーブル名のフルプリフィックスでも文法エラーにならなくなってる
Microsoft Text Driver経由でCSVファイルにアクセスする場合、 デフォルトのフォーマットではない(たとえばタブ区切り)ときは 該当ディレクトリにschema.iniを作成する必要がありますが、 CD-ROMなど読取専用のためディレクトリにファイルを作成できないときは どうすればいいのでしょうか・・・
CSVなんて普通に読み込んでSplitしちゃえばいいじゃん。
読み書き可能な手元のディレクトリにschema.iniを用意して、そこに CSVファイルをコピーしてから処理するってのは?
247 :
244 :2005/10/26(水) 23:59:09 ID:???
>>245 ,
>>246 様、レスありがとうございます。
もちろん、ファイルアクセスでやることも可能なのですが・・・
Microsoft Text Driverのフォーマットオプションを動的に変えることができるのなら
複数のファイルフォーマットに対応するのも容易かなと思いまして。
また、SQL文をそのまま投げれるのも魅力です。
見えるディレクトリにコピーする方法も有力ですが、
ファイルサイズが大きい場合は、無視できないコストになってしまいそうです。
接続文字列で FORAMT=TabDelimited とか設定できたらラクチンなのになぁ
どとねっとでregexが使えるからText Driverは使わなくなったな。
250 :
244 :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 のテキストリンクウィザードとか、どうやってるんだろうなぁ。
読取専用ディレクトリのタフ区切りファイルもちゃんと読み込めるし。
まさか自前なんてことは・・・
NHibernate使えそうだ DataSet/Tableは表示用ですっきりいけそう
>>245 CSVを俺は普通に読み込んでSplitなんでとてもじゃないけど出来ないね。
文字コードが何なのか?
改行コードは?
カンマをデータとして持ちたい時はダブルクウォートで括る。
ダブルクウォートで括ってる時、ダブルクウォートをデータとしたいときは、ダブルクウォートを2つ書く。
ダブルクウォートで括ってる時、その中で奇数のダブルクウォートが発見された場合の挙動は?
レコードの最後にカンマだけがあった場合、その後に空白のフィールドがあるとみなすかどうか。
まぁ、本来これだけの処理が必要なCSVを単純にファイルから1行ずつ読み込んで、
Split関数でカンマで切って配列なりに入れるプログラマが、この業界に8割は居るんだがな・・・
俺は、.NETが出る以前から、LogParserを使ってる。
勿論、.NETからの使用も可能。
CSVファイルにSQL文使えるのがいいのよね。
>>251 NHibernateって便利そうに思ったんだけど、ふとした疑問が浮かんだんだよね。
例えば、OracleのV$SESSIONとか使いたい場合、やっぱりこのクラスを作るのかねぇ・・・
あとは、DUALとかさ・・・
今SqlCommnadのExecutereaderを使ってSqlDataReaderを取得Reader()でぐるぐる回しながら読み込んでいるのですが、選択した行が多いときに全部検索終わってからExecuteReaderを抜けているような気がします。 選択処理(ExecuteReaderのようなもの)実行しながら選択できた行を順次処理できるようなメソッドはないでしょうか?
ADO.netで一番変わった部分で、MSが押してる部分だから、このスレとMSDN、関連資料をきちんと読むことをお勧めします。
>>255 了解です。なんかちょっとつかいたいだけなのにいろいろ変わってて疲れた・・・orz
>>256 Framework 2.0になったら、また変わるから。orz
ADO.netで非同期クエリは出来ますか?
やっぱ、vb6までの遺産は全部捨てる覚悟でないといけないのかなぁ。。。悩
過去の資産は捨てずに「繋ぐ」のが.NET的なんじゃねーの
コンパイルしてもエラーが100とか出るプロジェクトを 前に、混乱しております。。。悩
vb6のプロジェクトをウィザードで.NETに変換したとか?
それ以外に移項の方法ありますか?
VB6でも層を意識して分けてるプログラムだと、移植率高いよね。
フォームやファイル入出力やActiveXを使っていない場合は移植どころかほぼそのまま動くが、 そんなプログラムはほとんどないよなぁ。 ADOはそのままCOM呼び出しに変更されるだけだよな?ADO,NETには変えてくれなかったと思うが。
低機能のものに置き換えは無理だわさ。
テーブルのある列に、同じ文字列が何行にも渡って入っていて その文字列が切り替わったことを判断するには、どうすればいいですか? 例えば M001 M001 M001 M001 M001 M001 M001 M002 M002 M002 M002 M002 M002 M002 M002 M003 M003 M003 ・・・みたいな感じです。 使っている言語はC#.NETなんですが、 if(dr["列名"].ToString() == "M002"){ //キーが変わった時の処理 } なんてやってしまうと、汎用性がなくなるもので・・・ 適切な方法ご教示願います。
前の値を変数に代入しておいて、判定をしてはいけないの?
>>269 ありがとうございます。
解決致しました。
age
TrueDBGridって日本じゃ使われてるけど、へぼいよね。
たぶん、ソース見たことないけど、作りもへぼそう。たくさん使われてるから、
バグはあまり出ないかもしれんが、無理やりバグフィックスしてそう。
昔あるGridコンポーネントのソース見たけど、そりゃひどいもんさ。6万くらいのやつかな??
それに対して俺のお勧めは
http://www.devexpress.com/ ここのは信頼できる。
まぁ、まだ発展途上だから、バグが結構報告されているけど、すぐにFixしてくれるし、
サポートもすごいよい。でも、とりあえず、機能拡張はSTOPして、Fixに専念してくれよ。
273 :
NAME 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");
>>273 ds.Tables[0] コレクションの0番に目的のテーブルが入ってないのでは。
ds.テーブル名 で指定してみたらどうです。
275 :
273 :2006/01/17(火) 21:32:58 ID:???
>>274 どうもです
いまちょっと試せる環境じゃないので明日試してみます。
でもコメントの部分を入れ替えるとバインドした時点で0行目の内容が適すとボックスに表示されるので
なにか型付DataSetが悪さをしているのかなぁと思ったのですが。
普通に型付DataSetでもデータバインドは可能なんですよね?
(ググっても出てこないところをみるとそうだと思うのですが・・・)
質問よろしいですか? ADO.NET 2.0使って検索画面作ってんですが、 非接続型の場合は TableAdapterでパターン分だけクエリ作って FillXXXX(DataTable , para1, ....) を、それぞれ実行するしかないんですか? ADO.NET 1.xの時みたいにDataAdapterの CommandTextをソースから書き換える方法ってないですか? (動的にSQLをゴリゴリしたい) どうでしょうか?
277 :
273 :2006/01/19(木) 07:43:36 ID:???
インフルエンザでダウン中・・・ 直ったら確認します....
>>276 AdapterのReaderにDataReaderを設定できるようになったんじゃなかったんだっけ?
DataSetにデータを取得した後、そのデータをグループ化して使う方法はないでしょうか? DataViewあたりにそんな機能があれば良かったんだけど・・・。
280 :
273 :2006/01/24(火) 20:39:09 ID:???
>>274 まさにそのとおりでした。
型付Datasetにテーブルを一個しか追加していなかったのでds.Tables[0]と
決め付けていました。
調べてみるとds.Tables.Count=3になっていて、
ds.Tables[1]もしくは生成されたテーブル名で正しくバインドできました。
初歩的なミスでした。ありがとう
281 :
273 :2006/01/24(火) 20:48:20 ID:???
ちなみに一番の原因は da.Fill ( ds, "テーブル名" ); とテーブル名を指定しなかったのが原因でした。 こうすればTables.Count=1になりました。お騒がせしました。
>>5 1年前のレスにマジレスだが、
当初はXDO(XML Data Object)という名前にしようとしたんだけど、
開発者側が「また新しい3文字略称かよ」と言ったので、ADO+という名を経て
ADO.NETになったそうだ。
以上、本屋で売ってる「ADO.NET専修講座」より。
俺も最近ようやく基礎的な考え方がわかったきたよ。遅すぎ・・・
皆さんはUpdateメソッド使ってる? うちはFillでDataSetに取り込み&検証したあとは、ExecuteNonQuery で直接書き戻してるよ。パラメータ設定とか面倒だしさ。
>>283 > うちはFillでDataSetに取り込み&検証したあとは、ExecuteNonQuery
> で直接書き戻してるよ。パラメータ設定とか面倒だしさ。
うちもそんな感じ。
テーブル単体で読むことなんてほとんどないから、
JOINしたりしてると目的と違うテーブルが更新されないか、とか心配で怖くて使えません。
>>282 >>以上、本屋で売ってる「ADO.NET専修講座」より。
この本は使えないから買わないほうがいい。
VBマガジンの連載(但しN田のは除く)の方がまだ役に立つ。
>>284 その辺りは何処までADOの考えに沿ってシステムを作るかだろうね。
O-Rマッピングツールとして使うと考えれば、そのツールがAdapterであってそれに載ればよいと。
そうじゃない思想(旧来型のクラサバ)の延長で考えると、ReaderとExecuteでやればOK。
287 :
NAME IS NULL :2006/01/31(火) 22:43:38 ID:xYIDIRU6
今更だがプログラミングADO.NETを購入してきた。 明日からちょっと節約。
288 :
NAME IS NULL :2006/02/02(木) 00:26:15 ID:l446bGbp
学校の授業で「100万件データがあるテーブルにアクセスして、 クエリなげるプログラム作って、レスポンスタイムを短くするように チューニングしろ」って課題がでたんだが、普通はどれくらいの時間 かかるんかな? ADO.NETでSQL Server2000に接続します。テーブルの列は2,3列くらい。
クエリによるだろ。 何するのか、もっと説明しる。
290 :
288 :2006/02/02(木) 01:41:51 ID:l446bGbp
>>289 そのクエリの内容をどうしようかなーと今考えているわけで。
普通にselect文しか思いつかない・・・OTL
レスポンス短くする(パフォーマンスチューニング)するには
何をしたらいいんだろう?
インデックスのつけ方以外で。
あんたの質問は、きれいな絵を書けって課題が出たけどどうすれば?って聞いてるのと同じ。
292 :
NAME 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 と、値が見つかるまで虱潰しに探す処理しか思い浮かびませんが。 もっとスマートな方法はないですか? なお、検索したいビューの行数は数行〜数千行程度です。
別のViewって起せないんだっけ?
同一Tableから複数のDataViewを、というのは可能ですが。 今回、検索にかかった行のインデックスを得たいのです。
何がいいたいかも何がやりたいかも判らん。 もっと客観的に伝わる言葉で書いてくれよ。 行のIndexって何?
開発環境: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プロパティを設定しないままで同等の処理を行いたい。 ということです。
297 :
NAME IS NULL :2006/02/03(金) 12:18:26 ID:uxDQ2asr
行のIndexというのは、上の例の場合、 Index (ID) (検索列) 1 5 非検索値 2 2 検索値 3 7 非検索値 のようにDataView内部で順に振られた順序のことを指しています。 正しい呼び方が他にあるのかもしれませんが。 上、age忘れ失礼しました。
なんでIndexが必要なの? (IndexってDataTableの行番号?) 別にデータにアクセスするならView越しでOKじゃん。
行インデクサかID列か、どちらが欲しいのかわからないよ。
300 :
299 :2006/02/03(金) 20:12:34 ID:???
ああ、ごめん。DataView内の行を特定するインデクサが必要なん だね。んで、見つけたあとに何をするかがわからないな。 ひとつしかヒットしないようなユニークな検索値なら、DataView に抽出した時点で一行しか出てこないだろうし、それならインデク サ0を直接参照して、好きなように読み書きできるかと。
age
Enterprise LibraryのData Access Application Block使ってる人いる? ちょっと触ったところだと、ADO.NETの便利なラッパって感じなんだけど。
何処で質問するべきか迷ったのですが、使ってるのがVB.NETなのでここで質問させてくださいm(._.)m 【質問内容】 Key値としてユニークな番号を発番したいのですが、良い方法というか一般的な方法ってありますか? 自分で考えれるのはMAX値を一旦取得してその次の番号から発番する方法しか思いつかなかったのですが、 消したり追加したりを繰り返すと空き番号が増えてもったいない気が・・・ 環境はVB.NET+MSDE(将来的にはSQL server)です。 初歩的な質問だと思いますがご教授ください
空き番号を気にしないならキーにIDENTITYを属性を指定するのが一番パフォーマンスがいい。 MAX+1でやるなら同時実効性が若干損なわれるから、それでもかまわないかよく検討すること。 途中にできた空き番号の再利用までしたいなら発行可能な番号をすべて書き出したテーブルを作って、 使用中かどうかを管理する。または不要になった番号だけを再利用テーブルに書き出して管理する。 PS.教授は留守だ。
レコード削除などで発生した空き番号を再利用するのは、よく注意 しておいたほうがいいよ。ソート後の処理や古いリレーションがく っついたりして悪さをする可能性が無きにしもあらず。 うちは一度発行したインデックスを再利用することもレコード削除 することもしない。消すときには専用のフィールドに使用不可を表 すデータ(日付)を入れておくだけ。
306 :
308 :2006/02/17(金) 13:44:26 ID:???
ありがとうございます。 確かにMAX値を取ってくると弊害が出てきますね。 教えていただいた方法でやってみます。
307 :
NAME 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が発行できるのか(どこが間違っているのか) おしえてもらえないでしょうか。
よく知らんが、conn.BeginTransaction() の戻り値を cmd.Transaction にセットするんじゃないの?
309 :
307 :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
310 :
307 :2006/02/23(木) 06:42:48 ID:JubXzwgA
自己レスです。 309で、strSqlにSQL文を設定する処理を書き忘れてました。
保守
312 :
NAME IS NULL :2006/03/04(土) 22:20:53 ID:fUeZIVcy
。NETは伸びるでしょうか?
コボル、VB、JAVAみたいにこれっていう決め手が無い時代になるんじゃないの? 基本的な言語実装はJAVAも.netも大差ないんだから、両方使えて当然の感じじゃないと。
314 :
NAME 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を参考にさせていただきましたが、まだ何かが足りないみたいです。 「接続、トランザクション開始処理」 と「更新処理」を別サブルーチンで実行しているのに問題がありそうですが、将来データベースサーバーの移行を考慮して、是非分割して処理をしたいのです。 トランザクション処理に詳しい方、アドバイスいただければ幸いで。
分割する場合、分割した関数にConnectonとTransを渡せば良いだけじゃないの?
316 :
NAME IS NULL :2006/03/07(火) 19:44:56 ID:XuXd+j4l
#314 を質問したものです。 本件はトランザクション処理途中にSelect文が入っていました。それを回避することにより、問題は解決しました。 改めて分割処理で別の問題が発生しました。 Insert と Update 処理でフィールドがシフトして値が正常にセットされません。 ExecuteNonQuery文を実行する手前で設定されたSelect文の全てを表示させると 値は正しく設定されているのですが、実行すると値がひとつ後ろにシフトされてしまいます。 実情は正規のキーの値がキーフィールドと次のフィールドにも設定されている状況です。 現在Mysqlのデータベースで cmd.Parameters.Add("@fieldid",value)を指定してテストしています。 アトバイスあればお願いいたします。
>>316 データベースファイルに対して、ExecuteNonQueryの直前で生成し
ているSQLを直接実行した結果はどうなってるか確認した? 単に
SQLを読んだだけで「正しく設定されてる」とか思ってない?
Common SQL Environmentなんかで直にSQLを動かしてみよう。
318 :
jaxonnoby :2006/03/08(水) 18:27:12 ID:03WY8NAz
>>317 アドバイス有難うございます。
残念ながらデバッグ環境を持っていませんのでどうやれば良いのかわかりません。
ExecuteNonQueryのSelectではなく、cmd.Parametrs.Addに設定する値をResponse.Writeで表示して確認しただけです。
どうやらデータベース接続、トランザクション開始、と更新処理を分割したサブルーチンで実行しているところに
問題がありそうなんですが、最初に述べましたようにデバッグ環境がないので見当がつきません。
デバック環境持ってないってどういう状態よ。 今だったら幾らでもフリーでそろえられるでしょ。
320 :
jaxonnoby :2006/03/09(木) 16:43:18 ID:HS5VT+JN
319>> 今回の問題が発生するまでは全くデバッグ機能を使うことなくソースエディタとインターットだけの環境でプログラム開発ができていました。 一度Visual Web Developer 2005 Expressを利用しようと考えましたが、利用開始するまでに、手間がかかりそうだったので、利用をやめました。 おかげさまで、今回の問題は更新サブルーチン内のパラメータ設定でパラメータオブジェクトを 一更新処理の前にクリアしていないことにより、過去のパラメータが累積されていたことがわかりました。 いろいろアドバイス有難うございました。
>>320 データベースの更新直前に、どんなSQLコマンドが実行されるのかを
確認していれば、すぐに解決できた事例ですね。パラメータを使って
いると、そのへんの確認が面倒なんでうちでは自力で生成しています。
ウィザードとかパラメータは、見えないところが多いから正直使いに
くいと思う。トラブった時に追跡するのがたいへんだしさ。
というか.NET Framework SDKに超立派なGUIデバッガDbgCLR.exeがついてるだろ
323 :
NAME IS NULL :2006/03/13(月) 14:26:43 ID:9SgU+AsX
質問でつ。 あるADO.netを用いたアプリから、SQLSrv2kに、どれぐらいの頻度でどんなSQL文が投げられているのか 知りたいのですけど、これをモニタする便利な機能などあるのでしょうか? アプリのパフォーマンスアップのために、キャッシュなどを使い始めたのですが、どの程度効いてるのか 知りたいんです。 該アプリが使うデータベースやテーブルは決まっており、他のアプリがそれを使うこともないので データベース側でモニタしても構わないのです。 簡単なトリガが何かを書けば可能なのでしょうか? よろしくお願いしまつ。
>324 thx! こんなのがあったんだ。7年近く使ってきたのに… 思ってた通りのSQLが流れてて満足しました。 ありがとうございました。
>>325 こんなに喜んでもらえると嬉しいもんだな。
実行プランも一緒に使って、チューニングしてくださいね。
>>325 7年付き合ってた彼女が、ニューハーフだったと気づくことと同じレベル。
そいつはうれしいな
別スレで質問したのですが教えないと言われてしまいましたので、 こちらで質問させてください。 排他ロックについての質問です。 SQLSERVERにて、 sqlcommand.CommandText="select * from 'テーブル名' with(tablockx,tablockx,holdlock)" でテーブルロックがかかると思うのですが、 DB全体をロックしたい時は、どのような構文になるのでしょうか? ご教授お願いします。
Datasetが一気にすべてのレコードをサーバーからもってくるの何とかならんかな。 つまり、非接続型とかいう。Webアプリ前提の仕様やめてけれ。
>330 DataReaderでガリガリ頑張れ!
>>330 何が問題なのか判らんが。
画面一覧に表示してる間、レコードロックでもかけるの?
DBメンテと称してケーブル引っこ抜いてローカルで作業するとか
>>332 例えば、CSEみたいなSQL発行ツールを作ると、SELECT文で100万件返されると、
全レコード返るまで、結果が見れん・・・
いや、発行ツールとはいかなくても、例えば、過去の売上データをユーザーが指定した 条件によって検索する画面とかで、レコード件数が多いと明らかに、不利だ。 クラサバアプリでは、非接続型は明らかに、つかえん。 もうちょっとインテリジェンスにレコードが要求されたら、その都度サーバーからフェッチしてほしいものだ。 ClickOnceなどの自動配布機能を提供するなど、MSもスマートクライアントに時代は移ると呼んでるふしがあるが、 非接続型じゃ駄目だ。
別にそれは非接続型云々関係ないように思うが。 もし検索を件数で打ち切りたいなら、DataAdapterを使わずにDataReaderで取得した結果をDataSetに押し込めばいいだけだし。 クラサバアプリで使えないってのは、貴方の考えが着いていけないだけなのでは?
>>336 禿同
テーブルなめるバッチ処理のプログラムでDataSetを使ったプログラム見たときは目眩がしたもんだ
>>336 いや、件数で打ち切りたくないのです。例えば、グリッドに表示するとき、
初め、グリッドに最低限表示する分をフェッチして、スクロールバーでスクロールされて、
表示に新たな行が必要な時に、初めてフェッチされるイメージです。
元々、私Delphi人間なんですが、DelphiのあるDatasetはまさに、それをプログラムレスで
自動でやってくれるもので。
遂、比較してしまいます。
DataReaderって接続型なんですね。確かに、おっしゃる通りで、できそうですね。
すみません。
質問宜しいですか? あるASP.NETで作られたボタン付きのページまでのURLが有るとして、 まだ一度もサーバにアクセスしていない状態(ページをロードしていない) からURLを打ち込み、以前のASPのように(.NETだとViewStateですか) URLの後ろに引数を付けて、そのページのボタンを押した時と同じ動作を させることは可能でしょうか? セキュリティから見ると余り作法が良いとも言えませんが、サーバ側で接続時に 作るインスタンスが未生成の時の動きを、ページの初期ロードだけではなく、 そこにひと味付けると言う意味で、教えて頂きたいと思いました。
339です。誤爆しましたごめんなさい。
341 :
NAME IS NULL :2006/03/27(月) 02:14:34 ID:vkv27tSb
ADO.NetのアダプタのUpdateコマンドだけど、 これってテーブルの、変更された行毎にSQL投げてるわけじゃないですか。 と、するとね、 コミットって、HDD上にログを書き終えて初めて返ってくるわけでしょ? つまり、オートコミット・モードだと、 コミット→ [SQL処理→HDD上ログ書込→コミット]x n →SQL処理 となって、延々とHDDアクセスの待ち時間が掛かるわけだ? そう考えると、コネクションにトランザクション設定しないととんでもない パフォーマンス低下だよね?
342 :
NAME IS NULL :2006/03/27(月) 02:29:26 ID:r0hE9Y7s
>>341 オートコミットだとログは書かなかったような気がしてきた。
だとしても、HDD上のテーブルの、一行更新し終わるまで
Updateを呼んだプロセスなりスレッドなりは待たされて、
数千以上のCPUのクロックを無駄にしてから、次の一行更新
に取りかかるわけだよね?
ちなみに、トランザクション設定しても、 一行分ずつSQL送りよるね。 何でコミット送ったときにまとめて送らないんだろ…
>>343 なんでまとめて送るって思えるんだろう?
やりながらNGになってロールバックっていう処理だってあるじゃん。
在庫を引き当てつつ処理してるけど、ある時点で在庫つきたからロールバックとか。
その処理をDataSet内のデータのみで一括でやるのはおかしいよ。
>344 そうだね。 でも、アダプタのUpdateに関してはまとめて送るべきだと思う。
>>345 2.0(2005)からそうじゃなかったっけ?
あげ
age
349 :
白馬の玉子 ◆PqSzNbkqDo :2006/04/11(火) 18:39:00 ID:bho/Vj3W
ども。 あっしのようなやつでも、お力になれるなら、 いつでもどぜう。
保守
あげ
MDBをOleDBで使用して TableAdapterのUpdateCommandプロパティを使用してデータの更新をしようとしていますが、 OleDbではTeansactions.TransactionScopeは使用できないようですが トランザクションを利用するにはどうすればよいでしょうか
ODBC?
JetもSQLSvrも、トランザクションのスコープには実質未対応(未実装)だったと思う。 あれって、DBMSの機能をオブジェクトでカプセル化してるだけで、 ADO.Netがなにかをやってくれるわけじゃないと思うんだけど。 違ったらすまん。
>>354 >あれって、DBMSの機能をオブジェクトでカプセル化してるだけで、
そのとおりで、直接DBのトランザクションを使う場合とCOM+の分散トランザクションを使う場合に
同じ書き方でスコープ単位の宣言トランザクションを使えるのが売り。
ただJETも一応トランザクション機能を持ってるからどうして使えないかはちと調べてみるか。
356 :
NAME IS NULL :2006/05/01(月) 11:57:06 ID:NfBg2Jco
ASP.NET 2.0でも,DataTableの結合ってできませんよね? あらかじめ結合した状態でDataTableを生成すればいいんだろうけど, 事情があって,異なるデータベースからDataTableを取得して,結合 できれば,とても便利なんだけど。 ググってみたけど,ヒットしなかったので,多分駄目だとは思うのですが。
>356 リレーションシップを設定するのは簡単だから、結合する処理を実装すれば 良いだけでは?
保守
保守
360 :
NAME IS NULL :2006/06/09(金) 11:12:06 ID:Kt0WadUm
>>356 もう超亀レスだけどw
Mergeとかどうよ?
361 :
NAME IS NULL :2006/06/09(金) 15:10:14 ID:qq5u1iF/
ADO.NETで、単純にSELECTの結果の一覧を取得するだけ(つまり他のコントロールと連携などしない)場合 どの方法がもっとも速いですか?
>>362 ごめん,.NETね。
SqlCommand.ExecuteReader
hosyu
ム板から誘導されました。 DataTableにExpressionプロパティ入りのDataColumnを追加して、 SqlDataAdapter.Updateしたら、 「Expression列のReadonlyを変更できませぬ」という 例外が出ました。 そうはいってもExpression列のReadOnlyはデザイナ上でだってfalseには できません。 この列以外は全部ソーステーブルと1対1です。 どこをどうしたらいいんでしょうか。 いまはとりあえずUPDATEの後ろのSELECTをコメントアウトしてしのいでいます。
>>365 追加したExpressionプロパティの処理内容と、具体的なエラーメッセ
ージ、および暫定対処のselect内容を、もっと正確に教えてたもれ。
367 :
365 :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の使い方がまずいのでしょうか?
>>367 自動生成は冗長なんて面倒だよね。
Form_load時のFillコマンドで実際に生成されるSelect文は動いている
ようだから、Updateの末尾にあるSelect文のと差異を見つけられるか
もしれない。
もしくは前者のSelect文を、そのままUpdate文に連ねて書いてみると
か、NonQueryを使って自力で実行させるという手もある。
>>367 VS2003が手元にないのでVS2002で試したところVS2002で同じ現象が確認できました。
VS2005ではエラーは起きませんでした。
370 :
367 :2006/06/27(火) 11:19:13 ID:???
>>369 うーむそうすると1.xのバグ(又は仕様)なんでしうか・・・
実際作ってるプログラムでは「サーバー側で既定値を設定させて
その値を返してもらう」とか、そういうことはしていないので、
INSERT/UPDATE後のSELECTは必要ないと思う
(同時実行制御はしてるから自分のところの値で更新されてるはず)
ので、とりあえずSELECTなしにしています。
とはいえ解決はさせたいので
>>368 をヒントにいじってみます。
ReadOnlyExceptionをスルーさせればSELECTありでも動いているように
見えるんですが、この場合更新件数は返ってきませんorz
371 :
367 :2006/06/27(火) 18:33:50 ID:???
373 :
NAME IS NULL :2006/07/10(月) 15:04:36 ID:aBIIL5KH
ADO.NET2.0を利用しています。
DataSet内のテーブルに集計用のクエリを発行してその結果を受け取ることは可能でしょうか?
>>356 と全く同じ状況で、異なるデータベースの異なるデータセットから親のデータセットに
Margeでテーブルだけ移動させてリレーション作成してrow.GetParentRow("リレーション名")で
データは取得できるようになったんですが、これを元にして集計を行いたいんです。
鯖に一時テーブル作成してそこに一旦データ書き込む方が現実的なんでしょうか?
>>373 DataRowのExpressionを調べる。
DataGridViewを使うようなプログラムで、みなさんはどういうやり方をしてますか? データの取得に・・・ DataTable(DataSet)にFill or DataReader DataGridViewに・・・ DataTableやDataSetをバインド or RowCount自分で増やして1行ずつ書き込み DBに戻すのに・・・ DataAdapterでUpdate or Executeでこつこつと・・・
読むのも書くのもSQLを自力で書いてExecuteしてる。 自動生成は正直使えないと思うよ。
結合表に対して更新できないからね。 昔でいう、アクセスのウィザードで出来る程度の画面だったら自動のSQLでOKでしょ。
378 :
NAME IS NULL :2006/07/14(金) 00:07:19 ID:TdnpPvu/
DataTableをAccessなんかでいうところの「ワークテーブル」みたいなものに見立てて、 DataTableとDBとのやりとりは、DataAdapter DataTableと画面とのやりとりは、指定の場所に直接書き込みってな感じが多い。 基本的にはこれでいいんじゃないかと思っているが、 データ量が多い時の動作はバインドするほうが軽いような気がする。
379 :
NAME IS NULL :2006/07/18(火) 00:17:56 ID:q2vjaqgB
非常に素人な質問で申し訳ないのですが ODBC接続が可能なDBとういのはADO,ADO.NETで 接続可能と考えていいものなのでしょうか? ご教授ください。
381 :
379 :2006/07/18(火) 22:07:39 ID:???
ループ処理で新規レコード追加しまくりな時に、SELECT * FROM tableのSQLで DataAdapter.Fill(DataSet)してからNewRow()で追加しているんだが、 追加側のレコード参照しないのにFillで全件取得するのは時間の無駄だよな? TOP1とかSQLに加えて取得数制限した方がいいんだろうか
>>382 事前に定義済みのDataSetなら読み込む必要はないし、そうでないなら where 1 = 0 でもつけて読み込めばいい。
絞込みの条件無しで全件読み込むのはレコード数が少ないことが保障されていない限り使うことはない
・・・はずなんだけど、たまに見かけるorz
事前に定義済みのDataSetってのがよく分からないのでwhere 1 = 0 を使わせて貰うぜ!!!!!!!!!!
SQLインジェクションを連想してしまった。
あややが「イン・ジェク・ション!イン・ジェク・ション!」って 連呼してたCMは、最初どきっとしたもんだ。
MSのSqlServer2000にVB.NETのSqlClientで接続しています。 SqlCommandのExecuteReaderメソッドでSELECT文を投げて DataReaderオブジェクト取得した場合結果セットはどこにあるものなのでしょうか? よくわかってないのですがクライアントアプリケーション側に 全結果が来てるわけではないのですよね? 変な質問で申し訳ないですが教えてください、お願いします。
>>387 結果セットはどこにも存在しない。
クライアントはサーバーから送られてくるデータを順次処理するだけ。
DataReaderは前方スクロール専用でRead Only。
390 :
387 :2006/07/26(水) 22:06:52 ID:???
>>388-389 ありがとうございます
実は
>>389 さんが紹介してくれたサイトを見てもわからなくて質問しました。
どこにも存在しないというのはデータベースにもないのでしょうか?
でもどこかに結果があれば前方向だけというのはおかしいですね・・・
DataReaderオブジェクトのReadメソッドは奥で何をしているのでしょうか?
そんなこと気にするより先に覚えることあるんじゃないかな……
392 :
390 :2006/07/27(木) 01:44:41 ID:???
msdnに ADO.NET の DataReader を使用して、データベースから前方への読み取り専用のストリームを取得できます。 結果はクエリを実行すると返され、DataReader の Read メソッドを使用して要求するまで、クライアントのネットワーク バッファに格納されます。 と書いてありました。 わかったようなわからないような、ですが。 前方のみなのはそもそもサーバカーソルを使うわけではないということなんだと勝手に納得しました。 お騒がせしました。
age
そもそもカーソルと言ったら普通はサーバー側のカーソルを指す。 で、フェッチしたデータをクライアント側でキャッシュして、前後方向に移動できるような機能がADOに追加され、 それがクライアントカーソルと言われるようになったので、従来のサーバー側のカーソルを サーバーカソールと言うようになった。だから、データベース側から見れば、 クライアントカーソルの存在なんてしったこっちゃない。 クライアントカーソルはあくまで、クワイアント側が勝手に提供している機能。 それをごっちゃにしてるから、こんがらがるんだよ。 で、サーバー側のカーソルは今までは後方移動しかできなかった。最近のデータベースは 前方移動できるカーソルもサポートしているのもあるらしいが、 詳細は各データベースにゆだねる。
スピードもうん十倍差があるし、 なんかあった時の不具合の習性でわけのわからない自動生成SQLの 変な癖で"Microsoftむかつく"と思いながらいちいちSQL文変えるの考えると 考えるとDataReaderとベタ書きSQLでやるほうが結局いいかもね。
これはADOというかデータベースの問題かもしれませんが・・・ nullと空文字列は違うといいますが、たとえばデータを保存する際に その項目が空だったら、varcharのフィールドには空文字列orDBNullのどちらを入れますか? 何も入っていない=nullというルールで統一したいところなのですが、 nullをいれるのってコードを書く際に結構面倒ですよね・・。 Accessなんかでは空文字列はプロパティで許可しないと入れられないので 昔から空文字列を保存するのはよくないというイメージがありまして・・・。 しかし、最近になって空文字列で統一されていれば データをいちいちnullチェックしなくてすむのは楽だなと思ったりしました。 すべての文字列の項目を空文字列で統一するとなにかデメリットがあるんでしょうかね?
397 :
NAME IS NULL :2006/09/12(火) 19:04:58 ID:pkmJ9WSM
VB.NET + ADO.NET + SQLServer2005Express です。 アプリケーションのバージョンアップに伴いサーバ側のテーブルや ストアドプロシージャも変更できるようにしたいと思っています。 それで、データベース側に ServerDataTable Setting Value ---------------- Version 1.00 みたいなテーブルを追加して、この値をアプリケーションから参照 した上で、必要な差分のぶんだけデータ定義コマンドを投げようと 思っているのですが、これで問題ないでしょうか?
ADO.NETと関係ないね…それはシステム設計や運用の問題だろう… その手の問題だとDBのリソースがどの程度つかえるか、 アプリケーションをどのように管理する予定なのかという 状況もわからないとその質問に明確に答えてくれる人はいないとおもうよ。
>>398 ちょっとそこら辺、諸事情であまり書けないもので。すみません。
ありがとうございました。
>nullをいれるのってコードを書く際に結構面倒ですよね・・。 普通、コードで何もいじくらなければ、デフォルトで既にnull入ってねぇか。。
401 :
NAME IS NULL :2006/09/19(火) 11:04:32 ID:gIiqmeGm
ADO.NETから、パスワード設定をしていないmdbへの接続サンプルは ヘルプにもネットにも沢山ありますが、パスワード設定をしている mdbファイルへの接続方法がのっていませんよね。 mdbファイルのパスワードがpaの場合、接続文字列の最後に「password=pa」と か追加してみても駄目でした。 パスワード設定をしているmdbへ接続するにはどうしたらよいのでしょうか。 どうぞよろしくお願い致します。
>>402 ありがとうございました。
「mdb "ado.net" 接続」などでやっていたところ、一番単純な接続サンプルしか出てこなくて
無いのかなと本気で思ってしまっていました。
ご迷惑おかけしました。
404 :
NAME IS NULL :2006/10/01(日) 12:34:15 ID:+1GZROl8
datareaderってサーバカーソルを使ってないの?
.netの先のDataドライバと、DBMSの仕様によるんじゃないの? ADO.net2.0としてはそれは認知してないと思う。
OracleやSQLServerだとサーバーカーソルを使っていると言う事で良いのかな?
MSSQLServerはサーバーカーソルは使ってない。 使ってないから1つのセッションで開けるDataReaderは1つだけ(MARSを除く)の制限がある。 サーバーカーソルを使うとfetchするたびに通信の往復が発生するが、 DataReaderはクエリーした結果を一度に受け取っているイメージで、全部読み終わるまでのスピードが速い。 もちろんパケット単位で分割はされているだろうしそれ単位でのフロー制御はある。
>>394 スクロールカーソルはSQL92でも規定されているし、SQLServer、Informix、DB2はかなり初期から実装している。
反面Oracle、Postgres、myはたしかサポートしていない。
>サーバー側のカーソルは今までは後方移動しかできなかった。
というのは間違い。ただ処理系によって違うというのは事実だね。
このためoracleのodbcやoledbで任意の位置にスクロールさせるためにはクライアントカーソルにする必要がある。
ADO.NET(system.data.sqlclient)ではサーバーカーソルを全否定してるんだよね。
読み取りはfirehoseのみ、更新はupdate/insert/deleteを直接使えよと。
一方でMicrosoft.SqlServer.Server名前空間ではしっかりサーバーカーソルが使える。
つまりサーバーカーソルはストアドなどサーバーサイドで使えという考え方らしい。
411 :
NAME IS NULL :2006/10/27(金) 01:10:44 ID:0en0NyWg
あげときますね。。
伺います. Accessのファイルから縦n 横mの要素でクロス集計を行わないといけないのですが, どういう手法がありますか? エクセルを埋め込むのは駄目らしいです...
>412 ふつうのクロス集計だとダメなのか
415 :
412 :2006/10/31(火) 10:02:26 ID:???
すみません,別件のデスマーチに巻き込まれておりました... VB.NET(C#でもいいんだろうけど)で Accessファイルから取得したデータを使用してクロス集計を行うのですが. n行×1列じゃなくてn行m列のピボットテーブルを作成するには どういう手法を使えば簡単か伺いたいのです. ADOでデータ取り込みまではできたのですが, じっさいどうやればクロス集計に持っていけるのかがわからないでいます >普通のクロス集計 でいいのだとは思うのですが,サンプルコードが載っているページとかないでしょうか? 最終的にはデータグリッドビューを使用することになると思うのですが,それで間違っていないかの確認もいただけたらと思います.
416 :
414 :2006/10/31(火) 17:25:31 ID:???
>415 データ読み込んでからクロス集計するロジック書けないなら、データを読み込む前にクロス集計 してから読み込め 参考SQL TRANSFORM 〜 SELECT 〜 FROM 〜 GROUP BY 〜 ORDER BY 〜 PIVOT 〜; こんなのあまりに初歩過ぎてサンプルコード無いのでは???
417 :
412 :2006/11/01(水) 15:53:14 ID:???
>>416 ありがとうございます.
Accessのファイルからの読み込みでは
n行1列しか扱えないと聞いていたのですが.
そうではないのですね.
そろそろ組み始めていきます.
ありがとうございました.
>>412 デスマーチ・・・
SQLもわかんねーやつがデスマーチ・・・
しかもMDB・・・
だからデスマなんでしょ
DataView クラスの AddNew() メソッドで DataRowView を追加しても BindingManagerBase(CurrencyManager) の Position プロパティにも Count プロパティにも行数が反映されないんだが、これは .NET のバグなのかなぁ? 新規の行は作成されてるみたいなんだけど、どうやっても 移動できなひ・・・ちゃんとできてる人いる? できなきゃおとなしく DataTable 使うか・・
421 :
420 :2006/11/09(木) 10:43:43 ID:???
自己解決しました DataView から CurrencyManager を取得した場合でも DataView の大元の DataTable に反映させないと Count プロパティは 変わらないのですね。 っつーことで EndEdit() で解決 TextBox あたりに DataView バインドした場合は CancelEdit メソッドは 使えないということですな、、、自前で Delete するか。 いやいやスレ汚しスマソ
スレ汚しついでに書いとくと、あくまで DataView に AddNew() した 場合で、普通はせっかく CurrencyManager 取得するんだったら こっち側の AddNew() & CancelCurrentEdit() 使うわなつーことで。
ADO.NETはサーバーカーソルが無いのでUPDATE時の排他チェックで困ります〜 orz
ADO関連によい参考書籍はどれがお勧めですか? プログラミングMicrosoft ADO.NETがamazonで評価高いですが高くて。
@ITの連載と、MSDNだけで十分。
データーベースは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 となります。 どのような処理をすればよろしいのでしょうか?
初心者には敷居が高い_| ̄|○ ↓こーいうクラス作ってて #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への代入でエラーがでます・・・なぜ?
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
Dim AddRow(5) As DataRowになってないからじゃね?
431 :
430 :2006/12/20(水) 13:53:04 ID:???
ああごめん。流し読みしてて間違えた。 AddRowの引数はフィールド指定だったね。 事前にNewRowで空行を生成してないからじゃないかな?
432 :
NAME IS NULL :2006/12/20(水) 20:28:07 ID:h1j7g+Lk
>>431 さん
ずばりその通りでしたorz
もいっこ質問なんですが、みんなデータベースアプリ作るとき(小規模な)1テーブル1クラス?
それともReaderクラスとか処理系ごと?
教えてたもれ!(*゚∀゚)=3
joinする場合とかあるからReaderClassだな。
DataGridViewで一番下の*の付いた行を削除しようとされると InvalidOperationException で落ちます。 どうすれば阻止できますか?
まにあるにヤメレと書いておく
グリッドから新規行の追加なんてさせるなってことさ。 せいぜい編集くらいに止めておくべきだよ。
AllowUserToDeleteRowsをfalseにして自分で処理すれ
indexがテーブルの行数を越えていたら無視
そうなんだよなぁ。 グリッドに表示されているCurrentRowIndexと、テーブルのRows.Count にはズレが発生するから、そのまま使ってると後々面倒なことになるし。 うちはCurrencyManager経由でごまかしてるけど、このへんの実装って おかしくね?
おかしくない、新規入力中の行はGrid上は有り、バインド元無しってのは正しい。
ああごめん、入力中のじゃなくて
>>439 絡みの削除について書いてた。
Rows.CountはRowStateの状態に関わらず全数取得するのはわかるんだ
けど、例えばDeletedを除外した結果だけを返すとか、もうちょっとオプ
ションが欲しいなと思ってさ。
うちはまだ1.1ベースだけど、2.0以降になったらまた変わってるのかな?
そもそも行扱いなのがいけない
新しい行でデリート押したら死亡したw
まあ、DataGridは一覧表示&一部編集&複数行の一括削除くらいでやめ ておくべきだね。行追加は項目数や内容によっては横長になりがちだし、 入力チェックも面倒そうだ。
行の作成か削除のどちらか無効にしないと確実に落ちるから 明らかにバグだろ
catch(InvalidOperationException e) { if(dataGridView.CurrentRow.Index > dataTable.Rows..Count) MessagaBox.Show("消すな( ゜Д゜)ゴルァ!"); 〜 }
2005でも解決してないの?
450 :
NAME 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です。
普通は空の行消そうとなんか思わないだろ
それをするのが一般ユーザーの恐いところなんだな。
453 :
NAME IS NULL :2007/02/02(金) 22:27:25 ID:fdCBEJdL
2002で戸惑っていて、やっと慣れたとおもっていたら、2005でまた大幅に 仕様が変わっているとか書いてある。。。こんなペースのバージョンアップで 開発なんか出来るのかなぁ。。
DAO ↓ RDO ↓ ADO ↓ ADO.NET 1.1 ↓ ADO.NET 2.0 毎回、大幅に変わってますが何か?
455 :
NAME IS NULL :2007/02/08(木) 20:31:14 ID:IHk50Zf7
ま、ローカルに2次元の変数を宣言していて、そこに代入して言っているという イメージに変わるってことなんだろうけど、更新とかのノウハウがいまいち分からない。。 同時アクセスしてきた時の処理とか
456 :
NAME IS NULL :2007/02/12(月) 20:35:04 ID:PC2a0r5+
谷尻さんの書籍、2005になって内容が大分分かりやすくなった。 各クラスの説明や、操作の方法をサンプルを交えて解説してある。 以前のバージョンのは、分かりにくかった。 解説がプロパティをいじるだけで終わりとかだったからなぁ。 ただ、2005のものは、同時アクセスの制御について記述されていなかった事が 残念だと思った。
457 :
NAME IS NULL :2007/02/14(水) 22:18:52 ID:A1GGRfpp
情報量が多くなって来て、要点を抑えた簡潔なものが手に入るようになってきたんだと思う。 以前は、「大量の文章」もしくは「ウィザードでグリッドに表示させて便利でしょ?」というものだった。
前バージョンの谷尻さん本は、正直キツかった。 ウィザードがんがんパラメータごりごりで、CommandBuilderが生成した 冗長SQLみたいだと思わなかった?
>>458 買って愕然としたよ。定番の書籍だからあれで勉強しようと本気で思っていたのに。
基礎編と応用編両方ともがウィザードばっかりなんだもん。
今回の書籍を読んで、当時は書いた本人もあまり理解していなかったのでは?
と思った。この人について詳しい事は知らないけれど、こういった、新しい技術系の
書籍の著者は技術に長けているのではなくて、翻訳が出来るだけだと聞いた事がある。
>>459 だよなぁ。
オレがVB6で教えてもらってたとき、コネクションから更新まで全部
コードで書くやり方だったんで、ウィザードまかせの解説本はどうに
も合わなかったよ。2005版で良くなってるのなら、ちょっと立ち読み
してこようかな。
DataAdapterをO-Rマッピングツール、それを前提として設計してるならウィザードのみでいけるんじゃないの? そうじゃない設計のテーブルだと、結合とか入って更新不可な場面ばっかりになるから。
結合して更新不可とか書いてる時点であかんだろ。 ごった煮テーブルだろうが何だろうが、SQLで直に更新するのが結果的に いちばん楽だよ。O/Rマッピングは単に手間を減らすだけで、チューニン グやデバッグにはSQL不可欠だし。 何でもかんでもオブジェクト指向ってのは、正直良くない潮流だよなぁ。
自称ADO.NETの申し子なんだが おまいらの言ってる事がひとっつも理解できないぜ!
まだ子どもだからだろう
ADO.NETの萌えっ子だったらよかったのにな。
>>460 俺の場合もコネクションから更新までをコードで書くやり方で習ったせいか、
データセットやアダプタ、コネクションをデザイナに貼り付けてコードを書くやり方は
いまいちしっくりとこない。
フォームで動くオブジェクトならわかるが、そういうもの以外をはりつけていくと、
コードが分散していくし、オブジェクトが多くなると不必要に画面を占領していって
分かりにくくなると思う。
デザイナはコードを目で追わなくても、一目で、データセットやアダプタの状況が分かる
ということのようだが、あのやり方に慣れたとしても、他のオブジェクト指向プログラミングには
生かしたり出来ないと思う。
抽出にしろ更新にしろ、ロジックだから プログラム内に書かれているほうが 後から追いやすいし、メンテしやすい。
「DataSetやAdapterをウィザードを使ってデザイナに貼り付ける機能」は、 「プログラミングを触ったばかりの人向けに、ループをウィンザード形式で実現する機能を提供する」 というものと似ているものなのかなと感じた。
>>462 だからO-Rマッピング"前提の設計"って書いてるでしょ?
ADO関係なく、O-Rマッピングが使えてるプロジェクトってのはそうやってやってるの。
>>463 さんのようなSQL直ってのは排除する前提ってのがまずありき。
×「O-Rマッピングが使えてるプロジェクト」 ○「O-Rマッピングを使うためのプロジェクト」 確かに設計段階から使うことを想定していれば、ORMに最適化されている んで使い出は良くなるだろうね。一から起こせる新規の案件で、チーム全 体にORMが浸透している必要があるけど。 ORMだろうがSQL埋め込みだろうが、要は作る側の都合なんだよ。 使う側にとっては、要件を満たした動作をする限りどっちでもいいだろ。 優劣を競うことに意味は無いし、優れた成果物を作る方に専念しようよ。
誰か DataAdapter とウィザードを使って O-Rマッピングする方法を教えてくれ。 O ってのは、もちろんデータセットではなくて、自分で作ったクラスな。
>>475 残念〜ADO.NETはR-Oマッピングなんだよ。
DataSetやDataTableなんかは、データベースに接続しなくても作る事が出来るわけだから、 2次元配列とかで複雑な処理をするコードを書く際に使えるなとも思った。 配列にソートやフィルタ機能がついてるクラスって見る事も出来るわけなのだから。
テーブルに主キーを追加する方法がわかりません。 Dim column(1) As DataColum column(0)=ds.Tables("table").Columns("ID") ds.Tables("table").PrimaryKey = column とすると列'ID'にはNULL値が含まれています。とエラーがでます。 ただ、このID列にはすべて数値が入っていてNULLではないことは確認しています。 他に設定が必要な項目があったら教えて下さい。
>>479 コードは間違いないと思う。
配列宣言はcolumn(0)じゃないのかなぁ。
試しにcolumn(0)にしてみましたがエラーは同じでした。 これはMSDNにのっていたサンプルでは 実際に使用している配列数+1の表記だったので何も考えずにそのまま使いました。 MSDNのサンプルだと新規にカラムを追加して、それを主キーとして設定するもの なのですが、私の場合既存のカラムを主キーにしたいのです。
新規にテーブルを作って試したところ、 無事に主キーを設定することができました。 原因特定できずに気持ち悪いままですが一応解決です。
主キーを設定する前にDataSetに行追加してました。 その後でUpdateを呼び出して同期したと思っていたら、これは DataSet --> Database の一方通行の書き込みだったのですね。 ID列の値はDB書き込み時に設定されるので、 これだとDataSet内にあるID列は確かにNULLですね。 エラーがでるはずです。
私は今までの技術の流れの方を知らないんだけれど、このペースで行くと、 今のDataSetやDataAdapterはいつごろ使えなくなる技術になるのでしょうか。
しらねー。 .net フレームワークが続けば、基本的には変わらないと思うよ。
>>484 早ければ C# 3.0 の時代から。「使えなくなる」わけじゃなくて、「使う意味がなくなる」
ってことだけど。
>>486 VB.net 3.0や、VC.net3.0じゃ駄目ですか?w
プロプライエタリな技術やノウハウは、確かに怖い罠。
>>487 VB は次のバージョンが 9.0、VC は cl のバージョンでいえば 15 かな?ww
概ね、
>>454 の流れで来てたと思うのですが、こういう技術は何年持っていたとか
あると思うのですが、そういうのはまちまちなんですか?
もって3年間くらいだろうとか。
で、それを考えてどうすると? 別にDAOの時代からそれほど大きく変わってないわけだし。 DataSetの概念は少しギャップあったけど、その程度付いてけないのは?だし。 入れたアプリの耐用年数を考えるなら、環境固定するか、メンテ契約結ぶしかないだろ? そうじゃなしに未来永劫新OS対応なんて、普通のアプリでもやってない。
ちょっと不安感があったんですよね。 今はそういう流れについていけるけれど、将来はついていけなくなるのかなぁと。 Cobolで学んだ事(ループやら関数の設計やら)は、今でも生きているんだけれど、 Cobolプログラマはどうして時代についていけずに解雇される事になってしまったんだろうか。。。 と思う。
Cobolの動く環境が消えていくのに、他の言語表現を学ばなかったからじゃね?
コーディングの違和感から、拒否してただけと捉えてていいのかなぁ。。
×拒否してただけ ○逃げていただけ
なるほどね。確かに根本にある理論を捉えていれば、関数の書き方など各種構文が変わったとしても それについて行く事は出来たはずなんだろうね。 でも、そういうところの覚え直しの面倒臭さがあり、やらなかった。それだけなのかな。 ちょうど、今の状況がそれに似ているのかもしれない。 OSがバージョンアップして、開発環境も2005になって、Offceまでインターフェースが変わった。 動作確認やら、メニュを覚えるのがめんどい、軽い環境の方がいいなどといいつづけて、 自分の使う環境をいつまでも古いままでやっていたら、XP限定の技術しかもっていない状態になる。 サポートがあるといっても、XPのみで構築するという環境は相当な無理と大幅な限定条件がのしかかって 来る事になる。これから販売されるパソコンのほとんどはVistaなのだから。
新しいことを学ばない技術者なんて、(゚听)イラネ
でもさ学んだ技術が2,3年で陳腐化するのは悲しくないか? 他の業界と比べて技術革新のスピードがだんちなのはわかるけど。
だから、DAOの頃からADO.netで、全く一切合切何もかも変わったか? コネクション作って・・・って全く同じだと思うが。
細かい言語仕様変更のたびに、表記や手順がころころ変わるのが面倒。 せめて一世代くらいは上位互換をきちんと保って欲しい。 2005でVB6.0に擦り寄ったのは、予想外に2003が普及しなかった からだろうしさ。
このスレの93にある 複数テーブルを読み込んでデータ更新までやるサンプル が書いてある書籍はまだないのでしょうか? VB6でやっていたワークテーブルを使ったデータ処理がどうしても理解できません。 (顧客マスタ(参照用)、商品マスタ(参照用)、在庫数(実際更新したいテーブル)などを一覧表示して入力させ、一括更新したいのです) DataTableのテーブルをSQLで更新などもやはり出来ないのでしょうか? いろいろ探してみたのですが分からないため教えてください。
>>501 更新したいテーブルがひとつだけなら、CommandBuilder使うなり
自力でSQL書くなりしても、言うほど手間じゃないと思うんだが。
>>502 分かりにくくて申し訳ありません。
顧客ID
商品ID
在庫数
というテーブルなのですが
実際の入力は
商品
顧客 あ い う え お
a □ □ □ □ □
b □ □ □ □ □
c □ □ □ □ □
d □ □ □ □ □
の□の部分にデータを入力させて、横並びのデータを一括更新したいのです。
今まではワークテーブルを使ってこちょこちょやっていました。
今もワークテーブルでやる処理は出来ているのですが
遅くて困っています。
全部DataTableのメモリだけで処理して速くしたいのですが。。
DataTable-DataViewGridの関係と、DataTable-DBのテーブルの関係は独立。 なので、UI層はそのままつくって、DBに取り込むときにがんばればよい。 ベタに作れば?
>>504 今速くしようと考えている方法ですが
1)DataViewGrid用のDataTableを作る
2) そのDataTableに複数テーブルからデータを入れる
3) 入力させる
4) DataTableを展開してデータベースを更新する。
という方法でよろしいのでしょうか?
自分がやろうとしてる方法がいいのかどうか
いい解説本が見当たらなくて・・・
良し悪しは最終的に自己責任。 普通にそれでいいんじゃないの? DataTableは単なる器と割り切って。
今回のADO.NETは、updateを手書き方式にしているのは、テーブルのリレーションを 組んだ場合でも柔軟に対応出来るようにするため、自由度を高くしたみたいなことが 書かれていたけれど、それらを一発でやろうとすると複雑になっていって、機能拡張時に バグを生む要因になったりもするので、やはり処理するテーブルはリレーションは もたせずにしておいて、テーブルのリレーションはプログラミングのコードで 処理する上で実現するようにした方がいいかなと思った。 こういうやり方だと、DataSetを使う必要も無くなるので、テーブルを読み込む時は、 すべてDataTableを使い、テーブルの数だけDataTableを変数宣言するようにする。 そして、処理して更新する。というやりかた。 M:Cのリレーション結果のテーブルデータを受け取り、処理する。 V:ユーザの入力 C:単一テーブルをうまく読み込んで、リレーションテーブルにする。 テーブル2個分DataTableを宣言することになるのでちょっと重くはなるけれど、 拡張性的にはこれがいいと思う。
複数テーブルを使った更新は、分厚いADO.NET公式解説の本か、 谷尻さんの2005にあるよ。そのまま使えるかどうかは分からないけれど。
>>506 ,507
ありがとうございます。とりあえず作ってみようと思います。
>>508 その本両方とも持っていますが、こういう形ではなくて困っております・・・。
既出だけど、このソースを買って使うという方法もあると思う。
http://www.aster-world.com/soft/adonetdb.html このクラスで、データを読み込み、このクラスが持っているDVをグリッドに連結させる。
そしてユーザが入力して、更新する時はメソッドを実行するだけ。
(複数のテーブルを読み込んでいても、更新用のコードは自動生成される。)
この方法は、かなり手軽になるけれど、そのコードがうまく動かない時の対処が
うまく出来なくなる可能性があるという欠点がある。
>>510 よさそうですね。
LightEditionでも買ってみようかなぁ・・・。
へたな本数冊かうより勉強になるかもしれないし。
513 :
NAME IS NULL :2007/02/28(水) 23:55:10 ID:dj/lilwU
.NETではないほうのADOなのですが、、、 レコードセットの一部のフィールドのみを抽出して 新たなレコードセットを作りたいのですが、可能でしょうか? ExcelのCopyFromRecordSetメソッドで 一部のフィールドのみをセルに貼り付けたいのですが。。
514 :
NAME IS NULL :2007/03/02(金) 20:25:42 ID:G4Qfbl+H
filterかけて、それを全件ループしながら、新しくレコードセット変数を宣言したものに、 addnewしていけばいいんじゃないの?
>>514 レスありがとうございます。
本日その方法で解決しました。
いままで普通にセルに貼り付けてたのですが、
この方法にして性能が10倍以上上がりました。
516 :
NAME IS NULL :2007/03/03(土) 14:33:05 ID:QXqyM9Ns
リレーションを組んだテーブルを読み込んで、それを操作して 更新するという一連の処理において、定番と言うようなサンプルが見当たらないので、 具体的にここで作っていってみて、みんなで検討するというのをやってみると どうかな。と思ったので、先ずは処理を行うテーブルの設計をしてみた。 <商品マスタ> ・SyouhinID:数値型、主キー ・商品名:テキスト形式 ・価格:数値型 <売上> ・UriageID:数値型、主キー ・商品ID:数値型、商品マスタのIDの値が入る ・数量:数値型 ・合計:数値型 すでに、方法論は、上の方に出ているけれど、コードレベルでの 具体例がないので、ここで進めていってみたいと思う。 そして、その方法のメリットとデメリットを書くみたいな。
目的 ・ある日の売上を登録する。 処理内容 ・テーブル2つを読み込む ・データを追加する ・更新する その他 ・「商品マスタ」はあらかじめデータが入っており、それの追加は行わない。 ・「売上」のテーブルにデータを追加する。 ・合計値はプログラミングで計算する。
<参考> かなり大雑把だけれど、単一テーブルの場合は、以下のような流れになると思う。 ・cn、da、dsを宣言 ・読込みSQL:SELECT *** FROM +++ WHERE @@@ ・dsにテーブルを取り込む ・ds.tables・・・でデータ追加、変更 ・コマンドビルダでupdateコマンドを生成 ・da.update
520 :
NAME IS NULL :2007/03/04(日) 10:02:17 ID:Pctohaw8
合計はデータセット自身の機能に存在する。 でもって、何をしたいのか、全く伝わってこない。 何を悩んでるのかとか。
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文をどう書けばよいのかが分からない ・後で更新ボタンを押したほうが常に上書きとなる形 ・先にデータを表示した方のみが更新を出来る形
>>520 定番となる読み込みから更新までの処理の流れを知りたいのです。
書籍には部分的には詳しく書かれているけれど、それを組み合わせた
使い方のイメージがいまいちつかめないのです。
ま、ADO.NETそのものが自由度を高くしていて、どんな組み方でもOKですよ。
ということなんでしょうけど、システムを組む上で共通することが多い事項
を盛り込んだ処理の流れのサンプルがほしいのです。
とにかく軽くすることにこだわったとか、インターフェースを特殊なものに対応
させるために、テーブルの読み方を変えたとか、そういう特殊なケースを別と
考えた場合です。
谷尻さんのVB2005の書籍のp126のコードを、複数テーブルを読み込んだ
場合に拡張したサンプルがほしいのです。
523 :
NAME IS NULL :2007/03/04(日) 11:22:35 ID:Pctohaw8
何でも前例主義は良くない、少しは自分で考えろ。 DataTable間のリレーションは制約設定を作れば、外部参照整合にもなるし、単なるオブジェクトの連携にもなる。 合計は取れる。 親Rowから子Rowは取れる。 DataAdapterとDataTableの関係を1;1に考えれば、更新にAdapterを使えなくも無い。 ただ、このスレで散々書かれているが、Adapterの更新はおまけ程度で実務じゃ使えないってのが大勢。
>>523 > DataAdapterとDataTableの関係を1;1に考えれば、更新にAdapterを使えなくも無い。
> ただ、このスレで散々書かれているが、Adapterの更新はおまけ程度で実務じゃ使えないってのが大勢。
ここでいうAdapterは、「コマンドビルダーにて自動生成されたupdateコマンド」の事なのでしょうか。
それとも、本当に(読取り時以外)更新時にはDataAdapterを一切使用せず、ExcuteNonQueryのみでやるという意味なのでしょうか。?
そのドキュメントが見つからないわけではないが、トランザクションについての
解説は少ないね。
>>2 で紹介されているところにも書いていないし、
>>456 で紹介されている
書籍にも書かれていない。
トランザクション指定なしにda.updateするのもある程度は大丈夫だろうが、
DBをやる上で必須だと思うのだが。
526 :
NAME IS NULL :2007/03/04(日) 14:49:06 ID:Pctohaw8
>>524 その通り。勝手に作られるSQLで更新する気にならない。
つうか、勝手に作るSQLは楽観的ロックの処理部分で非常に無駄というか複雑なことになってる。
>>525 全く言ってる意味がわからない。
トランザクション指定の有無なんて、ADOが出来るとか以前に仕様で決まってることだろ?
ある程度大丈夫って何?そんないい加減なトランザクション処理の仕様って存在するの?
コマンドビルダーって、パフォーマンスが悪いって書いてあるね。 一度仮環境で実行して、その文字列を取得し、それを参考に手で書き換えて、 DataAdapter.UpdateCommandとかに指定するのがいいのかな。
そんなのするぐらいなら、普通にSQL文をExecuteNonQueryでやりゃーいいじゃん。w なぜAdapterにそこまで固執する? それを参考に手で書き換えてる手間と、SQL文を作成する部分を書く手間、変わらないだろ?
須藤くん、乙
>>530 あー…実名消し忘れw
知り合いがここ見てることは無いと思うけどさ。
質問です。 データグリッドの各セルにクリックをするだけで、データの入力が出来る 仕様にしたいと思っています。入力するデータは、トグルボタンなどで 指定した記号ですが、データベース上では、その記号は正規化されています。 テーブルは以下のような構成です。 文字列テーブル: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が連結されている。 各セルをクリックした際、そのセルに今の状態の文字列が入力される。
C#のサンプルかぁ。状況的にで開けないわけではないけれど、VBしかない環境だから、 一旦ExpressのでかいファイルをDLする必要があるな。。。こういう時、不便だよね。 VBとC#はコードとかほとんど同じであるにも拘らず、開けないとかは。。。
>>532 コンボボックスの使用は諦めたけど、
コンボボックスの表示項目にするつもりだったフィールドを
直接入力するという認識でOK?
2.0のDataGridViewなら、CellParsingとCellFormattingが使える。
1.1のDataGridだと…適当な方法が思いつかない。
バインドするDataTableに表示する文字列(これをDataGridにバインド)と
ID(非バインド)を両方持っておき、DataTableのColumnChangedイベントの中で
変更対象列が表示名の列だったときにIDを自動設定するぐらいか。
(文章わかりにくくてスマソ)
>>533 VBの方が良いなら、次からそうするわ。
>>534 > コンボボックスの表示項目にするつもりだったフィールドを
> 直接入力するという認識でOK?
そういう認識でOKです。
DataGridViewを使用しての実現でも結構です。
早速、アドバイスされていた内容でうまく実現できるかを
確認してみます。ありがとうございます。
データグリッドに、表記データと、実データを別々にする機能はないので、 それを実現するには、各種イベントを使ってコーディングするしかない ってことなんだね。 うまく目的の機能になるようにコーディングをしたりするのは、時間が かかるのと、バグを生みやすい構造になるわけか。 なので、以下の二択ってことになるのかな。 ・データ入力時のコーディングのシンプルさを持たせる代わりに、 二つのテーブルのデータのやり取りの部分のコーディングを行い、 さらに、余分にテーブルひとつ分のリソースを消費する。 ・テーブルひとつ分のリソースをケチる代わりに、 DataGridViewのコーディングが複雑になる。この場合、効率性も 考えなければ、データ入力時の処理が重くなる可能性もある。 一度組んでそれで終わりならばそれで良いが、拡張させるとなると 概要把握などに時間がかかり、バグを生む可能性もある。 だいぶ整理がついてきました。ありがとうございます。
DataAdapter によるデータ ソースの更新
http://msdn2.microsoft.com/ja-jp/library/33y2221y (VS.80).aspx
一番下のところ「挿入、更新、削除の順序」の解説文章って、
自分が思うように自由に制御できることをアピールしているって
ことなのかな。それとも、updateした時は、内部的にどんな風に
動いているかわからないから、内容は保障しません。
なので、このようにコーディングしてくださいっていいたいのかな。
本気で分からない。
そんなグレーなものを使わずに、自分で更新しなさいってこと。
>>537 考え方を変えると、それほど複雑ではないかも。
例えば、ボタン押下時に内容をDataTableに反映させるとして
Clickイベント内でエラーチェックをするか、
それとも、エラーチェックはValidationイベントでやるのかといった感じかな。
このイベントだからこの処理をする・・・と線引きするとわかりやすいかもしれないです。
>>538 DataRowの状態(Added, Deleted, Modified, UnChanged)によって
それぞれの行データを利用した(INSERT, DELETE, UPDATE, 何もしない)コマンドが実行されますよと。
DataTableをUpdateメソッドに渡すと、全行に対して行状態チェック->コマンド実行
DataRow()をUpdateメソッドに渡すと、その行に対して行状態チェック->コマンド実行
-> Select文で行状態を絞ってUpdateに渡せば、挿入のみ、更新のみ、削除のみといった実行も出来ると。
>>536 (゚Д゚)ノアイ
帰宅したら書き直しますね。
>>540 > このイベントだからこの処理をする・・・と線引きするとわかりやすいかもしれないです
イベントごとに処理内容を分けていくわけですか。
それだと整理されてて、何か不具合が起きたときなどの対処が
やりやすくなりそうですね。
アドバイスありがとうございます。
>>540 > DataTableをUpdateメソッドに渡すと、全行に対して行状態チェック->コマンド実行
> DataRow()をUpdateメソッドに渡すと、その行に対して行状態チェック->コマンド実行
> -> Select文で行状態を絞ってUpdateに渡せば、挿入のみ、更新のみ、削除のみといった実行も出来ると。
この解説文章読んでみて、やっと意味が分かりました。
ありがとう。
MSDNって解説が簡易すぎたり、説明の言い回しが分かりにくく感じますよね。
>>540 > (゚Д゚)ノアイ
> 帰宅したら書き直しますね。
C#よりもVBの方が需要が高いと思うし、やっぱりサンプル配布
としては両方あったほうがいいと思います。
Tips系のサイトがそうなっているので。
時間がかかってもいいのでよろしくお願いいたします。
zipファイルに、readme.txtをつけて再配布OKの記述を入れておくと
多くの人に喜ばれるかもしれない。
サンプルプログラムは、今回のものとは別に、 もうひとつ更新を行うテーブルを準備して、 トランザクションの設定を行って更新をする過程とか あるといいかもしれないね。 (後でテーブル設計やデータの操作の構成を考えておきます) 他にどんなものがあると便利かな? たくさんのノウハウが詰め込まれた、大量のコードの サンプルもいいけれど、シンプルで目的別に作られている サンプルも、勉強する人にとっては非常に便利でありがたい と思います。 ま、確かに、何でも前例主義は良くないというのも分かるけれど、 仕事をしている人は、早く物を作れるようになる必要があるわけで、 最初は理論は別として作り方の一連の方法を体得した後、 OJT方式で深いところを学んでいく方法もありだと思う。
つうか、その程度のサンプル必要か?w @ITとか、MSのサイトとか、MSDNをきちんと見れば落ちてるし。
>>545 そう言ってしまうと身も蓋も無い罠。
スレタイの半分が無意味になってまうw
>>545 そういうところに落ちているサンプルって、デザイナやウィザードを
使ってはい終わりって感じのものだろ?
すべてコーディングで実現しているサンプルってないと思うが。
コーディングのサンプルは、かなり狭い範囲のものばかりだ。
応用を考えたサンプルは、デザイナやウィザードをつかわずに
コーディングで実現しているものじゃないかなぁ。
>>545 各種目的別にサンプルを作っていって、そのサンプルの
メリットとデメリットをまとめていくようなイメージなんだけどね。
DataAdapterにて単一テーブルを読み込む方式ならば、
リレーションをコーディングする必要があるが、
それを文章で一言で終わりにするんじゃなくて、
具体的なコードの確認が出来るようにする、みたいな。
>>549 サンプル乙。わざわざうpしてくれてありがとう。
デザイナ無しの方がというのは、私の個人的な意見でしかない。
必ずしもデザイナを使うのが良くないというわけでもないので、
メリットとデメリットを具体例をまじえて書いて行くと、
プログラマの参考資料として出来上がって行くんじゃないかなと思う。
自分が作ったものが、業務でコピペして使われるというのが嫌な気持ちも
分かるけれど、Tips系サイトみたいに、「VBで○○をやるには?」みたいに、
大量のサンプルをみんなで考えて出し合う流れが出来ればいいんだけどね、と思う。
VBやAccessのインターフェースに関するTipsは大量にあるけれど、
データベースのノウハウについてはTipsがあまりないので、
自分の設計に不安があることもしばしばだ。しかし、相談してみても、
それぞれっていわれてしまい、あまりしっくりこない。
そういうものを解決出来る流れがあればなと感じている。
>>550 あぁ、誤解させてごめん。
コピペされるのが嫌ってのは、新人なんかが動けば良いやって感じで
サンプルの内容を理解せずにコピペして使うってこと。
自分とこの新人がハマった例をネタとして投下。
Using trans As New TransactionScope
TableAdapter.Update(DataTable)
End Usint
※DataTableに2件以上のデータが入っているときエラー
これもMSDNが不親切な例だね。。。
@ITとかでは、質問をしたりするところがあるが、そういうところは いまいちノウハウが保存されて活かされてないようなところがある。 それをサンプルコードにして保存しておくと言う考え方。 最初は、サンプルを出すプログラマは、ROMが大量にいるため、 出し惜しみをすると思うが、みんなで意見をだしあう関係になれば、 サンプルを出すプログラマは、自分の設計で気付かなかったところを 添削してくれるというメリットを思い、出すようになると思う。 ま、いきなりこのような流れを作るのは難しいんだろうけれど。
ADO→ADO.NETの移項について私なりに感じた事をちょっと。 ADOであまり深い事を考えずにrecordsetにテーブルを読み込んで、テーブルの処理をして、 updateを実行するコードを書いていた人にとっては、ADO.NETのupdateは面倒に感じるし、 勉強するのに時間がかかるようだ。 一方で、以前からExecuteNonQueryを使ってこまかく同時アクセスの制御やトランザクションの 設定をするコーディングをしていた人にとっては、「DataAdapterなんて使えないから以前と同じ スタイルでするしかないな」と判断するので、ADO.NETでのコーディングへはスムーズに移項出来るようだ。
DataAdapterは、ディフォルトでトランザクションの設定をしていないので、 任意に各commandのトランザクションを設定するコードを書く必要があるというのは、 何か意図があってのことなのかなぁ。分からない。
>>554 .NET 2.0からはSystem.Transactionをつかえということのようだ。
これの問題は分散トランザクションへの昇格が簡単に置き過ぎる点。
>>554 分散システム、2フェーズコミット対応。
1.1から2.0への変更点のコラムとかきちんと読むと載ってるよ。
まあ、つかわないけど。
つうか、ADO.netをそのまま使うの?皆さんは?
普通、薄い自作クラスでラップして管理するもんじゃないの?
あと、サンプル云々も、そんなもの数パターンの定型があれば、あとは業務毎の細かい部分だから使えん。
自分で必要なものをクラス化して、スニペットにお約束を書けば、二度とそんなサンプルなんてみない。
トランザクションはあくまでCommandに設定するもの、 DataAdapteはCommandを自動で振り分けて実行するもの…って感じかな。 2.0だと、TransactionScopeがそのへん改善してくれてるね。
>>555 >>551 で書いたのが勝手に昇格起きてる例だね。
#2つ以上の接続を開くと、分散トランザクションに昇格する。
#Updateメソッドのリファレンスには書いてない(少なくとも日本語リファレンスには)けど、
#接続閉じた状態でUpdateを実行すると、Command実行の度にOpenとCloseを繰り返す罠。
で…手動で開いておくと、勝手に閉じないので昇格しない。
複数のAdapterを利用するときは、同じConnectionのインスタンスを参照するようにして同上。
開いた閉じたもプール設定によってはどうでも良いこと。 というか、.netになってからプール前提で処理機能単位でのOpen-Closeに変えた。 VB6のころのアプリ全体でグローバルでConnectionより、モジュールの独立性、再利用性が高まる。
>#2つ以上の接続を開くと、分散トランザクションに昇格する。 この部分の動きがすごく変で、TransactionScope内で open open close close と接続と閉じるがネストしたときだけでなくて、 open close open closeといったん閉じてまた開いた場合も昇格してしまう。
>>560 Transactionオブジェクトは接続をまたいで利用できるもの?
…と考えるとすっきりするかも。
open close open closeで昇格させないとすると、
↓のような動きになってしまうんじゃ?
connection.open
transaction = connection.BeginTransaction
command.ExecuteNonQuery
connection.close
・・・
connection.open
command.ExecuteNonQuery
transaction.commit
connection.close
基本的な質問で申し訳ないが、分散トランザクションへの昇格が おきてしまったらどんなことが問題なの?
更新を行う方法サンプル(案) ・スタンドアロンの場合 ・同時アクセスが比較的少ない場合(常に上書き) ・同時アクセスが非常に多い場合(先に更新したほうが優先) <内容> 基本情報、取得資格、性別マスタ、資格マスタの4テーブルがあり、 基本情報と、取得資格テーブルを更新する。 (詳細は後日書きます。) 書籍は、更新の方法は載せていても、目的別には載せていないので、 このようなまとめ方は意味があると思う。 内部を理解していなくても、とりあえず組む必要がある場合や、 これから勉強する人がとりあえず動くプログラムを見たい場合に使えると思う。
>>564 トランザクション処理が重くなる。
上の例のUpdateメソッドで分散に昇格した日には、かなりコワいことになる。
更新レコード数にもよるけど。
分散トランザクション使うためには、
後ろで必要なサービスが起動してなきゃならないってのもある。
スタンドアロンの場合 ・デザイナを使って構築して、updateする。 同時アクセスが比較的少ない場合(常に上書き) ・デザイナを使わずにコードで主キーを基準にupdateする。 トランザクションは用いない。DataAdapterを用いる。 ・シンプルさを持たせるために、DataAdapterはひとつのテーブルを 読み取り、更新を行う。リレーションはコードで実現 同時アクセスが非常に多い場合(先に更新したほうが優先) ・コードで、主キーとタイムスタンプを基準にupdateする。 トランザクションを設定する。ExecuteNonQueryを用いる。 ※基本的にコマンドビルダは使わない。 細かいケースを考えていくときりがないけれど、そういったものは、 無視で、王道となるサンプルを作っておき、あとは解説文章を つけるという感じでどうかな。
データを取得し、フォーム上に表示する(案) ・DataReaderで取得する ・各テーブルを単一で読み込んで表示する。 (DataAdapterは、テーブルの数だけ宣言する) リレーションはコードで実現したり、 リレーションオブジェクトを宣言して設定する。 ・リレーションを組んだSQL文で読取り、表示する。
サンプルを作る事に批判的な意見もあったけれど、 こういう項目別にサンプルを作るのって意味がないのかなぁ?
System.Transactionがすぐに昇格して使えないと言う事であれば、 やはり、自分で更新用のSQL文を書くしかないって事なのかな。 その場合、汎用性のある書き方はどうなるんだろうか。 スキーマを読み込んでテーブル名、フィールド名、主キーを取得し、 自動で更新用コードを生成するクラスを定義したとしても、処理が重くなりますよね。
サンプル用テーブル構成 基本情報 ・KihonID(主キー、数値) ・氏名(文字列) ・性別(数値) 取得資格 ・ShikakuID(主キー、数値) ・KihonID(数値) ・取得日付(日付) ・取得資格(数値) 性別マスタ ・SeibetsuID(主キー、数値) ・性別(文字列) 資格マスタ ・ShikakuID(主キー、数値) ・資格(文字列)
サンプル用フォーム構成 ID(TextBox、変更不可) 氏名(TextBox、変更可能) 性別(ComboBox、変更可能) 取得資格一覧(DataGridView、IDは非表示、取得日付はダイレクトに変更可能、 取得資格はコンボボックス) [読取り]ボタン:データベースからデータを読み取る。 [更 新]ボタン:変更内容をデータベースへ反映する。 [次 に]ボタン:基本情報のIDで次の人を表示する。 [前 に]ボタン:基本情報のIDで前の人を表示する。
再利用性の高い更新を行うためのクラス設計を考えてみた。 この3つがあれば、大抵の事は事足りそうな気がするけれど、どうかな。 ・DataRowを1つ受け取り、updateを行う。 ・DataRowを1つ受け取り、insertを行う。 ・DataRowを1つ受け取り、deleteを行う。 ・DataTableを1つ受け取り、updateのみを行う。 ・DataTableを複数受け取り、update, insert, delete を行う。 マスタの操作は、上の3つを使用する。 マスタ以外のものは、下の2つを使用する。
なんか間違えてるな。正しくは、 マスタの操作は、1、2を使用する。 それ以外の操作は、2、3、4、5を使用する。
>>576 Connection.BeginTransactionと比較するなら処理速度は変わらない。
>>577 ありがとうございます。
ならば、ADO.NETでプログラムする場合は、Transacto-SQLで
トランザクションのコードを書く必要性は無いと考えてよさそうですね。
文献やこのスレの過去ログを読んでみての確認なのですが、 分散トランザクションをするという場合は、EnlistDistributedTransactionを使う方が、 System.Transactionよりも軽く、意図しない昇格がおきることことも無いので 便利だということですよね?基本的なことばかりですみません。
>>579 それは分散トランザクションを使わないなら全く必要ないもの。
分散トランザクションを使う前提なら暗黙で参加させるべきで、
手動でどうしても参加させざる得ない場合を除いて使うべきではない。
どこの資料を見てそう思ったのか知りたい。
>>580 >>554 以降と、MSDNを読んで思いました。
ちょっと整理しますと、以下のようになると思います。
・一つのデータベースの一つのテーブルを更新する場合
→トランザクション設定は必要ない。
・一つのデータベースの複数のテーブルを更新する場合
→Connection.BeginTransactionを用いてトランザクションを設定する。
System.Transactionは、分散トランザクションに昇格するので使うのはあまり良くない。
・複数のデータベースへアクセスし、それぞれを更新する場合
→分散トランザクションを設定する。(ここのやり方がよく分かりません。)
ひょっとして、複数データベースへの更新の場合は、多少処理が重くなったり、 使いにくいと感じる部分を我慢してでもSystem.Transactionを使うしか他に方法が無いということかな。。。
>>582 分散トランザクションを使用する場合には必要なコストでそれについては問題はなくて、
分散トランザクションが不要なケースでも意図せず分散トランザクションが
使われてしまうことが問題という話だよ。
>>583 わからんちんへの説明をありがとうございました。
このスレを読んでいると、みんな「DataAdapterのupdateは使えない。 Commandでやらないと処理内容が見えないで気持ち悪い」という 意見が大多数だけど、ADOの時からそういうスタイルだったのですか? (recordset.updateは使わないというスタイル) 私はまだこの世界に入って間もなくて、ADOはちょっとかじっただけで、 ADO.NETから本格的にやっていこう、という物なので、ちょっと 気になって聞いてみたくなりました。
>>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ヒントを与えてやっても良い。
ただし、そこまでやるなら、自分で明示的にコマンドを組み立てるのと、
労力は変わらないだろうが……
ま「分かってやっているなら」何も問題はないと思うよ。
>>586 なるほど。内部の動きや理論をしっかりと理解出来ているのが大事なんですね。
「正しい使い方を行っている」よりも、「内部をしっかりと理解している」という感じでしょうか。
ありがとうございます。勉強になりました。
CommandがSQLの結果をDataTableに格納する機能を持っていたら、ADO.NET開発の意図に反して、 DataAdapterを使う人が極端に少なくなるのかなw
>>588 というか、DataTableやDataViewでなくとも〜DataReaderを
データソースとして扱えるので、本当にDataTableが必要なケースというのは
実は結構少ないのではないかと思える。
自分でCommand組み立てる式の人は、DataTabe要らないんじゃないの。
ちょっと質問よろしいでしょうか
みなさんは、同時実行制御において、更新時に「他ユーザによるデータの変更」を
確認する場合はどのようにしているのでしょうか。
(「ネットワークなどハード的な障害」との区別をつける必要があると思います。)
私なりに調べてみたものを書いておきます。
●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が
出るのみなので、他ユーザによる変更を調べるには何か工夫が必要だと思います。
お願いします。
>>589 となると、DataSetとDataAdapterの使用は、ほとんど無いとw
DataSetを使うのは、テーブルを複数読み込ませて、それらをリレーションオブジェクトで
つないで、親子でデータを取りながら、その一覧を出す必要がある場合など、
限られたケースしか思い浮かばない。
会社の各部署の社員一覧(兼務を含む)
事務部
・Aさん
・Bさん
総務部
・Bさん
・Cさん
>>486 亀レスだけど。
> 早ければ C# 3.0 の時代から。「使えなくなる」わけじゃなくて、「使う意味がなくなる」
> ってことだけど。
それはLINQのことですか?
これはローカルに取り込んだデータの抽出方法のコードの書き方が
2次元配列であろうとDataTableであろうと同じものになる、
ということであって、データベースサーバからデータの取り込みの
手順に関するものではないので、DataAdapterやDataSetを使うかどうかには
影響しないと思うのですが。。。
>>593 サンクス。調べてみます。
「ADO.NETは使えるて、LINQは重いからCommandオブジェクト使うスタイルでやるぜ」みたいな
人も結構出てきそうな気もする。。
LINQって、C言語(構造化プログラミング)に対する、C++(オブジェクト指向プログラミング) みたいな存在なわけでしょ。高速化をするのであれば、Cを使った方がということになるが、 そんなに速度を気にしないのであれば、C++を組む方が将来のメンテナンスや、分業して システムを組む場合に効率が良いという話だと思う。
>>589 > というか、DataTableやDataViewでなくとも〜DataReaderを
> データソースとして扱えるので、本当にDataTableが必要なケースというのは
> 実は結構少ないのではないかと思える。
コンボボックスなどにはデータソースとして指定できませんよね?
DataReaderで取得したデータをコンボボックスやリストボックスに表示する際は、
ArrayListを宣言して、値を代入して、ValueMember や DisplayMember に代入する
過程が必要になるので、DataTableにデータを取り込んだ方がコードが少なくて
楽になると思う。(処理速度やメモリの量もさほど変わらないと思う。)
> 自分でCommand組み立てる式の人は、DataTabe要らないんじゃないの。
DataGridViewなんかをフォームに貼り付ける機会はあまりないけれど、
リストボックスやコンボボックスは必ずあるので、DataTableを使う機会は
あると思うけどなぁ。
VB.NETでプログラムするとき、 SqlCommandのパラメータとして意図的にNULLを設定したいときは どのように記述すればいいのでしょうか? SqlCommand.Parameters("@hoge").Value=Nothing だとおこられます。
コンボに値を入れるためにはDataSetは仕掛けが大きすぎるだろ? それこそArrayListとかの普通の集合で済むならそれでよい。
>>597 System.DBNull.Valueは?(ValueじゃなくてNULLValueか何か、DBNullの値っていうやつがいるはず)
600 :
597 :2007/03/13(火) 14:38:31 ID:???
>>599 System.DBNull.Value でいけました。
ありがとうございました。
>>589 > DataTableやDataViewでなくとも〜DataReaderを
> データソースとして扱える
これ、知らないので教えてほしいのですが、
Dim dr as DataReader = cmd.ExecuteReader()
DataGridView1.DataSource=dr
とかできるってことでしょうか?自分でやってみたのですが、何も表示されませんでした。
cmdにセットしているSQL文がレコードを出力することは確認しています。
「トランザクションは既に開始してます」とのエラーで落ちてしまいます。 コネクト begin Update Commit begin Insert Commit クローズ って流れの場合、まずいのでしょうか?
>>601 俺は589ではないが、DataGridViewを貼り付けてそれにデータソースを指定する機会が
少ないから、それは対象外としているという意味だと思う。
DataGridViewのDataSourceは、DataTableを指定しないとエラーが出る。
そもそもDataReaderは読取り&一方通行のオブジェクトなので、
ユーザが全体データを確認したり、変更したりするものとして使うようにするには、
それなりにデータを加工するコードを書く必要がある。
604 :
589 :2007/03/14(水) 00:52:42 ID:???
あー下手なこと書いて混乱させちまったかな。ごめん。 ASP.NETのWebControlの場合は、SqlDataReaderなりをDataSourceと 扱えるのよ。それを念頭に置いていた。 リッチクライアントと違って、データソースとコントロールとユーザアクション がASP.NETでは疎結合だからそうできるんだろうけど。 確かにリッチクライアントの場合はバックグラウンドのメモリイメージとして DataTableやDataViewを使うことになるだろうね。
605 :
601 :2007/03/14(水) 08:36:18 ID:???
ASP.NETのGridViewで GridView1.DataSource=cmd.ExecuteReader() として動作することを確認しました。これはこれで、 閲覧用途限定だけど使えるやりかただと思う。 こちらとしては混乱させられたというよりも、 近くに聞ける人がまったくいないので、こういう情報は正直かなりありがたいです。
同意。
607 :
589 :2007/03/14(水) 09:31:17 ID:???
>>605 というか、ASP.NETの場合はPostBackされたときは元のオブジェクトは
残ってないわけだから、単に「描画」ができれば十分なわけさ。
だから、性能的には、単純にシークエンシャルな読み取り専用の
DataReaderを使うのが最適のはず。
やりたければセッションにDataTable保持するっつー手もあるのだが、
いずれにせよリッチクライアントのように、ユーザの編集行為の結果が
自動的にDataTableの中身に反映され更新されるってことは無いし、
それは不可能なわけ。
もし、バックグラウンドにDataTableを持つとしても、DataGrid等に対する
編集結果は、PostBackされたときに、手動で反映してやらなければならない。
この辺、リッチクライアントの世界とWebでは随分違う。どっちを念頭に
置いているかで、話が噛み合わなくなるのもある意味当然かもね。
同じADO.NETに関する話題でも、構築する環境や、実現する言語が違うという話を聞いてみて ちょっと気になったのだが、みんなはどんな感じでやっているの? ちなみに俺は、VB2005でWinアプリを作ってる。データベースエンジンはmdbかSQLExpress 大きなプロジェクトの一員とかじゃなくて、小規模なものを作ることが多いから。 言語はC#を使うことも出来はするけれど、AccessやExcelVBAを書くこともあるのでVBでやってます。
全く何をいいたいのか、何を議論したいのかが絞れてないし、そもそも話題を混同してるようだが。
過去ログ読んでいたんだけどjavaでデータベース接続する場合と 比べてどうだみたいな、他との比較的な意見はありませんよね。 こっちが早いとか、開発効率がいいとか、動作が安定しているとか。 データベース接続関係の技術ではなく、VBのフォームにオブジェクトを 貼り付けたりする開発の使い心地などの理由からADO.NETを 選ぶしかない状況だからかな?w
>>611 そら単に「ADO.NETの質問・雑談スレ」だからだろ。どっから「Java」が
出てくるんだ。
> データベース接続関係の技術ではなく
単なる煽り厨房ではなく、真面目にそういう話がしたいのなら、
そういうスレを立てれ。自分で。
普通に使うのであれば、実データが格納されるのは、DataTableのDataRowと いうところである。という程度の理解でいいけれども、 それがどのような処理で保存されているのかがすごく気になる。 数値型や文字列型などに柔軟に対応しながらメモリは効率よく格納するのは どういうノウハウをつかっているのだろうか。 ま、それらが分かれば、配列の方が処理が軽いかなどの動作テストを しなくても済むようになると思うけれど、調べる事は出来ないんだろうね。
>>613 普通に逆コンパイラでSystem.Dataの中のソース見れるだろ。
>>614 みても、クラスの継承などが連鎖していて、良く分からないと思う。
何か、解説みたいな記述がないとすべての読解は難しいんじゃないかな。
ヒントとして、このクラスを読めとか。
ちょっと話はずれるけど、逆コンパイルしたり、その中の情報を書いたりするのは、 いかなる目的であっても違法行為にあたるんじゃないかな。 ま、System.Dataの中のソースについて語り合うスレなどがあれば、 多くの開発者がそれを見るようになり、より多くの開発者がMSの製品を 採用するようになると思うけれど。
えーと、そんなの気にするなら出来合いのDataSetなんて使うなよ。w 配列のほうが軽いに決まってるじゃん。DataSetは余計なものたんまりつんでるんだから。 とりあえずDataSet = XMLベースの簡易DBと思えばいいだけ。
マイクロソフトが提供している、オプティミスティック同時実行制御は、タイムスタンプではなく、 取得したデータが全件一致しているかを確認する仕様になっているけれど、これはどうしてなんだろう。 タイムスタンプの比較のほうが、1項目のみで良く、処理効率も良いと思うのだが。 深く考えるところでもないのかな。
>>620 .NET 2.0のSqlClientはテーブルにtimestamp(rowversion)があれば使うようになった。
>>620 DBMSによって違うでしょ?
>>621 のいうように、SQL鯖だったらそういうものあるけど、一般的大多数であるオラにはないんだから。
汎用性ってのはそういうもの。
DataRow newRow = table.NewRow()した後に値を格納して新規レコードとしてDataTableに 格納する場合、table.ImportRow(newRow)とtable.Rows.Add(newRow)どっちがよく使われるんだろう? 処理時間計ってみたらImportRowの方が二倍くらい早かったんだけど、この二つって内部処理に 何か違いがあるんだろうか?
ああ、スマン。Importの方はデータをコピーするってのは分かるんだが、 何でコピーする方が早いんだろうと疑問だったんだ。
627 :
624 :2007/03/24(土) 19:48:37 ID:???
あああ、スマン。今試してみたらImportRowじゃNewRowでスキーマ取得したDataRowは 追加できなかった。DataRowStateがDetachedだし。 俺は変な夢を見ていたようだ。
マクロソフト コンサルティングサービス テクニカルリファレンスシリーズ の書籍には、 非接続型の更新は小規模システムでない限りは向かないとはっきり書いてある。 更新するならば、ExecuteNonQueryを使えと。 ADO.NETの入門用サンプルプログラムには、DataAdapterでupdateして、「ほら、便利でしょ」 みたいなものばかりなのに。 SQLServerの紹介サイトにて、別の自社製品のソフトを批判した書き方をしているのを思い出した
@ITの記事は、同時実行制御については書かれているが、トランザクションの 設定については書かれていなかった。 谷尻さんの2005の書籍は、同時実行制御もトランザクションについても省略されていた。 ADO.NET の公式解説書には両方の解説が載っていた。 ひとつの記事にすべてを盛り込むことは不可能ではあるけれど、 同時実行制御もトランザクションも入門レベルで抑えておくべき事項だと思うんだけどな。 それとも、ADO.NETそのものが、そういうことを想定しないレベルでしか 使われないということなのかな。
ここまでシェアを握っていて、新しい言語の提案が出来るくらいの規模の会社ならば、 新しく提案する技術のドキュメントは、良い面ばかりを書いて、悪いところを必死に隠そうと するのではなく、良いところと悪いところをあわせて紹介するべきだと思うけどね。 学生ならまだしも、プロジェクトで採用されるかどうかは、本質的なところを見られるわけだし。 MSDNや公式解説書の「コマンドビルダは少ないコードですむが、遅いので使えない」みたいな 感じに、データアダプタのupdateについても書いて欲しかった。 トランザクションは自動設定ではないし、実質Commandに丸投げの処理でしかありません。 ExecuteNonQuery使うのがお勧めです。みたいな。
変更のタイムスタンプで同時実行の排他制御してるんだけど Fillして Updateして 再度Fillして タイムスタンプは前のままなんだけど、これってどういう事? 外部からDBにつなぐとちゃんと更新されているし。 再度Fillする前にDataSetをnewするとちゃんと取れる。 前にDataSetを持ったまま、別のDataSetにFillしても、やはり前のTimestamp。 どこかにキャッシュしてるんだろうか?
よくわかんないけど、明示的にCommitさせてみたらどうだろう?
>>633 ダメですね。Commitしてみたけど一緒。
それに外から確認してみるとちゃんと変わってるし。
現象から見ると、UpdateしたDataSetが有ると同じSQLでデータを取ろうとすると
前のDataSetからデータが取れるようなキャッシュのような動き。
Fillする前にCleanしてみたけど、そうすると正しくFillできなくなる。
何かDataSetを初期化?更新状態を初期状態するメソッドでもあるのかな?
プロジェクトをうpるか、具体的なコードを書いてみたらどうかな。
DataSet.AcceptChangesとかって話じゃないよね
っぽいね。 質問者がきちんとFillメソッドのMSDNを見ていないか理解できてない。 Fillは検索結果をDataSetに入れるじゃなく、マージするだからね。 更新後に再検索した場合、前のデータとのマージだからAcceptChangeでRowStatusを初期化しないと。
私もそういうのをうすうす感じていた。 まずは、AccespChangesメソッドを任意で呼び出さないといけないケースで あるかの確認をしなければならないので、質問者は情報を小出しにせずに、 ソースコードを出すべきだと思う。
639 :
佐藤藍子 :2007/04/10(火) 17:45:11 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.
642 :
637 :2007/04/10(火) 22:44:13 ID:???
それじゃ、ソース晒そうって箇所がばらけてるから、 サンプルを作ったらちゃんと動いた。 Fillした後にAcceptChangesは呼んでるんですがね〜。 サンプルと実ソース見比べてみます。お騒せしました。
643 :
637 :2007/04/10(火) 22:53:51 ID:???
複数のSQLをDataSetにFillして、this.ds.Tables[0].TableName = "dummy"; で強制的にテーブル名をつけて、 adapter.Update(ds,"dummy");で更新すると
644 :
637 :2007/04/10(火) 22:55:21 ID:???
発生するみたいです。 素直にDataSetを分けるか、インデックスでアクセスするかして見ます。
645 :
637 :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(); } }
646 :
637 :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(); } }
他人のソースなんぞどうでも良いが。 Updateの後にGetChangesしてその件数見てみるとか。 Fillの後も同じ。 それでそういう動きなら、それなりに対応すればいいんじゃないの? あと、Fillの前に別のDSなり前のDSを明示的に廃棄するなり。
これMySql.NETドライバのバグとかそういうことはないの?
649 :
637 :2007/04/12(木) 02:42:39 ID:???
>>648 そうですね。なんかMySql.NETのバグ臭いですね。
でも、一度読み込んだDataSetを廃棄しないで、別のDataSetをnewしてFillしても前のデータが読み込めるってのが、非常に奇妙で。
きっとこれってMySQL.NETのバグというより、ADO.NETの仕様に関係するようで。
一体どういう構造になっているのかと、思うわけで。
ユー、別のDBMSで試してから書き込みなYO!
>>647 だな
俺も Fill するまえに Clear してる
メモリのマッピングによっちゃそうなるんだろ
確保したらすべてのメモリ領域初期化してくれるわけでもなし
気持ち悪ぃんだったら Dispose して作りなおしたらよいかと
DataColumn.DataTypeをSqlDbTypeに変換するにはどうしたらいいんでしょうか?
>>652 やろうとしていることがいまいち見えないので詳しくお願いします。
そもそも、DataTable(DataColumn)はそういうデータベース固有の
形式にとらわれないもの。という設計なので、変換とかする必要がないはず。
654 :
652 :2007/04/16(月) 17:11:56 ID:???
別のDBMSからSqlServerにレコード丸々コピーするときのINSERT文でパラメータの設定時 にSqlDbTypeが必要だったんですがそれ以前の段階で色々おかしかったので忘れてください。 ごめんなさい。
655 :
NAME IS NULL :2007/04/22(日) 15:04:57 ID:m3klGbD1
Access のデータベースに新しいテーブルを追加したいときって、 どうすればいいん?
SQLでCREATE TABLEすればいいんでは?
657 :
NAME 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(); ↑のようなサンプルを見つけました。 どうもありがとうございました。
9条は改憲してはならない。日本の為にならない。 日本人ではない朝鮮総連や民団でさえ、日本を心配して改憲への反対運動を行ってくれている。 私は日本人だが、「改憲すべき」などという者は、日本人として彼らに恥ずかしいと思います。 Q.中国から身を守る為、戦争に対する抑止力が必要では? A.前提から間違っています。そもそも、中国は日本に派兵しようと思えばいつでもできました。 なぜなら、日本には9条があるため、空母や長距離ミサイル等「他国を攻撃する手段」がない。 つまり日本に戦争を仕掛けても、本国の、命令をだした幹部の命は絶対に安全なのです。 「安心して戦争を仕掛けられる国」を、中国は、今まで攻めずにいてくれたのです。 Q.それは日米安保によるものでは? そして、その日米安保も絶対ではないのでは? A.中国の良心を信じられないのはなぜですか? そして、日米安保は絶対です。 知り合いの韓国人の評論家も「絶対だ」と言っていますし、私も同じ考えです。 更に、9条が消えても米国の戦争に協力する義務は発生しませんが、米国が被害者の場合は別です。 米国は日本を守る為に戦っても、(9条があれば)日本は米国を守る為に戦う必要がないのです。 Q.9条が本当に「平和」憲法なら、世界中で(日本以外に)1国も持とうとしないのはなぜか? A.これは、日本以外のすべての国が誤っているとも言えます。 「敵国に攻撃が届く国は攻められづらい」というのは、誤った負の考え方です。 (もっとも韓国や中国の軍に関しては、日本の右傾化阻止の為でもあるので例外ですが) 更に日本の場合、隣国が韓国・中国・ロシアと、GDP上位の安定した信頼できる国ばかりです。 Q.「9条改憲派」は「戦争反対派」。侵略者に戦争を挑発する、戦争憲法(9条)を撤廃したいのです。 A.それは、貧しい考え方ではないでしょうか? 中国や北朝鮮を信じる「強さ」があれば、そんな考えにはならないはずです。 日本が信じれば、彼らも信じるでしょう。そして、真に美しい関係が始まるのです。
亀だけど。 DataAdapter.Update()にて、引数にGetChangesで取得した結果を指定した際、 AcceptChangesメソッドは呼び出されないので、手動で実行する必要がある。 この記述は、書籍「Visual Basic 2005 による 実践データベースプログラミング (谷尻かおり)」にはあったが、MSDNの記述は見つけることが出来なかった。 ADO.NETの公式解説書からも見つけきれなかった。 出来れば、見つけきれた方はソースお願いします。
保守
661 :
5 :2007/05/06(日) 17:53:45 ID:???
だよね
ちょっとずれる話だが、AccessだとADOのみしか使えないのを何とかして欲しい。 移植は無理なのかな。OfficeVBAが.NETFrameworkの上に乗っていないから。
ってことは、Office2007の次が移植されるってことかな?
何をどうするとそういう結論が??
>>666 すまん。664は、Vistaと打ち間違えたもんだと思っていて変なことを書いてしまってた。
VSTOっていうのがあるんだね。
また恥をかいてしまった。
ム板から誘導されました。 ADO.NETでJETのキャッシュの操作ってできませんか? ADOやDAOでは出来ていたと思うんですが…
669 :
NAME IS NULL :2007/05/24(木) 11:45:57 ID:G4tCoFZ8
ADO.NET(2.0ではない)で、4つのテーブルから複雑なSQLでデータを抽出して データセットに入れました。 そのクエリの中身が例えば、商品ID、顧客ID、発送年月日だとします。 条件によって、ソートする列を変えたいのですが、データセット内のソートは できるのでしょうか?
DataView使えばおk
>>668 キャッシュの操作って具体的にどんなことですか?
>>664 VSTOってoffice2003からなんだね・・・
うちは未だに2000使っているからむりぽなわけですよ・・・
>>672 Interop しかないな。自分で ADO.NET の COM ラッパーを作る。
C++、ADOでmdbにアクセスするアプリをc#に移植中なんですが、 c#で OleDbCommand.ExecuteReader でアクセスすると、mdbとsql文は同じなのにパフォーマンスが劇的に遅くなまりした。1秒→7秒 どうもインデックスを使ってくれてない感じです。 解決方法ってありますか。それとも何か間違いを犯してるんでしょうか。
>>674 そんな質問で答えられる人はいないと思われる
使っている関数に問題あるとか
まずは、selectなど簡単なsql文ではどうなのかという話からじゃないかな。
ただ「動きません」と報告してきた後輩に、最初から流れを説明させて たら急に黙り込んで「すいません、わかりました」と仕事に戻ることが ままあるもんだ。 ひどいのになると自分で書いたコードすら読めないやつもいるけどさ。
SQL2005 ADO.NET2.0って MARSとかスナップショットなんとか使えて便利そうだけど バージョンストアでパフォーマンス削がれるんだよなぁ 微妙
PostgreSQL から ODBC 接続して素で Boolean 型を渡すと .NET 側では Boolean 型と認識してくれないね あと CurrencyManager に Boolean 型バインドして AddNew すると Position プロパティに値が反映しないし、更新がおかしくなる (これは MS からバグ報告としてあったねぇ) どっちも回避できるからいいけど、.NET で Boolean 使うときは めんどくせーなーと思った今日一日ですた
ポスグレのODBCドライバが糞ってだけの話だな・・・
Npgsqlはどうよ?
683 :
NAME IS NULL :2007/06/14(木) 01:20:22 ID:3zn18ozx
SQLSERVER2000からDB2に移行したいんですけど ADO.NET1.1でSQLSERVERでは使えるけどDB2では 使えないor使い方が違うクラスとかってありますか?
>>683 Connection や Adapter など
だよね
初心者です。質問があります。 DataSetに取得したデータをGridに表示したいと思っています。 ある列において、0なら「なし」、1なら「あり」と日本語で表示したいです。 Grid.DataSource = DataTable とし、 DataAdapter.Fill するだけでは、0は「0」、1は「1」と表示されるだけです。 どんな風にプログラムすればよいのでしょうか? よろしくお願いします。
>>686 別テーブル作って繋げ。参照整合性制約付けるとデータのチェックにもなるし。
>>687 , 688
レスありがとうございます。
いろいろな方法があるんですね。
DataGridとDataTableの間のデータ授受をプログラムで横取りし、
そのプログラムの関数内で変換処理することができると
いいと思っています。そんな方法はないのでしょうか?
0->なし、1->あり くらいならExpressionでもSQL Case文でも
できそうですが、もっと複雑な変換処理をする場合もあると
思うので。
知っている方いましたら、教えてください。
2.0以降ならDataGridViewでいろいろいじれる。
>>689 DataGridのDataSourceにDataTableを指定した場合、
DataGridの表示とDataTableの実データを異なった状態にするみたいな
概念はないので、やはり、データベースサーバからデータを取ってくる段階で
プログラムで処理を行い(例えば、数値から文字列への変換)、
さらに更新時にプログラムで処理を行う(例えば、文字列から数値への変換)、
という考え方になると思う。
複雑な処理になるなら、DataGrid用のDataTableと、データ取得用のDataTableを
別々に宣言するというぐらいしかないんじゃない?
こんな感じの構成 データベースサーバ ↑| |↓ データ取得用DataTable ↑↓ ユーザによるデータ編集用DataTable = DataGrid
DataGrid と DataTable がどのタイミングでイベント発行してくれるか 調べればよろしいいかと 作成時にイベントハンドラ定義できないなら プログラム内で AddHandler もしくはクラス作成時に WithEvents
695 :
689 :2007/07/04(水) 06:10:40 ID:???
>>690 ,691,692,693
レスありがとうございます。
>DataGrid と DataTable がどのタイミングでイベント発行
>してくれるか調べればよろしい
ヘルプでイベントを見てみましたが、みつかりませんでした。
686のような使い方は、誰でも頻繁に必要になると思うのですが、
常套手段といえる方法はないのでしょうか?
それとも、ExecuteReaderで1行づつ取ってきてGridに格納
するのが常套手段なのでしょうか?
(でもこれだと、DataSetを介さないので、レコード追加、更新、削除
なども多くのコーディングが必要になりますよね?)
普通はDataGridView使いますから
DataSetは閲覧用、更新にはSQL直打ちで対処する派です。 Updateメソッドなんて使い物にならないっしょ?
過去ログに、DataAdapter.Update()は使い物にならないのでExecuteを
使ったほうがいいという話が結構出てるよ。(
>>629 など)
あと、トランザクションは自動で設定じゃないから、付け加える必要がある。
(
>>136 >>555 )
で、コードが長くなったり勝手に昇格して重くなったりするので、Executeを
使うのと労力が変わらないという結論となる。(
>>586 )
699 :
NAME IS NULL :2007/07/04(水) 17:28:46 ID:fg5TH2Y3
ということは、テーブルのRowStateによって、INSERT,UPDATE,DELETEを直打ち するってこと?確かにUpdateはパラメータの指定とか面倒だし。 あと、コマンドビルダーも役に立たないって聞いたことある。
更新用のコードを自動生成するツールを自作して対処してる
>>699 コマンドビルダーは処理が重いからあまり使わない方が良いと、公式な文章に書かれている。
自動でやるから変なSQL文を生成して、それによってエラーを出す場合もあるしね。
>>700 それって、スキーマを読み込んだりしてフィールド名などを自動的に取る方法ですか?
他人がやっている方法が気になったもので。。。
参照はデータセット 更新は自分でSQL書いてexecutenonqueryでやってます 楽観的ロックもtimestamp型使えばいいし
春はあけぼの
やうやう白くなりゆく山ぎは
705 :
NAME IS NULL :2007/07/06(金) 16:48:44 ID:gQTP0i/B
皆さんは「厳密に型指定されたDataSet」はどのような時に使っておられますか? 必ず使っておられますか?
>>705 使ったことないな
.Tostringでやっとります
>>705 使ったことはない。
書籍を読んだが、具体的にどんな場面であるのかもいまいちつかめなった。
いくつか具体例を出して解説があれば分かるんだろうけどね。
フィールド名・テーブル名のtypoが怖いからって理由だけで使い始めたんだが、それなりに便利だよ typo回避策は他に色々あるけどデザイナで自動生成簡単修正できるし、詳細表示フォーム用 のコントロール作成するときも勝手にやってくれるので便利 扱うテーブル数が少ないなら使う価値はあるんじゃないかと思う
気分的な理由であまりウィザードやデザイナは使いたくないので、 型指定されたDataSetは使わないかな。 VB.NETやVB2002の時期は、OSや.NETFramework、VBのバージョンは 同じなのに、一方でだけエラーが出て、もう一方ではそれが 再現できないなんて事があったし、コードが動かないとかあった。 Access2000でプログラミングしてAccess2003で開いたら動かなかった という事もあったしね。そんなに特殊な処理をしているわけではないのに。 ここまで頻繁にバージョンアップや仕様変更がなければ使おうかという 気持ちになるんだろうけどね。
710 :
NAME IS NULL :2007/07/08(日) 20:24:07 ID:ehn/JfnG
sa
711 :
NAME IS NULL :2007/07/09(月) 14:53:38 ID:WLR34h5u
型指定されたDataSetを使いたいけど メソッド名とかが気に食わない また、それを修正してもちょっとデザイナでいじるとアウト もとにもどる おれはそれが使わない理由 自分で作れば? といわれれば、そういたいけれど作ってる時間がもったいない
どんなメソッド? partialクラスだからそっちで好きなようにいじれるけど
713 :
NAME IS NULL :2007/07/09(月) 15:19:50 ID:WLR34h5u
関数だけど [ColumnName]IsNULLとか おれはIsNull[ColumnName]とかの規則にしたいんだよ・・・・
ああ、それ分かるわw IntelliSense有効に使えなくもなるしな
715 :
NAME IS NULL :2007/07/09(月) 16:01:26 ID:WLR34h5u
いるのか 同士が!!!
>>714 ちょっと嬉しくなっちまったぜ
716 :
NAME IS NULL :2007/07/10(火) 17:00:19 ID:peEzUMaA
接続型と非接続型に関して質問があります。 フォームのコンボボックスやリストボックスなどに表示させるマスタ情報は、 非接続型で取得して、追加/更新/削除をするデータには接続型でするのが、 良い方法という事なのでしょうか?
717 :
NAME IS NULL :2007/07/10(火) 19:08:46 ID:yBXV226s
>>716 取りあえず楽観的更新と悲観的更新をググってみると傾向がよくわかると思う
>>702 >>参照はデータセット
>>更新は自分でSQL書いてexecutenonqueryでやってます
GridDataViewへの追加、更新、削除のイベントは、何を捕捉
すればよいのでしょうか?
参考になるURLなどあったらお教えください。
>>楽観的ロックもtimestamp型使えばいいし
この意味を詳しく教えていただけないでしょうか?
719 :
NAME 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%ありえないことが保証されてる てことじゃないかなぁ? わかってはいるつもりなんだがうまく書けなくてすまん いいわけすれば、実際同時実行制御をどこまでわかってるかも分からないから
720 :
NAME IS NULL :2007/07/10(火) 21:50:03 ID:HqGt7hop
721 :
NAME IS NULL :2007/07/10(火) 21:53:58 ID:HqGt7hop
722 :
718 :2007/07/11(水) 06:03:20 ID:???
>>719 ありがとう。
楽観的ロックのtimestampについては、よくわかりました。
ご返答の通り、SQLServer2005のヘルプによれば、timestamp は、その
データベースに対して一意になっているそうです。
GridDataViewについては、ヘルプ見てもわかりませんでした。
RowAdded, RowValidated, EditModeChange などのイベントハンドラを
調べて動作確認もしてみましたが、DataGridViewの行の追加・修正・削除
を検出するには適当ではなさそうです。
723 :
NAME IS NULL :2007/07/11(水) 12:07:20 ID:zeep73dE
該当のDataTableかDataRowのイベントあたりにステータス変更イベントなかったけ? それ使えばどうかな? 不確かな情報だけど
724 :
718 :2007/07/11(水) 19:46:15 ID:???
DataGridViewのDataSourceは、DataTableにバインドせず、 DataGridViewの各セルにプログラムで直接データを書き 込んでいます。 この場合、DataRowのイベントハンドラは使えません。 DataGridViewのイベントだけで、データの追加修正削除を 捕捉する方法はないでしょうか? それとも、DataGridViewはDataTableとバインドしなければ 使えない代物なのでしょうか?
バインドしない理由をまず書いてみて
726 :
NAME IS NULL :2007/07/12(木) 00:11:49 ID:gO43fZUT
>>724 別にしなくてもいいけど
速度とか段違いに違うだろうに
あとの登録しなおしの手間考えても
俺も理解しがたいんで
>>725 のいうように聞いてみたい
編集されたデータの型チェックも自分でやるつもりなのか
バインドしない理由は、表示とメモリ上の データを別々に管理し、DataSourceで繋ぐという 手法に違和感があるためです。 DataGridViewの各セルにテーブルのデータを直接 書き込み、DataGridViewのイベントを直接ハンドリングして SQLを発行したほうが、直感的でわかり易い。 理由はこれだけです。 DataGridViewはDataTableとバインドしなければ 使えない代物であるなら、それに合わせざるを得ま せんが・・・
自分だけが分かりやすいものを引き継がされる人間のことも考えてね
730 :
NAME IS NULL :2007/07/13(金) 12:09:07 ID:+HHaIWg8
>表示とメモリ上の
>データを別々に管理し
むしろ
>>728 のやり方のほうが別々な管理になっていると思うが…?
>直感的でわかり易い
データ取得してして
A:
・表示はコントロール任せ データソースプロパティにほりこむ
・入力チェックも殆どコントロールまかせ
・データアダプタ作って表示しているデータソースを与えて処理
B:
・ループでまわしてグリッドを作成したりデータ追加したり
・入力チェックをすべて自前で
・元のデータに反映させる時も元のデータに入れる前に型をすべてチェックして入れる
・そのデータをもとにSQLを発行してExcuteNonQuery(だっけ?)
Aのが直観的でわかりやすいと思うんだがどうだろうか?
頭がすこし固い人は自分で全部作ったほうがわかりやすくていいんだよ
全部を自分の制御下に置きたがるって欲求はわからんでもない。 が、チーム組んで作ってるプロジェクトではやってほしくないなぁ。 勝手にへんな動きをするMSは信用置けないってのもわかるんだけどさ。
全部を自分の制御下におきたいのであれば、MSの商品を使うこと自体に 疑問を持ったほうがいいと思うw C, C++, Java あたりでモジュールを作っていけば十分に対応出来るんじゃ ないかな。
734 :
NAME IS NULL :2007/07/13(金) 17:25:44 ID:+HHaIWg8
まぁドトネトで自作コントロールだな ユーザーコントロール使ってフルにオーナードローでw
オーナードローというよりは、セルフドローでは
736 :
NAME IS NULL :2007/07/13(金) 18:15:54 ID:+HHaIWg8
>>735 た…確かにそういったほうが正しい気がする(;゚Д゚)
737 :
724 :2007/07/15(日) 13:05:31 ID:???
>730-736 レスありがとうございます。 当方、MSのツールは初めてであり、.NET Frameworkを使わざる を得ない状況のため、嫌々使っているのです。考え方やツールに 慣れていないため、これまで培ったスキルをゴリ押ししてプログラム を組もうとしているわけで、頭が固いですね。 ところで、DataGridViewを使うのに、DataBindingSourceは必須ですか? DataGridView.DataSource=DataTable としても、変更した行などを 取得するには、DataTableとDataBingingSourceを接続しないければ いけないような気がするのですが・・・ ()
>>737 必要ない
多分普通に使う「バインド」と .NET の DataBinding が頭の中で
ごっちゃになってると思う
DataGridView での変更などは DataSource に設定した DataTable にすべて
反映されて保持してるから、そこから拾えばいい
DataGridView の各 Cell は DataTable と一対一で入力エラーも DataTable
の設定が反映されるからそういう意味では「DataTable にバインドする」
ってことになるかな
ただ .NET で言う DataBinding プロパティは
「Form の BindingManagerBase が管理するデータの各要素を DataBindingCollection に追加する」
っつー意味なので多分 724 が思ってることとは違う
仕事でいやいや使うのが辛いのはわかるけど、使わなきゃいけない
状況なら MSDN 見るなり自分で各コンポーネントチェックしなされや
発言見てると .NET 覚える気もない感ありありでっせw
739 :
NAME IS NULL :2007/07/15(日) 20:38:14 ID:kUe0nW9E
むしろ仕事だからと 愚痴を言うより その技術のいいところを盗んでほかに応用するのもいいんじゃないかと・・・?
740 :
724 :2007/07/16(月) 18:31:24 ID:???
皆様レスありがとうございます。 いろいろわからないことがあるためシツコク質問させてください。 DataGridViewを使い、行のデータを変更するのは別の画面で 行いたいと思っています。 この場合、グリッドの選択項目(FocusedItem)に対応するDataRowを 取得する必要がありますが、この取得のためにDataBindingSourceは 必須でしょうか? MSDN調べた限り必須だと思うのですが、DataBindingSourceが無くても 可能な方法があったら教えていただきたいです。
741 :
NAME IS NULL :2007/07/16(月) 19:53:57 ID:Jel/SKAo
>>740 別に必須じゃない
それは自作でデータを挿入できていることからもわかると思うけど・・・・
DatagridView.Rows().Cells().Value
これじゃだめなのかな?
これすら調べられないようでは話にならないと思うんだが・・・・
>>740 DataRow は DataTable の構成クラスの一つなんだが・・・
まぁなんだ、ここで質問する前に初心者本買って来て一から覚えたほうがいいな。
目障りだから消えてくれ。
System.Windows.Formsの質問もADO.NETの範疇に入るのか?
744 :
738 :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 も余計なことを書いてくれる・・・厳密にはそーかもしれんけどさー
745 :
744 :2007/07/16(月) 23:23:56 ID:???
>>743 そうだ・・・そうだよなぁ・・orz コタエテスマソ
746 :
741 :2007/07/17(火) 00:07:50 ID:Jv+VllVN
トンチンカンな回答をした自分が恥ずかしいorz
747 :
740 :2007/07/17(火) 19:35:55 ID:???
いろいろ回答をいただき、勉強になります。
>>741 >>DatagridView.Rows().Cells().Value
回答ありがとうございます。
実は、この方法しかないのかお聞きしたかったのです。
DataGridView.DataSource = DataTable とした時点で
データとビューが関連付けられるため、わざわざ
DataBindingSourceなど使わなくても
DataBindingSourceが実装するようなメソッドやプロパティが
使えてもよさそうなのに、と思った次第です。
DataSourceはObject型なのに何でそう思えるの?
749 :
NAME IS NULL :2007/07/18(水) 02:06:32 ID:VQDiTlZO
>>748 のいうとおりだが
Object型ってのが今一歩判ってないっぽいんじゃないか?
デバッグで止めてみてみればわかると思うが?
つうか
>>740 なぜ楽にできる方法を使わないでわざわざ茨の道を行くんだ?
しかも、それは近道ではなく遠回りでしんどいだけだと思うんだが?
すいません、データベースを更新後に最新のデータを表に表示したいのですが、 FILLを使っても昔のデータが出てしまいます。 this.testDataSet.infoSet.Clear(); this.infoTableAdapter.Fill(this.testDataSet.infoSet); とかやってみたのですが無理でした。 2行目を消したら何も表示されなくなったので、Clearはされていると思うのですが… DBはちゃんと更新されているのは確認済みです… 何かいい方法ありますでしょうか?
751 :
NAME IS NULL :2007/07/18(水) 12:54:10 ID:gqIaltWW
じゃぁ this.infoTableAdapter.Fill(this.testDataSet.infoSet); にあるとしか・・・・ 試しに取得するときに新しいインスタンスDataSetとかDatatableとかに対してFillしてそれ表示したらどうなるの??
752 :
750 :2007/07/18(水) 13:33:51 ID:???
>>751 VC#任せで作ったので、取得する方法がわかりません…
もう少し勉強してから質問します。
どうやらデータセットを更新する必要があるみたいです。
SELECT文の結果をデータセットにいれたらいいのでしょうか・・・
753 :
NAME IS NULL :2007/07/18(水) 13:37:34 ID:gqIaltWW
まさかとはおもうが >データベースを更新後に最新のデータを表に これは データベースからデータ取得 ↓ 表示 ↓ 内容の更新・追加・削除 ↓ データベースへの登録 ↓ 最新データの取得←いまここ こういうわけじゃなかったとか?
DataSetの中身を変更しただけでは、ローカル変数の中身がかわっているだけで、 データベースの中身は変わってないから、fillしたら昔のデータが表示されるだけです。 あたりまえ。
755 :
750 :2007/07/18(水) 16:10:22 ID:???
>>753 まさにその通りです。
データセットの中身は全く触らずに、
いきなりinsert文やupdate文で中身を変更しています。
756 :
750 :2007/07/18(水) 16:18:09 ID:Fsa6VxVX
DataGridViewについては全く触らなくてもOKですよね・・・ なんででしょう
757 :
750 :2007/07/18(水) 17:12:50 ID:???
いけました・・・ おとなしくデータセットにクエリの追加して、insertとupdateをデータセットに関してもやってあげたらいけました
SQL文はDataSetに対しては実行(Execute)できないから、 以下のような文章はおかしいと思う。 > insertとupdateをデータセットに関してもやってあげたら 解決したといっているのだからいいのだけど。
何が分からないのか分からないレベルの初心者だから仕方なかろう
ROMしてたが、一言。 相手が初学者であることだけで、横柄な態度でレス するヤツがいる。 エンジニアならば、謙虚であれ。
>>759 初心者をあざけって優越感にひたって楽しいか?
低級な人間であることが想像できる。
>>761 お前もな。
2chなんてそんなもんだろ。
763 :
750 :2007/07/23(月) 21:20:52 ID:???
C#歴三週間、ADO.NET歴2.5週間になりました。 先週はお世話になりました。 おかげさまで一通りDBを利用した簡単なアプリを作れるようになりました。 最初はデータセットやデータアダプタやテーブルアダプタってなんだーーーーーって感じでしたが、 何とか理解できました。 DataBindingというのがいまいちよくわかっていませんが。。。 今、意外に見つかりそうで見つからなくて困っていることがあるのですが、 OleDBのデータ型にLongVarCharってありますよね? あれって何バイトまで対応できるのでしょうか? ちなみに現在MDBファイルをDB代わりに使っています。
764 :
NAME IS NULL :2007/07/24(火) 11:47:57 ID:GcsD0LjG
そんなちょっとMSDNとか調べるだけで出て来るような質問はどうかとおもうんだが・・・・
>>764 初心者をあざけって優越感にひたって楽しいか?
低級な人間であることが想像できる。
技術板なんだから、技術以外の話はやめようぜ。 どんどんレベルが落ちる。
767 :
NAME IS NULL :2007/07/25(水) 09:07:09 ID:RrA9X9Mw
>>765 あざける?
このレベルであざけるという人間のほうがレベルが低すぎて人として認めたくないんだが?
じゃぁお前が答えてやれよカス
あ こ じ
意味不明な逆ギレかこわるい
んじゃ俺が書いとくよ >> 763 .NET で文字を代入する変数として用意してあるのは Char と String のみ LongVarChar ってのは LongVarChar っていうデータ型があるデータベースと 通信するために「この列は今通信してるデータベースではこういう型なんだよ」 ってわかるようにするための単なる目印でしかない .NET に持ってきた時点で文字列はすべて String 型で処理される OleDbType で定義されてる型は皆ただの目印 普通はプロバイダとの通信で自動でやってくれるとこなので意識することもない MDB には LongVarChar 型がないからそりゃわからんわなw まぁちょっと知識が先行しすぎだな 使わないものでも覚えておきたい熱意は買うけど 目の前のプログラムを強固に作っていった方が後々ためになるよ もうちと自分で調べてから質問したほうがいいな
771 :
NAME IS NULL :2007/07/25(水) 13:30:54 ID:RrA9X9Mw
>>770 お前みたいなのが俺の先輩にいれば・・・・orz
技術板なんだから、技術以外の話はやめようぜ。 どんどんレベルが落ちる。
773 :
763 :2007/07/25(水) 15:09:57 ID:QLcXTaha
>>770 ありがとうございます。
すべてstring型に変換されているだけなんですね。
MySQL+PHPで3年ほどやってたのですが、この度急にC#でアプリを作らないといけなくて猛勉強中です。
Varcharって255byteまでしかいけないんじゃないのか!?
とおもって焦りましたが、結局Stringで送るならDBに依存するということですね。
ありがとうございました。
774 :
NAME IS NULL :2007/07/25(水) 15:14:24 ID:RrA9X9Mw
>>773 逆にC#のStringの制限に依存するともw
向学心をもつことは大事なことだぞ。 エンジニアとして必須の心構えだろう。 そんな向学心を持つ前向きな人に敬意を 持てない族は、レスする以前に社会性や 道徳性を学んでいただきたい。
【教えて君増産計画審議中】 ∧,,∧ ∧,,∧ ∧ (´・ω・) (・ω・`) ∧∧ ( ´・ω) U) ( つと ノ(ω・` ) | U ( ´・) (・` ) と ノ u-u (l ) ( ノu-u `u-u'. `u-u'
777 :
NAME IS NULL :2007/08/01(水) 10:01:52 ID:EWBoJIaA
JETSQLで、INSERTした後に追加された主キーの値を取得する方法ってあるのでしょうか? 主キーとフィールド1があって、 INSERT (フィールド1) VALUES ('TEST'); みたいにinsertしたときに追加した主キーを取得したいのですが…
ない
>>777 1.オートナンバーが100まであるテーブルから、No1〜50まで抽出
2.DataGridView等で新規レコード作成
3.テーブルアダプター使って更新反映
4.Formを閉じずにさっき作成したレコードを変更
5.テーブルアダプター使って更新反映
とすると、No51のレコードがNo101の内容に上書きされちゃうから
mdbでオートナンバーが主キーのテーブルを操作する時は気をつけて
DataSetのAutoIncrementが自身の持ってるデータの最大値+iを新規行に
しちゃうのが悪いんだけどさ
780 :
NAME 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メソッドで楽をしてみたいなという想いがあり, ぜひ解決法をご教授願いたく思うしだいであります.
追伸: ポスグレでのテーブル作成 create table test( id varchar(32) primary key, att text, val text );
UpdateやBuilder自動生成を使おうなんて考えない方がいいよ。 冗長で訳わからんクエリになるし、トラブったときに原因追及するのが 超絶面倒だからさ。
まあ勉強なんだろうし。 主キーが無いとか?
ってあるな。
785 :
NAME IS NULL :2007/08/03(金) 16:29:12 ID:G29UWrC3
ご返信ありがとうございます. たしかにそうであると思います. ですが,基礎教養として抑えておきたいという気持ちもあります. チュートリアル(ではsqlDataAdapterとかですが)にしたがって プログラム作成を進めて 「このようにデータベースのほうも更新されています」 とか言われても,されてねぇじゃんっ(ツッコミ) みたいな, チュートリアルもできないという挫折や寂しい気分を少しでも 慰めてあげたいという自己愛もそこにはあるのです. なんらかの原因で自動生成されないのだと思うのですが, せめてその原因だけでもわかればと考えています.
AdapterのSQL文の自動生成は、「テーブルが1つで主キーを含む」という 条件だったような気がする。使わないから詳しく覚えてないやw このスレに来ている人たちは、「機械が勝手に生成したものは、安心して 使えないから自分で書いた方がいい」という考え方の人が多いよ。
みなさまお返事ありがとうございます. けっきょく自分で書いてやっとります.
788 :
NAME 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を別スレッドで同時実行)で実験してるけど、 なかなか再現しないんです。
>>682 今ちょうど Connection 周りテストしてたから Npgsql もテストしてみたら
Boolean も問題なく認識するしフォームへのバインドも普通にできるね
職場のアプリだからもうちとテストしてみるけど Unicode で問題なければ
しばらくこれ使ってみるよ
遅レススマソ
790 :
NAME IS NULL :2007/08/26(日) 14:29:21 ID:mA+SLkGt
>>788 探しに行こうとしている行のインデックス番号がないだけじゃないか?
DataRowsが5行しかないのにインデックスの5みにいってるような・・・
まぁマルチスレッド使うようなやつでそんなやつはいないか(´ヘ`;)
791 :
777 :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 と入力されている・・・ 日付の部分いらんのに(>_<)
792 :
777 :2007/08/27(月) 12:24:28 ID:???
sage忘れた。スマ >ってSQLを送ると、なぜか 2007/01/01 00:00:00 と入力されている・・・ >日付の部分いらんのに(>_<) これ時間の部分の間違いです。
793 :
NAME IS NULL :2007/09/05(水) 08:42:48 ID:kKr4913s
あげ
datatableの内容をストアドプロシージャのテーブル変数に渡すことは可能ですか? それが無理であればdatatableの内容を一時テーブルにセットしたいのですが datatableを1行ずつ読んでinsertするしか無いのでしょうか?
>>794 >datatableを1行ずつ読んでinsertするしか無いのでしょうか?
そうだろうねぇ
できれば便利だなぁと思ったことはあるけど
SQL2005のCLR使ってなんとかならんのかな?
できるようになったとしても SQL Server だけだろうな SQL ベースの他社製でオブジェクト渡すなんぞできるはずもなく つか手作業で insert 発行するのがそんなに手間か?
>>794 DataTable の中に入ってるなら、InsertCommand を書き換えて
Update() すればいいんでね?
バルクコピーとか配列を用いたinsertとかになるのかな? どっちみちADO.NETは対応してないと思うが
799 :
Anchan :2007/09/10(月) 20:59:09 ID:E8JC2cpC
みなさん、分からないことがあるので、教えてください。 ado.net で oledb の接続で、アクセスのmdb ファイルに接続しています。 mdb には sqlサーバーへリンクしたリンクテーブルと、 アクセスのテーブルがあります。 問題は更新クエリなんですが、 アクセスでは、両テーブルのキーで inner join で結ばれたデータの一括の更新(アクセステーブルにあるデータが更新対象で、sqlのテーブルを更新) のクエリは問題なく動くんですが、 .net からの 同じsql 分を作成して、executenonqurey だと 更新できません。ado.net だと一件ずつ処理するしかないのでしょうか? よろしくお願いします…
>>799 そんな事ないべ
>更新できません
具体的に
エラーを出すならそのメッセージを一言一句違わずに書き出してみよう。
802 :
Anchan :2007/09/10(月) 22:59:06 ID:E8JC2cpC
書き込みありがとうございます。 エラーメッセージは… すいません、すぐには詳細はかけませんが…確か、 呼び出しに失敗と 言うようなエラーだったと思います。 クエリは、アクセス上で動かすと動きます。 ちなみにクエリは、 update sqlTable as A inner join accessTable as B set A.[aa] = B.[bb] と言った様な感じです。お願いします。
803 :
NAME IS NULL :2007/09/18(火) 11:07:51 ID:3V4XUTTs
>>794 postgresで失礼
create table 一時テーブル as select * from coyp元
でまるまるコピーできます。
抽出条件書いたらその結果のみをコピーします。
SQL鯖では知らんけど(^^;)
>>802 それじゃその断片的な情報からエラーメッセージを特定できない限りわかんねーな。
回答は期待できないから、エラーメッセージを全部コピペしてくれ。
805 :
NAME IS NULL :2007/10/22(月) 07:48:51 ID:pch+h7TS
保守
SQLServer以外のDB使うとき、O/RMapperって使います? ASP.NETとSQLite.NETなんですが…。
使うひとは使うだろうし、そうでないひとはそれなりに。 オレは使わない派、直でごりごりクエリー書く方が性に合ってる。
>>806 ADO.NETの型付けされたデータセットで何か不自由してるのか?
809 :
806 :2007/10/23(火) 11:04:56 ID:???
>>807-808 トンクス。
普段開発がJavaなので、.NETの開発方法が
どんなのか知りたかったのです。
直にクエリー操作しても扱うデータが大した
量じゃなければ良いのですが、表示画面が
結構あるのでなんかないかなぁ…、と。
助かります。
操作元と同名のテーブル名を持つ別のMDBファイルをINや[]で直接指定している場合 参照するテーブル名にどうやって別名を与えればいいんでしょうか? SQLはこんな感じです、テーブル名が違う場合はこれで動きました Delete tbl1.* From tbl1 Inner join [path].tbl2 ON (tbl1.fld1 = tbl2.fld1)
>>810 普通にそれぞれのRDBMSの流儀に則って別名つければOKだと思うけど
812 :
810 :2007/10/24(水) 15:35:44 ID:???
操作先も参照元もMDBでJet4.0を使ってます 上記のSQLの記述を生かしつつ別名を与える方法が解らないんです・・・・・
813 :
NAME IS NULL :2007/10/26(金) 12:30:22 ID:VGzUxJqZ
FROMのところのテーブル名の後に TABLE1 AS HOGEHOGE でいいんじゃないの? ほかのところのアクセスは TABLE1 →HOGEHOGEで
814 :
NAME IS NULL :2007/11/11(日) 21:47:56 ID:Q6d7lQe/
age
何のリンクか恐くて見られない。
みんなトランザクションするときは手動で BEGIN COMMIT 送ってる? それとも Transaction クラス使ってる? どーでもいいことなんだけど、仮に Transaction クラス使うとすれば どういうメリットがあるのかちと気になったもんで
818 :
NAME IS NULL :2007/11/12(月) 22:41:46 ID:v5cjQ56U
>>817 Transactionに関しては、
>>554-556 あたりで話題に出てるよ。
スタンドアロンだったり、DBを複数に分けていない場合は、
Transactionクラスを使う必要性は無いと思うよ。
>>818 参考になりやした。ありがとね
俺もだめだな過去ログ&MSDNくらいちゃんと見ないと
820 :
NAME IS NULL :2007/11/14(水) 02:35:40 ID:ILbp4//g
>>819 でも実際迷うだろ
俺は迷って1日調べるのに費やしたことがある
>>820 迷うなぁやっぱ、、俺自身が DB 経験&.NET 経験薄いのもあって余計。
.NET に依存した書き方のほうが保守はわかりやすいかもしれんけどなぁ
っつーことでしばらくは簡単な処理に関しては、汎用の Transaction 用クラス作って
どっちでもできるようにラッピングして様子見することにしましたわ
ありがとね
822 :
NAME 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 という列名も存在します。 他に考えられる原因はありますでしょうか? よろしくお願いします。
823 :
NAME IS NULL :2007/11/15(木) 19:36:03 ID:703KYpiO
すいません、 HDR=YES です。
824 :
NAME IS NULL :2007/11/15(木) 19:40:02 ID:703KYpiO
すみません、自己解決しました。
ここまで詳しく書いたのならば、その自己解決の内容を書いたらどうだw
HDR = YES のつもりが、コピペ作業の過程で NO に書き換えられていました。
>>823 の書き込みに際してコードを確認していたところ発覚しました。
聞きたいことをひとに伝えている間にバグを見つけるのは良くあること。 説明するためにそれまでの視点から一歩離れて流れを追っているうちに、岡目八目 な状況になるからだろうね。
OLEDBを利用して、mdbファイルにアクセスしています。 データセットデザイナで以下のsql文を発行しているのですが、パラメータの部分が無視されているようです。 SELECT * FROM test1 ORDER BY ? という風に、カラム名に?を指定して動的に並び順を変えたかったのですが… 「?」が指定できるのは、パラメータだけで、カラム名を指定することはできないのでしょうか? 何かいい方法があれば教えていただけると嬉しいです。
>>828 ORDER 句で指定するカラム数分、あらかじめクエリーを
作っておくくらいしかないね。
もしくは、動的にSQLを組み立てるか。
830 :
828 :2007/11/20(火) 21:31:03 ID:???
>>829 クエリを一杯作らないといけないから面倒なんですよね・・・
やっぱり動的に組み立ててDataReader作るしかないですか…
VS2008あたりでここらへん対応してくれないかなぁ…
>>830 DLINQ、といいたいところだけど、MDB は未対応か・・・
832 :
NAME 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ではできないのは 何か悔しいです。
>>832 もう見てないかも知れないけど
・まずC#は分かってるんだろうな?
・C#わかんないならVB.NETにしましょう。悪いことは言わない。
・C#/VB.NETでもDAOは使えるので将来性を考えないなら
参照設定でCOMのタブから探してきて使いましょう。
・「うまくいきません」だけだと罵られるのがオチです。
・無知を棚に上げて「やはり無理」とか知ったかぶりするなボケ。
・Oracleは知らんのですが、SQL ServerのDTSみたいなデータ変換サービスは
ないんでしょうか?
・OdbcDataAdapter を AcceptChangesDuringFill で DataTable に読み込んでから
別のOdbcDataAdapter で Access に INSERT すればいいと思います。
・「mdbにODBCでOracleにリンクして」ってなところで怪しいなあ・・・
834 :
NAME 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に影響が出ます もしスレ違い、板違いのようなら誘導お願いします。
835 :
834 :2007/12/07(金) 10:47:13 ID:???
スレ違いのようなので、Microsoft SQL Server 総合スレに移動します
http://www.eplan.info.pl/portal_memberdata/portraits/SoBlondedata So Blonde data
,
http://www.eplan.info.pl/portal_memberdata/portraits/hellgatelondon hellgate london
,
http://www.eplan.info.pl/portal_memberdata/portraits/experience112download experience 112 download,
http://www.eplan.info.pl/portal_memberdata/portraits/hellgatelondon hellgate london
,
http://www.eplan.info.pl/portal_memberdata/portraits/simcitysocieties simcity societies
,
http://www.eplan.info.pl/portal_memberdata/portraits/simcitysocieties simcity societies
,
http://www.eplan.info.pl/portal_memberdata/portraits/sinsofsolarempire sins of solar empire
,
http://www.eplan.info.pl/portal_memberdata/portraits/MASSEFFECTtreiler MASS EFFECT treiler
,
http://www.eplan.info.pl/portal_memberdata/portraits/MASSEFFECTtreiler MASS EFFECT treiler
,
http://www.eplan.info.pl/portal_memberdata/portraits/SoBlondedata So Blonde data
,
837 :
NAME IS NULL :2007/12/15(土) 00:29:35 ID:RcQd2CIu
ADO.NET+Data Provider For Oracle でOracleへの接続ですが Oracle10gR2とOracle11gには接続可能でしょうか? 当方、Oracle9iでは接続の実績があるのですが上記のバージョンに変更しようと思っています。
>>839 >>また今まで作ったプロジェクトが動かなくなったりするのかなぁ。。。
2003で作ったのを2005に変換するだけで、わやくちゃになったしなぁ。orz
VB6の関数を残しているくせに、前バージョンとの互換性がなくなるってどんだけー。
今の時期は、.NETへ移項中なので安定しないという状況なのかなぁ。 それとも安定をさせる気が無いのかなぁ。 無料配布方に切り替えたから、代わりに頻繁にバージョンアップ方式にしたとか。 ここまでひどい状況だと、だんだんと勉強する気がなくなってくる。
おまえら、.NET Framework 3.5 の仕組みを見てから言えよ・・・
843 :
NAME IS NULL :2007/12/20(木) 23:11:52 ID:8r4piS37
>>842 見てきた見てきた!
東の空でオレンジ色に光って不規則に飛んでたよ!
プロジェクトを作る際、対象となるフレームワークを選択したり 出来るというものを言っているの? それ以前に、開発したPC以外において、WindowsUpdateを 最新にするなどして環境を整えていてもアプリが動かない場合が 結構あるといいたいの。 開発をしたのと同じバージョンのVisualStudioを入れてみても 動かなかったしなぁ。
今回のバージョンアップでは、ADO.NETは大きな変化はなかったのかな?
>>845 - LINQがらみ
- エンティティフレームワーク(未搭載)
- SQL Server 2008 がらみ
847 :
NAME 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
>>847 ここはやや過疎りぎみなので、C#スレでも聞いてみるといいと思う。
解決方法が分かったら報告してくれると、なおよろし
最近は、「ADO.NET」でぐぐったりすると、いろいろヒットするようになってきたね。 前は、「"ADO.NET"」としなければ、ADOのページがヒットしたりしてた。 DB接続に関して初めて学ぶ時、使いやすさを徹底したMSの製品を最初に 勉強すると良いかなと思ってやったけど、逆に非常に苦労したな。 これじゃなくて、PerlのDBIやPHPのpg_Connectを先にやればよかった。
TableAdapter使ってる人いる? ウィザードはどうもあわないんだよね・・・
サーバカーソルの搭載しないのかな
linq使うから、ado.netはもう使わないって方向になるのかな? せっかく使いこなせてきたかなって感じにまでなれたのに・・・
ほす
ほさない
ほす
.NET って濁点付き半角カナもきっちり一文字で認識してくれるのね 便利だし親切だなぁ、素敵・・・orz
>>858 あ、別にそんな大層な話でもなかったりするw
DataView の RowFilter で半角マッチさせる時に
'カ*' とかで検索かけると ガ にヒットしてくれないのよ
文字として見れば当然だし多くの場合はこっちの方が便利だと思うから
いいんだけど、知らないとはまるなぁと思った。
半角ってどうもバイト単位で考えちまうもんで・・
>>859 カがあったら
or ガ とか条件追加してやれば?
>>860 だよな、そうした
データベース側の正規表現マッチだと ゙ も一文字認識だったから
ちょっと違和感があっただけなんよ
dね
SQL Server2005とADO.NET 2.0についてだけど 2.0から dataset.RemotingFormat =SerializationFormat.Binary てのが追加されたけど dataadp.Fill(dataset) みたいな使い方には効果ないの?
保守
5月はどこいった!?
865 :
NAME IS NULL :2008/06/02(月) 16:15:41 ID:gBCGUa8J
>>864 いい事いうじゃねえか。
出来るんだな?
今すぐ頼むぞ。
868 :
NAME IS NULL :2008/07/27(日) 23:14:42 ID:BMrKOhf6
保守
869 :
NAME IS NULL :2008/08/07(木) 17:43:11 ID:V/wrdbRm
アドネットのどんなDBも同じようにコントロールできるという機能は、 誰がいつどんな方法で開発したかさっぱりなDBでも 意識せずにコントロールできるのでしょうか?
>>869 ADOが対応しているRDBならどんなものでも意識せずに使える
872 :
NAME 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)です。
>>872 たぶん日付の指定が間違ってると思う。
DBはSQL Server?
SQL ServerならDBのヘルプのデータ型のところに
Datetime型の指定方法が詳しく載ってる。
時刻まで含めるとかなりのパターンがある。
あとそのシステムはasp(.net)ということはないよね?
>>872 実際のコードでブレークかけて、そのSQL文が本当に生成されているか確認した?
変数をMYDATEやVALUEに入れてあるってだけじゃダメで、全文をトレースして
みよう。
>>872 日付リテラルを#MM/DD/YYYY#にしてみるのも手だぞ。
>>873 相手はMDBって書いてあるだろwww
876 :
NAME 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
878 :
NAME IS NULL :2008/08/31(日) 16:47:53 ID:zVJzNbJk
保守
879 :
NAME IS NULL :2008/09/07(日) 17:12:59 ID:xiwEOZ0b
保守
Linqの登場で、DataSetを使ってAdapterでFillとかUpdateの方法って廃れるんですか?
881 :
NAME IS NULL :2008/09/10(水) 19:29:43 ID:/Y9/Qvra
>>880 LINQはデータ取得の方はともかく、Updateは一応出来るってレベルだから
まだまだ廃れないと思う。
882 :
NAME 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としては上記のような感じです。 よろしくお願いいたします。
標準SQLでは、文字列はシングルクォートで囲みます
sql = "@ SELECT 'コード' FROM テスト ORDER BY 'コード' " これでなげてみ
>>883-884 回答サンクスです
シングルクォートで囲うと正常にGetDataTableが成功したので中をのぞくと・・・
Exper1000 Expre1001 Exprer1002 というカラムになり
中の値は
コード 名称1 名称2
というデータのレコードが実際の件数分・・・orz
予約語やブランクを含んでなければ日本語名称でもそのまま使えると思うけど。 JETの場合は [ ] で囲むのじゃなかったっけな。
>>886 即レスサンクスです
[]で囲ってみたところ正常に動作しました!
ありがとうございました!!
感謝です
888 :
NAME IS NULL :2008/09/16(火) 14:53:50 ID:D2fPfihD
OdbcConnection.GetSchema("Tables", New String() {Nothing, Nothing, Nothing, "TABLE"}) ↑これは有効な接続ね これを呼び出すと 「要求されたスキーマ('Tables')がサポートしているよりも多くの制約が指定されています。」 って怒られるんだけど、何でだろう?
要求されたスキーマがサポートしているよりも多くの制約が指定されているんだろう
多分、要求されたスキーマがサポートしているよりも多くの制約が指定されてるんじゃない?
891 :
NAME 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…のほうが綺麗じゃないですか。んもぉお。
データアダプタには特定のデータテーブル専用のSelect文があるのに データセットをFillさせようなんて無理じゃん。常考
Datasetって、複数の表を溜め込んで、 アプリ側で複数の表のイメージを一括管理・使用できます的なものなんですよね。 ただテーブルをひとつSeletするだけならDataTableったほうが良さげですね。 このスレをきっかけになんとなく分かりました。
List<DataTable> や Dictionary<string, DataTable> 使うぐらいなら、 DataSet使いましょうって事? それプラス何か有るんじゃないの?
>893 今までは、DataTable同士を集合演算できなかったから Datasetってほとんど意味なかったが、 Linq to Datasetでようやく使い道が出てきたな。
897 :
893 :2008/10/04(土) 23:09:46 ID:???
DBのひとつの表からデータをSelectして、 取得した列データをアプリ側でただ単に展開(使用)するだけのケースの話をしてました。 DataSetみたいな複数表を格納するデータ構造で管理する必要がないので、 それだったらDataTableのまま使った方がいいじゃんという話です。 そもそもFillで取得出来るのは、DataSetだけだと思い込み、 Fill(DataSet)によるSelectに拘ってたのが間違いでした。 なんていうか、DataSetに複数のDataTableを格納できるメリットを よく理解してなかったので「DataSetでFillしとけば間違いないや・・」 と思いよく調べてませんでした.
LINQについて調べていての感想 LINQは便利だけど、内部の動きを知っていないとパフォーマンスが悪くなる 場合もあることから、すべてがそれに置き換わることはなさそうだ。 入門の解説などには、SQL文を把握してから使った方がいいよ。みたいな 事も書いてあるしね。 なので、ADO.NETにおいても把握する必要がなくなるとは思えなくなった。 しばらくは、LINQは使わずに、ADO.NETを使ったコードを書いていこうと思う。
ADO.NETって、ADOの進化系ではないよな。 ただの、非接続型のモジュール群だ。 となると、ADOを.NET上に移植した接続型の モジュールがこの先出てくるんじゃないかと 思ったりするのだが、どうかな? もう、LINQの方向に力を注ぐだけかなぁ
馬鹿だろ。プログラミングADO.NET2.0を100回音読してから来い。
無闇に馬鹿とかいうなよ 多分、古いADOのプログラムしか書いたことが無い奴が、.NETへ移行するのに悩んでいるだけ
この話題はこのスレの1-100くらいで散々やってるね。既出もいいとこ。
>>901 ちゃんとどうすればADO.NETを理解できるか教えてあげてるから
むやみに馬鹿よばわりしてるわけじゃない。
SQLの書き方はSELECTくらいしか知らなくても、更新したり、削除したりが 出来るから、ほとんどSQLの書き方を知らない状態でもそれなりに動くものが 作れるADOは凄かったと思う。(INNER JOIN で読み込んでも、update出来るしね) ちゃんと理解して無いのであれば、同時実行制御やネットワークの負荷などで 問題が出る部分はあるが。 そういう知識の状態でADO.NETやりはじめたもんだから、相当苦労したw なんでINSERTやらDELETEやらを覚えないといけないのかと疑問に思いつつ SQLを勉強したよw
質問です。
DataReader使う時のサンプルコードは、new しないのばかりなので、
newしなくて良いということなのでしょうが、この理由について、
きちんと説明されてるものを探すにはどうしたら良いでしょうか?
DataReaderは、DBのデータを参照するだけの役割ではありますが、
クラスであり、そのメソッドを実行するのであれば、インスタンスは
必要だと思うのですが。
http://homepage2.nifty.com/inform/vbdb/net_mdb.htm キーワードなど、ヒントとなるものでも結構ですのでお願いします。
>>905 OleDbCommand の中の人が、あなたの代わりに new してくれてる。
レス遅れてすみません。
>>905 です。
ありがとうございました。
死ねぐらい言われても仕方ない覚悟で書き込みます でも、いきなり死ねわなしでよろ C#+SQLサーバー)無料お試しセットで勉強してるんですが dataGirdViewで、親子関係がある(リレーション)他のテーブルの参照って <<<ドラッグ&ドロップ>>>で可能なのでしょうか? クエリーとかXSDいじったのですが うまくいかなくて コード手書きしないと できないんでしょうか? 例 商品コードから商品名を引っ張ってくるようなイメージ CD001 うまうま棒(←こいつを商品マスターから持ってくる)
SQLサーバで商品コードから商品名を引っ張ってくるようなビュー作ったら? とか言ってみる
SEEじゃLinqtoSqlできないんじゃなかったっけ
SEEって、なんだろう海?
913 :
NAME IS NULL :2008/11/21(金) 21:19:58 ID:FJqz2E1H
Netで見たけどコネしてSQLが常識と見た datagridの達人求む
914 :
NAME 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
915 :
NAME IS NULL :2008/11/22(土) 08:31:39 ID:rVCwylLd
909の件は・・・すれちがい?
>>915 DB板は全般的に閲覧している人が少ないから、レスがつきにくいだけだと思う。
マ板のC#やVB関連のスレで質問してみると良いと思うよ。
917 :
NAME IS NULL :2008/11/22(土) 23:30:31 ID:hKcaAN7u
DataGridViewComboBoxColumn でだめかな
919 :
NAME IS NULL :2008/11/23(日) 12:57:28 ID:AwUhrFhC
>>918 するどい
やはりそれですよね
でも選択にしか使わないのにコンボ使うのもどうかなと思いまして
でも作業効率考えると一考の価値がありますよね
しかし、私のイメージからするとPgは一レコード一レコード処理するイメージがあるんですけど
VBC#系はSQLでドーンって感じなんですかね
自分はデータの先頭から一行一行処理みたいな考え方なんですけどねぇ^^
920 :
NAME IS NULL :2008/11/24(月) 16:42:51 ID:SCGbkJ/y
hoshu
921 :
NAME IS NULL :2008/12/02(火) 20:58:05 ID:/ZZP+pb1
ほ
922 :
NAME IS NULL :2008/12/05(金) 23:02:20 ID:8tUTVZdg
し
アメリカ本社の開発チームが凄いと思うとか書いてるって事は、君の実力の方は・・・
925 :
NAME IS NULL :2008/12/14(日) 19:13:41 ID:8j0fAwAX
保守
DB板ってこういうプログラム系の情報交換ってされてないから過疎りやすいよな。 ム板に移動した方がいいのかなぁ? まだまだすべてがLINQでってわけにもならないんじゃないかと思うから、スレとしての 需要はあるとおもうんだけどな。LINQ使うにしても、その内部の動きは把握してなければ 非常に遅いプログラムになってしまったりするわけだし。
保守しときます
928 :
NAME IS NULL :2008/12/30(火) 21:50:23 ID:NDC5vo5R
LINQ単にSQL並び替えてMSの技術者囲い込みにしか見えないんですけど SQLにくらべてLINQの優れてるところおしえて
MSってこれまでの流れをみてみると、後追い&微妙に仕様を変更したものを開発・公開って気がする。
LINQの優れてるところは対象がsqlだけじゃなくobject、xmlみたいなのも同等の処理で扱えるところ。
931 :
NAME IS NULL :2008/12/31(水) 09:18:09 ID:ZwvDmfIc
でも オブジェクトはともかくxmlは実務で使いますか? そんな希望聞いたことないです いまひとつ利点が弱いような オブジェクトのほうは便利なんでしょうか?
むしろ、LINQ to XMLだけが実用的で便利で、他のは要らない。
933 :
NAME IS NULL :2008/12/31(水) 16:13:12 ID:9ix+bu5f
SQLは手書きでゴリゴリ書いてるけどLINQはやる気にならないなぁ データセットFillしたあとは表示したりするだけでそっからさらにLINQで ゴニョゴニョするような事しないし xmlもiniファイル代わりにしか使ってない・・・
最近のMSの製品はXML対応っていうのを前面に出したアピールをしているが、 いまいち流行ってない感があるんだよなぁ。VRMLみたいにならなければ良いのだが。
>>934 みたいにiniファイル代わりに使うか、
ローカル・個人で使うツールでDB代わりに使うぐらいしかやったこと無いな。
ADO.NETのメタデータ関係のAPIは、DBの違いを意識しないといけないから、 JDBCに比べると使いにくいな。 それ以外は圧倒的にADO.NETの方が好きなのだが。
保守
939 :
NAME IS NULL :2009/01/21(水) 11:12:17 ID:fTKjDGPM
C#でSQLServerファイルを扱うシステムを作っています。 データセットのデザイン画面で、TableAdapterのプロパティに表示される、UpdateCommandが 自動に生成されません。 何か考えられる原因がありませんか? 右クリック-構成で、詳細オプションを選択した画面で、 「INSERT,UPDATE,およびDELETEステートメントの生成」 をチェックするのですが、UpdateCommandは作られません。 また、「データファイルの更新」にチェックを入れても、次に同画面を開いたときには チェックがはずれています。 何かアドバイスをお願いします。
940 :
939 :2009/01/21(水) 11:33:40 ID:???
自己解決しました。 テーブルに主キーが設定されてないと出る現象のようでした。 お騒がせしました。
質問の内容とは違うことをいうけれど、過去ログにもあるように、ウィザードが 自動生成したSQL文をそのまま使用するのはあまりお勧めしないよ。 自分で書くのをお勧めする。
>>941 なぜ?
いつまでも成長しないから?
それとも他に不具合の可能性とかあるんですか?
>>942 自動生成されたSQL文見ればわかるでしょうに。
>>943 簡潔に答えてやれよ。
もったいぶるほどのことか?
みみっちい奴だなあ。
>>943 簡潔に答えてやれよ。
もったいぶるほどのことか?
みみっちい奴だなあ。
パフォーマンスが著しく悪いからだよ。 あれしか使えない同僚が不憫でしょうがない。
パフォーマンスが悪いw
>>自動生成コードはパフォーマンスが著しく悪い。 自称Webデザイナーの知り合いがよく言ってた。 「最高のWebデザインツールはメモ帳」なんだってさ。
なぜって聞いてるってことは、自動生成されたSQLを読んでないか、 読めないって事だな。 確かにGUIツールの発達によってSQLは書いたり読んだり出来なくても いいようになってきてるが、そんなんだと必ず壁にぶちあたるぞ。
たぶん業務でやってる人じゃないんだろう。 趣味でちょっとしたサイト作っててせいぜい100件程度のデータ、 更新等も型どおりの簡単なヤツのみとかなら ムリに手書きを進める必要も無い。
↑ こんな奴ほど自動生成よりも汚いのを書いてることも多々ある
952 :
NAME IS NULL :2009/01/24(土) 14:15:56 ID:SNFD0Fjw
仲間割れはやめろ見苦しいぞ
自動生成されたSQLがどんなことしてるのか理解できないから 使いたくないってことね、おまえらもっと勉強しろよw
SQLってそんなに難しいか? 勉強ってほどのもんでもないぞ。 中学卒業してる奴ならすぐマスターできる。
だからそんな簡単なこともできないゆとりがフエテンだろw
本一冊2-3時間ばかり読めばわかることなのにな。 ま、その程度のことすらしないのもどうかと思うが、 その程度のことでここまで高飛車になる奴もどうなんだろう。
>>956 できるフリはやめておけ。
あ、自覚がないだけか。
自分だけがずっと保守していくなら別にかまわないかも知れないが、 誰かにプロジェクトを継承させることを視野に入れた場合は自動生成されたSQLを保守していくのは地獄だぞ。
自動生成されたSQLを手動でいじろうとするのが間違ってないか?
自動生成では簡単なSQLしか発行できない。
最近はdatasetに一気にデータをいれてdatasetで編集してDBに戻すみたいなんが主流なの? オレみたいにdatareaderで一件ずつ読んで専用のクラスにセットしてから使うみたいなんは時代遅れ?
アプリケーションの形態で使い分ける。 ADO.NETは疎結合が有効な場合に使おう。
>>961 専用クラスの具体的な内容は知らんけど、
DataAdapterやDataTableのイベントを利用すると結構細かい制御も利いて便利だぞ。
予め型付DataSet用意しとけば、Intellisenseも利用できるんでコーディングもそこそこ楽。
そんな感じで扱うと、適当にデータバインド利用して画面に放り込めるんで
何も意識する必要がなくて楽。
DBに戻すときは内容やデータ量で判断。
データ量が多いときや、あちこちのマスタを参照して…なんてめんどいときは、
DataSetをそのままストアドにぶち込んで処理してしまったりする。
DBのテーブルとDataSetのテーブル結合させて手抜き処理w
964 :
961 :2009/01/30(金) 20:35:35 ID:???
専用クラスってのは、例えば社員クラスみたいなのがあって、社員A.給与みたいなんで 給料計算してくれるみたいなのを今までやってたんだけど、datasetを使うと foreachでまわして給与計算(社員A)みたいな感じで関数呼ぶようになるよね? で、この給与計算する関数をどこのクラスにいれてやるのがスマートなんだろうかと 悩んでいるところなのです。
965 :
963 :2009/01/31(土) 02:52:40 ID:???
>>964 数年前に給与計算やったときは、Partial Classを利用して型付DataTableの中に計算ロジック放り込んだ。
DataTableのColumnChangedイベントをチェックして、単価Columnや時間Columnなどに変更が加えられたらば
計算ロジックを呼び出して、DataTableの給料Columnを更新してやるよな感じ。
一度に全部計算するのではなく、必要な部分だけ計算・更新していくのでデバッグは楽だった。
スマートとは言えんw
>961 俺もその辺は気になる。 datareader使ってる例の方がよく見かけるような気もするし。
DataReader使うのはコーディングの上では手間が掛かるけど理解しやすいし DataSet、DataTableは便利だけど使い方を調べるとき何処から手をつけていいか結構なやんだ
ま、結局は保守や引継ぎはどの範囲で行うのかを予測した上でってことになるんだろうな。
クラスは基本的に多機能な方が便利であるが、その都度使い方を覚えなおさなければ
ならないというデメリットがついてくる。
ADO.NET そのもののバージョンアップによって仕様変更が行われることも想定すると、
動作などが単純な DataReader の方が仕様変更が少ないと思う。
となると、自分で作るプログラムは DataReader を使ったほうが流用が利きやすいのではないだろうか。
>>76 にあるように、ADO.NET は「簡単なことを簡単にすませる」という要件のものでしかないので、
そうでない状況のプログラムでは使えないので使わないほうが良いと思う。
これまでの Accessを使った、スタンドアロン、もしくはそれに近い案件の場合は、DataSetなどを
ばんばん使ったほうが早くて良いと思う。
現場のマとして条件反射で噛み付いてしまうが、 使い回しが効くという名分の元にゴミを維持・生産してるケース多すぎ。 LoopとIfが大好きで、ADO.NETに適応出来ないする気も無いって連中が 免罪符としてそれを利用することが多いのだな。 なので、明確にDataReaderでなければいけない理由を説明できないのなら ADO.NET標準でやるようにしてくれ・・・趣味の範囲で自己完結する分にはどうでも良いけど。
ADO.NET標準についてkwsk
>>969 はどのようなコーディングを推奨しているの?
1.
>>963 のようなコーディング(楽なため)
2.過去ログにあるようなDataSetを使わず、DataTableに格納する方法(軽いため)
3.上記以外
もちろん、「場合による」なんて回答は辞めて欲しい。
どういう状況で、LoopやIFを使いまくってて困ってるのかを書いて欲しい。
>>971 DataReaderで一件ずつ取って
label1.text =
label2.text = ・・・ループ回しながら繰り返し
その中で条件分岐してまた別のSQL実行してマスタの中身だけ取って来て、
その値を見てまた分岐して…みたいな。更新ときも似たようなもん。
で、途中でどこにいつ何が入ってるのか自分でもわかりにくくなったのか
Public変数使い出したりしてな。
そんな底辺会社に2度も引っかかった自分もマヌケだが
どうしてそういうコーディングするかを聞いたら使い回しが出来るんだとさ。
全員では無いが、大半そんな返事だったよ。
>>971 それはダメなコーディングで969推奨のは?
>>973 普通にデータバインドぐらいは使ってくれ、
何でもかんでもLoopとIfで処理しないで、ドトネト利用してくれ。
ついでに横長テーブル作りたがる奴は死ね。
それ以上に書くことなんてあるかいな。
ダメなコーディングの理由を「流用が利く」にする連中が居て、
「他でもそうしている」(もちろん、どんなケースで何故そうしたかはスルー)を
言い訳に使いたがるのが居る。
わざわざ現場でそんな連中に言い訳くれてやんなと。
と、書いてるうちに自分も有害だと思えてきたのでこのままデスマの中で吊ってくる。
DataReaderは、速度的にはどうなの?
DataReader は、速度最優先で設計されてるらしい。 だから、データを読む時は一方通行にしか動かせない。 独自でベンチを計ったことは無いが、速度や軽さ優先で あれば、DataReaderを使うしかないと思う。
DataReaderは、速度優先で設計されてるものだから、そればかりを優先的に 使う状況もあるかもしれないが、その理由が、「流用が効く」はおかしいと思う。 特に大きな制約が無い状況で、自由に使っていいという状況であれば、 DataTableを使うのがメインになると思うけどな。さらに、Updateは DataRowの状態を見てSQLコードを生成させる方法とか。
>>974 で触れている、DataReaderを優先的に使いたがる人って、
AccessやVB6でADOをバリバリに使ってた人たちってことでおk?
あれは、こんな感じのソースを書くのが定番になるみたいだし。
' rsはrecordsetのこと
Do Until rs.EOF
' Ifなどの処理
rs.MoveNext
Loop
using rs as Recordset = cmd.ExecuteReader while rs.read 〜 end while end using
メモリ上にDataTableやDataSetの形で置いとくより、HogeClassのListなり Dictionaryの形で置いといた方が便利な事が多くない? フォームへの半自動表示を考えるとDataTableの方が便利な事も あったかもしれないけど、WPFだとデータテンプレートでその辺どうでも よくなったし。
981 :
974 :
2009/02/06(金) 22:36:20 ID:??? >>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 ワーク・・・略