X



ADO.NETの質問・雑談スレ2

0133NAME IS NULL
垢版 |
2009/04/07(火) 19:52:47ID:???
「非接続型=DataSetクラスを使っていること」は良いとして、
「接続型=DataSetクラスを使っていないこと」ではないと思うんだな。
「接続型」と積極的に言えるのはせいぜいADOなどで更新やスクロール可能な
結果セットを使った場合だと思う。
CommandやDataReaderクラスは非接続型か接続型という分類じゃなく、
そられを実現するための基本的なADO.NETデータプロバイダのファンクションそのものであると考えるべき。

ADO.NETを解釈すると、データプロバイダ(ドライバ)+DataSetフレームワークというべきもので
あるが、たびたびデータプロバイダのみをADO.NETと呼んだりするのでややこしいい。
ADO.NET Entity Frameworkでもデータプロバイダは共通なんだよね。
0134NAME IS NULL
垢版 |
2009/04/07(火) 21:59:14ID:???
>>132
それ、昔の.NETマガジンの記事だな
その記事みると、接続型はサーバカーソルのようにみえるな
まあ、対象がORACLEなんで若干の違いがあるのかもしれないが、
ADO.NETではサーバカーソルは(ADO.NETの機能としては)サポートしてなくて
DataReaderでさえサーバカーソルは使わないらしいが...

その記事でも、接続、非接続の区別が大事だって書いてあるなぁ

「非接続型=DataSetクラスを使っていること」が定義になるだろうってことに反対はしないが
>>130 がいうように、、「取得したデータをローカルのメモリに保存してるかどうか」が大事なとこなんだろうな
結果としてDataSetを使ってるというだけで
だから>>133の言うように>「接続型=DataSetクラスを使っていないこと」ではないと

ただ、その定義にしたがって考えれば、
「ローカルのデータセット更新中も接続を保持する非接続型がある」ことになるんだが
だったらその定義や、接続、非接続の区別が重要だとは思えないんだよな
接続型か非接続型かじゃなくて、コネクションをオープンしたままなのかクローズしてあるのか、
サーバ側のロックを保持してるのかどうかが大事なんだと思うんだが...

非接続型って言うと、どうしてもサーバ側のロック持てないイメージがあるんだ
名前がよくないのかもしれないな。これ、英語ではどんな単語で表現されてるんだろうなぁ
0135NAME IS NULL
垢版 |
2009/04/07(火) 22:45:12ID:???
残念ながらそのものズバリconnectionless
0136NAME IS NULL
垢版 |
2009/04/08(水) 07:42:13ID:???
俺は、「非接続型」というのは、DataSetをアピールするためのキャッチコピーの
ようなものだと思ってるんだけどな。そもそも、DB接続プログラミングに関して
そのような用語や概念は無かったのだから、DB設計をしたり実装したりする
時においてはさほど重要ではないと思う。
0137NAME IS NULL
垢版 |
2009/04/08(水) 09:44:01ID:???
接続型とか非接続型ってのは、MySQLのC APIで言えば、
それぞれ、mysql_store_result()とmysql_use_result()でしょ?
0138NAME IS NULL
垢版 |
2009/04/08(水) 09:44:50ID:???
あ、ごめん、順番逆に書いてしまった >137
0139NAME IS NULL
垢版 |
2009/04/08(水) 10:42:48ID:???
>>137
いい事いうじゃねえか。
出来るんだな?
今すぐ頼むぞ。
0140NAME IS NULL
垢版 |
2009/04/08(水) 14:45:53ID:???
>>137
MySQLよく知らないんで、その違いを説明してくれないか
ADO.NETのスレでMySQLに例える意味がわからんが
0141NAME IS NULL
垢版 |
2009/04/08(水) 23:29:36ID:???
ちょっとでしゃばって見たかったんだ てへっ
0142NAME IS NULL
垢版 |
2009/04/09(木) 00:16:01ID:???
javaのWebアプリ開発経験者です
今回、初のASP.NETの開発のため調査しています。

いまのところ、ASP.NETのDB処理は「非接続」で実装(javaと同じような)
すればよいという認識ですが、正しいでしょうか?

そもそも、このスレは、ASP.NETは考慮せずに、
Windowsアプリのみを想定しているのでしょうか?
>>2
の「前スレの流れ」はASP.NETとWindowsアプリの区別は無いのでしょうか

0143NAME IS NULL
垢版 |
2009/04/09(木) 00:46:51ID:???
状況により使い分ける。
例えば接続型のDataReaderの方がパフォーマンスは良い。
しかし、順方向への読取専用にしか使えないので、
例えばGridViewのページングを使いたいような場合には向かない(できない)。
0144NAME IS NULL
垢版 |
2009/04/09(木) 01:14:14ID:???
>>142
すぐ上で接続型と非接続型に対する議論が白熱してるw
で、俺はjavaはわからんのだが、javaと同じような非接続の実装ってのはどういうもんなんだろ
>>131なんかが言うには、javaだとDataReader使うようなスタイルになるみたいだけど、
それなら分類的にはどっちかっていうと接続型だと思うが...

まあ、少なくともDB周りにおいてはその区別は重要ではないという流れではあると思う

WebアプリかWindowsアプリかについては、俺の私的意見ではあるが、ADO.NETは
Webアプリ的思考をWindowsアプリにも適用する方向に向かって進んできたので
Webアプリにおいてはあまりその違いを重要視する必要がないと思う

Webアプリなら特性上、楽観的ロックでコネクションは即時解放ってスタイルにならざるをえないと思うが
まあ普通にADO.NET使って作ってればそうなってると思うw
0145NAME IS NULL
垢版 |
2009/04/09(木) 07:25:46ID:???
>>142
文面からすると、「javaは非接続型で実装するスタイルがメインである」と
読み取れるのだが、JDBCの場合、テーブルデータをローカルメモリに
保存する機能のクラスはないのだから、「javaは接続型」だと思うのだが。

javaであなたが実際に実装する際に使っているライブラリやクラス名を
教えて欲しい。(O/Rマッピングあたりなのかな?)

このあたりがはっきりしないとレスもしようが無いので。
0146NAME IS NULL
垢版 |
2009/04/09(木) 15:59:01ID:???
ADO.NET単体では
MDBファイルの新規作成はできないのでしょうか?

COMを使えばできるのは解ってます。
0147NAME IS NULL
垢版 |
2009/04/09(木) 19:58:32ID:???
ADOの時代からADOX使わないと無理だったんで、無理だと思う
ADO.NETはあくまでも既存のDBに接続するためのものってことだな
0148142
垢版 |
2009/04/09(木) 21:05:04ID:???
>>144
>>145
142です。ああああ、ごめんなさい。
ご指摘の通り、javaは「接続型」です。記入間違いです。
混乱させてしまいました。

>>143
ですよね。
GridViewのページングのためしか、「非接続型」は使えないきがする。

>>144
>すぐ上で接続型と非接続型に対する議論
この論議がWindowsアプリを前提にしているのかなぁ?
と思ったので質問しました。
>Webアプリなら特性上、楽観的ロックでコネクションは即時解放ってスタイル
ですよね。そうかなと思ってたので、安心しました。

>>145
ちなみにjavaのDB処理は、DbUtils好きです。
O/Rマッピングは、わかりにくいのであまり好きじゃありません。

今回のASP.NETの開発は、基本は「接続型」で
GridViewのページング機能を使うなら「非接続型」使用します。
ありがとうございました。
0149NAME IS NULL
垢版 |
2009/04/10(金) 07:59:01ID:???
>>146
話の整理をする意味合いでの意見だが、
ファイル操作はADO.NETの範囲ではない。
0150NAME IS NULL
垢版 |
2009/04/10(金) 16:34:35ID:???
>>149
MDBファイルの新規作成を、ファイル操作って言っちゃうと
ちょっと議論がずれるとおもうぞ
MDBファイルの新規作成=JetでのDBの新規作成 って意味だと思うんだ

Jetが(実際は無理なんだが)create databaseとかのSQLでMDB作れるなら、
ADO.NETからSQL発行すれば可能なんだろうけど、その場合でも
それはADO.NETの守備範囲ではないと思うんだ
0151NAME IS NULL
垢版 |
2009/04/10(金) 17:54:13ID:???
MDBファイルの作成であれば、ファイル操作でやるしかないでしょ。
ひな型となるものを作っておいてコピーするとか。
そもそもMDBは、それに接続してDB作成とかいう概念がないはず。

DB が SQL Server であれば、作成は可能だが。
http://support.microsoft.com/kb/305079/ja
0152NAME IS NULL
垢版 |
2009/04/10(金) 20:44:16ID:???
>>151
ADOX使えばできるだろうという話はまあ置いといて

ファイル操作がADO.NETの範囲外なのは当然なんだよ
ただ、MDBの新規作成は、元来はファイル操作じゃなくてDBMS操作だろう、ってことだ
>>150は、DBMS操作は(たとえSQL発行で実現できたとしても)ADO.NETの範囲外だろう、と主張してる
0153NAME IS NULL
垢版 |
2009/04/11(土) 14:11:27ID:???
俺なりのjava(JDBC)と.NET(ADO.NET)の比較
・接続方式のプログラミングは、概念は同じ。
 DBに接続して、SELECTして・・・
・非接続方式はADO.NETだけ
 格納用に配列を準備してそれに代入して・・・という処理を
 書かなくて済む分、DataTableは便利。
・ADO.NETは選択肢が無い
 O/Rマッピングあたりになると、javaは選択肢がたくさんあるが、
 .NETだと、LINQしかない。
 これはプロジェクトの上でメリットにもデメリットにもなりうる。
0154NAME IS NULL
垢版 |
2009/04/11(土) 14:31:19ID:???
他と比較しながら、ADO.NETについて見てみるのもいいかも。

PHPでのDB接続の場合は、取得結果を連想配列に格納となっているようだ。
ただし、接続先のDBが限定されてるようだけど。
ADO.NETのDataTableは連想配列ではなかったり、それに簡単に格納出来なかったり
する部分が不便だけど、PHPみたいに接続DBの種類を限定はしていないところは
良いところだな。

mysql_fetch_array
http://bg.pi-ppi.com/page/n01/000152.html
0155NAME IS NULL
垢版 |
2009/04/11(土) 15:51:23ID:???
>>153
.netもnhibernateとかs2dao.netとかあるだろ
javaの移植だけど
0158NAME IS NULL
垢版 |
2009/04/11(土) 21:27:38ID:???
俺も知らなかったけど知っていたフリをする。
0159NAME IS NULL
垢版 |
2009/04/12(日) 13:36:26ID:UP5C1RP7
ibatis も忘れんでくれーーー
#まだ使ったこt無いんだが
0160NAME IS NULL
垢版 |
2009/04/12(日) 16:39:24ID:UP5C1RP7
>>154
DBI::DBDだとみんな、連想配列だと思うのだが
0161NAME IS NULL
垢版 |
2009/04/13(月) 07:36:37ID:???
ちょっと念のために一つ確認。
現状では、ADO.NETでDB接続し、テーブルデータ取得時に、
一発で連想配列に格納する事って出来ないよね?
DataTableは連想配列じゃないし。
0162NAME IS NULL
垢版 |
2009/04/13(月) 11:20:08ID:???
連想配列のように扱うこともできると思うけど、それじゃいかんの?
0163NAME IS NULL
垢版 |
2009/04/14(火) 14:37:12ID:???
DB接続に関するモジュールが提供する機能となると、このくらいで終わり
なのかなぁ?複数テーブルをJOINした場合の更新のサポートとか、
ちょっと複雑なクエリを使って集計する必要がある場合、簡単に
抽出が出来るとかそういうのがあってもよさそうに思うんだけど。
0164NAME IS NULL
垢版 |
2009/04/14(火) 15:34:17ID:BZsP47Lx
>>複数テーブルをJOINした場合の更新のサポート
複数テーブルのテーブルロックになっていいの?
#行ロックじゃなくって

>>ちょっと複雑なクエリを使って集計する必要がある場合
複雑なクエリで集計->複雑な条件で抽出&集計 になると思うのだが?
0165NAME IS NULL
垢版 |
2009/04/14(火) 16:32:38ID:???
複数テーブルの更新も簡単な抽出もできるよ
0166NAME IS NULL
垢版 |
2009/04/15(水) 21:19:49ID:???
>>165
SQL文を工夫する以外の方法である?
0167NAME IS NULL
垢版 |
2009/04/23(木) 18:02:43ID:???
なんか、急に書き込みがなくなったな・・・w
0168NAME IS NULL
垢版 |
2009/04/24(金) 02:27:01ID:???
大量データのINSERTについて質問なんですが、10万件のデータをなるべく早く生成したく、下記のようなコードで実行してみましたが
想像を超えるほどに遅くかなり間がかかってしまいます。

DbProviderFactory objProviderFactory = DbProviderFactories.GetFactory("System.Data.SqlClient");

using (DbConnection objConnection = objProviderFactory.CreateConnection())
{
 objConnection.ConnectionString = "Data Source=localhost;Initial Catalog=testdb;Integrated Security=SSPI";
 objConnection.Open();

 using (DbTransaction objTransaction = objConnection.BeginTransaction())
 {
  for (int i = 0; i < 100000; i++)
  {
   using (DbCommand objCommand = objProviderFactory.CreateCommand())
   {
    objCommand.Transaction = objTransaction;
    objCommand.Connection = objConnection;

    objCommand.CommandText = "INSERT INTO testtable (filename) VALUES(@val);";

    DbParameter param1 = objCommand.CreateParameter();
    param1.ParameterName = "@val";
    param1.DbType = System.Data.DbType.String;
    param1.Value = System.IO.Path.GetRandomFileName();

    objCommand.Parameters.Add(param1);

    objCommand.ExecuteNonQuery();
   }
  }
  objTransaction.Commit();
 }
}

なんとなく、Transactionの使い方を間違えてる気がするのですが。
開発は.NET 3.5 & SQL Server 2008 Expressで行っています。
0169NAME IS NULL
垢版 |
2009/04/24(金) 03:12:39ID:???
10万回もCreateCommandして
10万回もパラメータ生成してりゃ遅くもなるわな
0173NAME IS NULL
垢版 |
2009/04/24(金) 08:54:54ID:???
そうはおもえないな
0174NAME IS NULL
垢版 |
2009/04/24(金) 12:08:16ID:???
そうともいえないんじゃない?
0175NAME IS NULL
垢版 |
2009/04/24(金) 18:20:53ID:???
で、つまりどうしろと?
0176NAME IS NULL
垢版 |
2009/04/24(金) 18:40:21ID:???
>>175
CreateCommandとパラメータ生成をforの外にだせ
つか、本気で言われないとわからないならプログラマ向いてないぞ

まあ、それでも遅いってなら、バルクインサート検討しないと無理かも知れん
0177NAME IS NULL
垢版 |
2009/04/24(金) 21:55:12ID:???
>>176
まじで?じゃあコード書いてみなよ
できるもんならね!

                    ふふん

      / ̄ ̄ ヽ,          / ̄ ̄ ヽ,           / ̄ ̄ ヽ,
    /        ',       /        ',        /        ',
    {0}  /¨`ヽ {0}       {0}  /¨`ヽ {0}       {0}  /¨`ヽ {0}
    l   トェェェイ  ',       l   トェェェイ  ',       l   トェェェイ  ',
    ノ   `ー'′  ',       ノ   `ー'′  ',       ノ   `ー'′  ',
   /,, -ー 、  , -‐ 、    /,, -ー 、  , -‐ 、    /,, -ー 、  , -‐ 、
  (   , -‐ '"        (   , -‐ '"        (   , -‐ '"     )))
   `;ー" ` ー- -ー;'"    `;ー" ` ー- -ー;'"    `;ー" ` ー- -ー;'"
   l          l      l          l     l          l
0178NAME IS NULL
垢版 |
2009/04/25(土) 06:43:46ID:???
なんかくだらん煽りがおおいのは新年度だからか?

>>176 実験した VS2008+SQL2000
ベンチの公開は禁止されてたような気がするので具体的な数字は伏せる
処理時間で96%ぐらいになった。つまり4%ぐらい高速化された

思ったより差が出なかった

>>168は想像以上に遅かったといっているが、
俺の想像以上に早かったw

パラメタにサイズ設定して、objCommand.Prepare追加したらさらに数%早くはなったが
10秒程度のオーダーで数%だから、誤差に近いかもしれんな
0179NAME IS NULL
垢版 |
2009/04/25(土) 14:13:50ID:???
偉そうに間違えるのってかっこいいね。 あこがれる。
0180NAME IS NULL
垢版 |
2009/04/25(土) 16:41:55ID:???
もっと速くってことなら
せっかく2008使ってるんだし
ストアドとSQL CLR使ってみれば?
かなり速くなると思うけど
0181178
垢版 |
2009/04/25(土) 17:26:46ID:???
俺は168じゃないぞ。念のため

>>179
少なくとも確実に数%早くなってるぞ。間違ってるとはいえない
つか役に立たんレスとか煽りとかいらない

>>180
10万回CreateCommandした場合とPrepareした場合とで数%の違いなんで、
ストアドにしても大差はないと予想した。SQLの解析時間は数%ってことだから
処理時間のほとんどはinsert文の実行時間なんじゃないかな
うちの環境ではSQL CLRは試せないが、バルクでインサートしないと
結果は大差ないと予想。だれかモノ好きが実験してくれw
まあ、ADO.NETは結構速いと俺は思ったぞ。SQL Serverに限ればかも知れんが
0182NAME IS NULL
垢版 |
2009/04/25(土) 17:27:01ID:???
>>180
ストアドとはストアードプロシージャーのことでしょうか?
あまりよくわからないので、多少は使い慣れたC#から、とおもったのですが。

お騒がせしましたが、たかが10万件ですし、手入力で解決しました。
0183NAME IS NULL
垢版 |
2009/04/25(土) 17:29:43ID:???
>>181
つか役に立たんレスとか煽りとかいらないからまじで
0184NAME IS NULL
垢版 |
2009/05/11(月) 15:01:19ID:???
保守しておきます。
0187NAME IS NULL
垢版 |
2009/05/16(土) 00:18:47ID:???
質問です。
表示専用にしたDataGridViewに表示中のDataTableに対して行を追加するのに、BindingSource.AddNew()とEndEdit()で
追加して、ソートしてあると追加行は自動的にしかるべき位置に並べ替えられますが、
その後、追加した行が選択されず、その1行下が選択されてしまいます。
ちなみに、最下行に新規行が追加されるときだけは新規行が選択されます。
BindingSource.Position自体が1行下を指す値になっていました。
PositionChangedイベントを見てみると、EndEdit()後に一度Positionが
新規行の値になり、直後に1行下に変わって、都合イベントが2回起こります。
DataTableを型指定しない最小限のもので試したり、DataGridやDataViewを
使っても同じ現象が出ます。どうも、CurrencyManagerからして
そのような動きをしているようです。
選択行が追加前と変化しないとかならともかく、微妙に1行ずれとかだと
困ってしまいます。なんとかならんでしょうか。
0188NAME IS NULL
垢版 |
2009/05/16(土) 17:28:43ID:???
>>187
俺はこれまで、そういった問題に直面したことはないが、
そこまで解決がうまく出来ない場合は、追加する前にあらかじめ
主キーとなるデータをローカル変数に保存しておいて、
あとで選択し直すという方法をとってみたらどうかなと
思うが、そのあたりは試してみたのかな?
0189NAME IS NULL
垢版 |
2009/05/28(木) 08:28:16ID:9j4YcJly

データセットのデザイナ、便利で助かっているのですが、
実際のテーブルの定義を変更した時にどうやってデータセットのほうに
反映させればいいのかわかりません。

テーブルの列の追加や削除、NOT NULL の変更などが発生した際
皆さんはどのように対応していますか?
0190NAME IS NULL
垢版 |
2009/05/28(木) 11:21:50ID:gxKAwuxS
>>189
データセット作り直すしかないんじゃないかと>定義ファイル作って差替え
#それが嫌で使ってない
0191NAME IS NULL
垢版 |
2009/05/28(木) 14:31:29ID:???
型指定されたデータセットって半分使い捨ての気分で
使わないとイライラとすることが多いように思う。
コーディングが楽になるとか、いくつかメリットはあるけれど。
だから、かなり単純なテーブルのデータを読み込む場合など
の時にしか使わないな。俺は。
0192NAME IS NULL
垢版 |
2009/05/29(金) 12:07:49ID:j7MbTSD8
>>189
たとえばテーブルに新たに列を追加した場合、
TableAdapter構成ウィザードのクエリビルダで
追加した列を選択して再構成すれば大丈夫みたい。
0193NAME IS NULL
垢版 |
2009/05/29(金) 23:56:43ID:UxJIKZRF
>>182
ストアド苦手っていうプログラマでろくなヤツ見たことないな。
そういうやつに限ってメンテしづらいし、
後々、致命的な性能問題起こすプログラム書きやがる。
0194NAME IS NULL
垢版 |
2009/05/30(土) 08:53:43ID:evhQeNCf
>>29
超亀だけど、あの本読まずに何を読む って気がするんだけど
VB+C#対応だから、お買い得だと思う
0195NAME IS NULL
垢版 |
2009/06/02(火) 09:14:47ID:???
M$の言語を使おうというのならば、公式図書とMSDNはおさえとかないと
いけない。その道を通らずに習得するのは無理でしょ。
最初からコーダー目指すのならば、「ここはこう書くんだ」みたいな
形式の適当な研修を受けるだけで十分かもしれないが。
0196NAME IS NULL
垢版 |
2009/06/04(木) 06:59:44ID:w05KK/Vp
>>193
まぁ まともなSQLかける奴も少ないけど
#最近 少しはましになったw
0197NAME IS NULL
垢版 |
2009/06/06(土) 15:26:45ID:???
LINQとか、型指定されたDataSetとか、CommandBuilderとか、
SQL文を自分で細かくかかなくても自動生成されるよっていう
のがあるけれど、俺はやはりSQL文を自分で書くスタイルの方が
いいな。このほうがパフォーマンスが大きく変わるわけでも
ないけれど、他の言語(javaやPHPなどADO.NETを使わない場合)
での開発も視野に入れると、ある程度似たようなコーディング
スタイルの方がいいと思うから。
0198NAME IS NULL
垢版 |
2009/06/08(月) 10:44:11ID:???
プログラミングMicrosoft ADO.NET2.0 は
MSDNライブラリの内容を書籍にしたような感じだから
紙じゃなくてもいいのなら MSDN ライブラリで十分かもしれん。

MSDNライブラリよりは解説が多い分わかりやすいかもしれんが。
0199NAME IS NULL
垢版 |
2009/06/10(水) 13:28:53ID:4wnEGzyk
リファレンス部はそうだけど、それ以外の部分は
MSDNライブラリを探しながら体系的に見ていく事が
初心者にできるか って事だと思うが
#最低限の知識がないまま、いきなりMSDNライブラリを読む
#というのは、自分的には時間がもったいないと思う
0200NAME IS NULL
垢版 |
2009/06/10(水) 20:06:05ID:???
ReportViewerコントロール用のレポートファイル( .rdlc )のデザイナでの作成方法について色々解説してあるページとか参考書ってないでしょうか。

レポートウィザードで作れるピボットテーブルをベースに色々と追加したい要素があるんですが、どうやりゃ良いのかいまいちわからない。
一応、やりたいことは今年度のピボットテーブルに前年度の合計とか、前年度比とかの行とか列を追加することです。
0201NAME IS NULL
垢版 |
2009/06/13(土) 14:01:36ID:???
MSDNだけで十分といえるには、それなりの前提知識がある場合の話でしょ。
例えば、VB5の開発経験がある人だとVB6の習得にかかる時間は・・・みたいな。
それだけの知識が無い場合は、技術評論社などの一般向け書籍を読み、
ADO.NETの公式文書を読み、MSDNという順序しかないと思う。
0202NAME IS NULL
垢版 |
2009/06/13(土) 14:05:15ID:???
>>200
プログラマー板のVB.NETスレなどに行って相談してみると
いいかもしれない。
ここがスレ違いというわけではないが、情報量が違うから
0203NAME IS NULL
垢版 |
2009/06/13(土) 18:18:33ID:???
>>202
そうですか。
とりあえずVB.NETの質問スレに行ってみます。
0204NAME IS NULL
垢版 |
2009/06/15(月) 09:11:39ID:???
マ板じゃなくて、ム板だったな。。。
すまん
0205NAME IS NULL
垢版 |
2009/06/16(火) 19:19:15ID:???
>>200
レポートデザイナ?でいろいろやるより
出来上がりの形までのストアドを作ったほうが楽かもね
0206NAME IS NULL
垢版 |
2009/06/16(火) 22:52:28ID:???
まぁ確かにそんな気がする。
ただ、前年比みたいなのを混ぜると通貨型と浮動小数点型が混在しちゃうんでどうにかならんかなとか思ったり。
まぁどっちも文字列型に変換してしまうのが手っ取り早いかな。
0207NAME IS NULL
垢版 |
2009/06/30(火) 04:51:55ID:???
すみません、質問いいですか?

ADO.NETはおろかDB初心者です。

現在SQLServer(2005EE)のデータをC#(VS2008PE)にて操作しようと考えています。

SQLServerからアダプター経由でDatasetに読み込み
DataRows.add(hoge)
adapter.update
で追加更新までは出来るようになりました。

ですが、レコードの削除やセル単位の変更のデータベースへの更新が全く判りません。。。

エスパー様、どうか宜しくお願いいたします。
0208 [―{}@{}@{}-] NAME IS NULL
垢版 |
2009/06/30(火) 09:18:19ID:???
>>207
DataRow自体の中身を変更したり削除して
Updateを呼べば普通は何も考えなくても裏でやってくれる
0209NAME IS NULL
垢版 |
2009/06/30(火) 12:09:25ID:???
>>208
それが出来ないんですよ・・・・・

Datasetやアダプターになにか設定が必要なのでしょうか?
追加更新はUPDATEであっけなく出来たのですが・・・
わたし勘違いしてますかね?
Datasetの中のDataRowを削除、変更してUPDATEしようとしているのですが・・・
0210 [―{}@{}@{}-] NAME IS NULL
垢版 |
2009/06/30(火) 12:37:24ID:???
>>209
対象のDataRowのstateが変わってないとか?
そうであれば、処理の仕方が間違っているんでしょう。
adapter.update前の中身を確認して見ては?
0211NAME IS NULL
垢版 |
2009/06/30(火) 12:54:55ID:???
>>210
極意の本に載ってた方法でそれもやりましたが
だめでした・・・・。

なにか根本的におかしい事をやっている気がします。

どこか参考になるサイトをご存じないでしょうか?
0213NAME IS NULL
垢版 |
2009/06/30(火) 13:01:37ID:???
>>212
ありがとうございます。

今日の夜でもいいですか?

よろしくお願いいたします。
0214213
垢版 |
2009/06/30(火) 19:10:57ID:wdq85xWU
private void button1_Click(object sender , EventArgs e)
{
DataRow ddd =this.hOGEDataSet1.Tables[0].NewRow();
ddd["NCHAR10"]= "ssssss";
ddd["INT"] = 55;
this.hOGEDataSet1.Tables[0].Rows.Add(ddd);
this.tESTTableAdapter.Update(this.hOGEDataSet1.TEST);
}

private void button2_Click(object sender , EventArgs e)
{
DataRow ddd = this.hOGEDataSet1.Tables[0].Rows[this.hOGEDataSet1.Tables[0].Rows.Count - 1];
this.hOGEDataSet1.Tables[0].Rows.Remove(ddd);
this.tESTTableAdapter.Update(this.hOGEDataSet1.TEST);
}

private void button3_Click(object sender , EventArgs e)
{
this.hOGEDataSet1.Tables[0].Rows[6]["NCHAR10"] = "huga";
this.tESTTableAdapter.Update(this.hOGEDataSet1.TEST);
}


ボタン1⇒成功
ボタン2,3⇒失敗
となります。

宜しくお願いします
0215213
垢版 |
2009/06/30(火) 19:12:42ID:wdq85xWU
更新には、変更された行を含む DataRow コレクションが渡されたとき、有効な UpdateCommand が必要です。

例外内容です。
0216 [―{}@{}@{}-] NAME IS NULL
垢版 |
2009/07/01(水) 09:04:41ID:???
>>215
TableAdapterのUpdateCommandが設定されていないか
そこに設定されているSQLがおかしいって事でしょ
DeleteCommandの方も同様
0217NAME IS NULL
垢版 |
2009/07/01(水) 10:30:13ID:???
>>216
おはようございます。

>TableAdapterのUpdateCommandが設定

すみませんが、デザイナ上で行う方法を教えては頂けないでしょうか?
私なりに例外メッセージ等で調べたのですが、全然判りません・・・

よろしくお願い致します。
0218NAME IS NULL
垢版 |
2009/07/03(金) 20:00:18ID:???
>>217
じゃ、プロジェクトファイルをうpってみたらどうかな?
デザイナ上ではすべてが出来るわけでもないしさ
0219NAME IS NULL
垢版 |
2009/07/04(土) 11:30:48ID:???
「ADO.NETはおろかDB初心者です」っていうのならば、
こういうことをやる前に、SQL文について勉強して
おいた方がいいと思う。
SQLがある程度書けるくらいになっておかないと、
概念の理解まで至らないし、これから先もあらゆる
ことでつまづきまくると思う。
0220NAME IS NULL
垢版 |
2009/07/21(火) 13:44:37ID:???
新しいクラスが出てくると、便利な反面、そのルールや使い方を覚えて
習得しなければならないのが欠点だな。
ADO.NETの場合、欠点のみが表に出ている感がするのだが・・・
0221NAME IS NULL
垢版 |
2009/07/22(水) 08:13:16ID:???
次バージョンに期待だなw
0222NAME IS NULL
垢版 |
2009/07/24(金) 11:44:07ID:dt3OdEIg
質問です
SqlServer2005+DataSet&TableAdapterで、主キーが設定された行の交換をしたいのですが

dataSet1.EnforceConstraints = false;
DataRow row1 = dataSet1.Table1.Rows[0];
DataRow row2 = dataSet1.Table1.Rows[1];
row1["seq"]=1;
row2["seq"]=0;
dataSet1.EnforceConstraints = true;
Table1TableAdapter.Update(dataSet1.Table1); ←ここで一意違反

Table1にはID+seqの複合主キーが設定してあります
デバッガでRowsの中身を確認してみましたが、キーの重複はありませんでした
それなのに何故一意違反が出るのか不思議です
Table1.Copy()で一旦退避して書き換え、Rows.Clear()→Rows.Add()してもやはりエラーが出てしまいます
一体何が原因なのでしょうか?
0223NAME IS NULL
垢版 |
2009/07/24(金) 18:30:56ID:???
TableAdapterが使ってるSQLを確認してみれば?
基本的には1行ずつupdateのSQL投げるはずだから、
Rows[0]のupdate文実行しようとしてRows[1]の元データとダブってるんじゃね

0224NAME IS NULL
垢版 |
2009/07/24(金) 20:49:19ID:???
そもそも主キーカラムに更新なんてかけるもんじゃない。
del/insにするか主キー「以外」のカラムを入れ替えるか。
0225NAME IS NULL
垢版 |
2009/07/25(土) 11:14:02ID:ntHeY4dE
テーブル内のデータをDELETEで削除したあと、新しいデータをINSTALLで入れるプログラムを
書いたんだけど1万近いデータをforで回しながら入れていくとめちゃ時間かかります
なにか高速化する方法はないでしょうか?
0226NAME IS NULL
垢版 |
2009/07/25(土) 11:29:02ID:???
俺も「主キーを更新する」という設計の方に問題があるように思うな。
そのフィールドを入替えする必要性があるのであれば、それとは
別に主キーフィールドを準備するべきだ。
0227NAME IS NULL
垢版 |
2009/07/25(土) 11:30:53ID:???
>>225
いちいちINSTALLしてるから時間がかかるんじゃないの?
0228NAME IS NULL
垢版 |
2009/07/25(土) 11:35:26ID:???
>>225
あなたの言う「めちゃ」の基準がどんなものなのかというものがあるし、
極端な話、コネクションのopen/closeをforの中に入れてしまっている
可能性などもあるので、具体的にどういうプログラムを書いているのか、
現状は何秒かかっているのか、何秒くらいにしたいのか、などを
書かないと話はすすまないんじゃないかな。
0229NAME IS NULL
垢版 |
2009/07/25(土) 12:56:30ID:???
1万件insertするとどうしてもそこそこ時間がかかる。
1000件ごとにコミット、とかで大幅に速くなる可能性はある。
あとはselect/insert1発で出来るような話ならそうするとか
0230NAME IS NULL
垢版 |
2009/07/25(土) 13:03:06ID:QzAHKE4L
データ入れるときの列の指定に列名を文字列で指定してるとか?
0231NAME IS NULL
垢版 |
2009/07/26(日) 02:30:21ID:???
わんくまの人でそのパフォーマンス調べてた人いたな。
1行ずつコミットと複数行コミットともひとつあったな。
レスを投稿する


ニューススポーツなんでも実況