ADO.NETの質問・雑談スレ2 (401レス)
1-

1 2009/02/08(日) 16:12:32 ID:???
ADO.NETに関する質問・雑談・評価 etc
何でもどうぞ。

前スレ
ADO.NETの質問・雑談スレ
2chスレ:db
2 [age] 2009/02/09(月) 20:25:16 ID:???
前スレの流れ
1.DataAdapterってReadOnlyにしか使えないね。
 ・自動生成のSQLはUpdateのコードは使えない。
 ・やはり、Updateは自分で生成した方が良い。
 ・サーバカーソルが無いしDataTableのDataRowの状態をみて自動生成のスタイルという結論に落ち着く。
2.DataSetって意味あるの?
 ・DataAdapterからDataTableに読み込んだ方が軽くて良い。
 ・GUIを中心としたスタイルならば、型指定されたDataSetもいいかもしれないが。
3.LINQ使えば無問題
 ・ADO.NETを使う必要はなくなるよ。
 ・いや、これは大幅な仕様変更が出てきそうだから当分はADO.NETじゃね?
4.DataReaderについて
 ・GUIよりもコードを書くスタイル、とにかく軽さを優先する、非接続の設計の場合はこれが一番。
 ・早くて軽いという設計だが、ADO房は無意味にこれを使いたがるから困りものだ。
3 2009/02/10(火) 10:04:22 ID:???
>>2
まとめ乙。

ところで、4番の非接続は接続の間違いじゃね?
4 [age] 2009/02/10(火) 20:27:31 ID:???
>>3
確かにそうだ。投下した後に気づいたが、無駄にスレを汚すので、
ま、いいやと思ってたw
5 [age] 2009/02/12(木) 07:29:56 ID:???
UPDATE のコードを自分で書くしかないという結論には同意だけど、
では、具体的にどんなコードを書いたら良いの?って感じの情報交換は
出来ないのかなぁ?(ADO.NET とはずれてくる話かもしれないが)
例えば、同時アクセスが少ない場合は WHERE 以下は主キーのみで良いとか、
もうちょっとシビアに考えるならば、タイムスタンプを使ったほうが良いとか、そういう
意見交換なんだけど。

スレの誘導でもかまわないので、どなたか意見お願いします。
6 [age] 2009/02/12(木) 21:47:30 ID:???
DataAdapterの機能はしょぼいとか使えないとか言われているけれど、
ライブラリの機能として提供できるものはこれくらいで終わりなのかな?

市販のでは、「複数のテーブルを参照する SQL によって取得したデータであっても
自動で更新するコードを生成する」ライブラリはあるようだが。
http://www.asterworld.com/ja/srcdoc/Asterworld.Data.AwDbExData.html

VB6までの時は、純粋にVBだけでの開発は効率が悪くて、別の会社が出してる
モジュールをあわせて購入するのが当たり前になってたけど、.NET の場合も
そんな感じに落ち着くのかな。
http://www.grapecity.com/japan/support/database/dotnet_productlist.htm
7 2009/02/13(金) 01:17:49 ID:???
>>5
SELECTで取得した対象に主キー揃って無いとダメとか制限あったような<自動生成
自分の場合は、WHERE以下は主キー+更新時刻で楽観ロックとすることが多い。

>>6
それなりのことは.NET内で出来てしまうから、
.サードパーティの製品が必要かどうかを考え直す癖がついたな。
Excelの出力とか、客の要求が細かいときのGrid周りとか、
そういうめんどくさいところは予算と期間と相談して決めてる。


8 2009/02/13(金) 08:11:48 ID:EjaPaESH(1/2)
更新時刻じゃ秒が重なったら終わりじゃん?
せっかくタイムスタンプがあるんだから
タイムスタンプ使った方がいいんじゃん?
9 2009/02/13(金) 11:04:03 ID:???
タイムスタンプを使ってないということは、Accessのmdbファイルに
限った話なのかな?
10 2009/02/13(金) 11:10:20 ID:???
俺の場合、UPDATEはシビアに同時実行制御をする必要がないため、
(比較的規模の小さな、数人使用のシステムの場合が多い為)
WHEREは主キーを指定するのみで、強制上書き方式でやってる。

強制上書きというのは、「読み込み時」と「データ更新直前」の
データが同じであるかをチェックせずに、主キーを指定して
UPDATEを実行という意味合い。
すでに誰かがレコードを削除していて・・・という場合はエラーが
出るが、そのあたりの処理は書く必要もないかなと思う感じ。

「設計は場合による」といってしまえばそうだが、個人レベルの
開発だとこういうのが大多数じゃないかなと思うけど、どうかな。
11 2009/02/13(金) 13:04:13 ID:???
TIMESTAMPも使うけど、数人〜の小規模で
業務内容的に被らない想定のときは
更新日時の列作って使いまわしてしまう。

同じ業務の人が何人も居て被るかもーとなったらTIMESTAMP、
衝突上等となったら…行ロックするか、一次的な編集禁止フラグでも立てるか。
12 2009/02/13(金) 20:14:08 ID:EjaPaESH(2/2)
>>10
消えてもいいデータがあるってのならいいけど
timestamp列をつくって主キーと一緒にチェックするだけで
楽観ロックできるんだからやったほうがいいと思うけどなぁ。
13 [age] 2009/02/13(金) 23:59:49 ID:???
>>12
データを更新する際、主キーは同じだけどtimestampが異なってるという時の
処理は具体的にどうするのって思ってしまうんだよね。
ユーザに(「このデータは誰かが更新中です。上書きしますか?」みたいな)
ダイアログを表示させても、ユーザは結局はそのダイアログだけでは上書きしても
良いかどうかの判断は出来ないしね。
適当に「はい」を押してしまえってなって、その機能を実装した意味が実質
なかったりするって体験があったんだけど、どうよ?

これは、たまたま俺が悪いユーザにあたっただけかな?
14 [age] 2009/02/14(土) 00:08:41 ID:???
どういうアプリであるかによって、処理内容がという場合もあると思うので、
具体例を一応書いておきます。

名簿の管理ソフト
すでに登録しているAさんのデータを修正し、「更新」ボタンを押した。
その時、「すでに他の人が・・・」というメッセージが表示された。
その時点では、他の人が修正したデータの内容は確認出来ない。
また、念のためと思って更新しないで、データを確認してみると、
間違ったデータであり、自分は再度同じデータを入力する羽目に
なってしまった。ああ、面倒だ・・・みたいな。
15 2009/02/14(土) 00:54:50 ID:???
基本はエラーメッセージを出して入力し直しだろうな
間違ったデータを入れるとかかなりレアなケースだろうし、
99%くらいは、あ、オレの代わりに誰か入れといてくれたか
くらいですむんじゃね?
こんなん絶対ゆるさーん、とかいうユーザは
しょうがないからフラグでもたててロックかけるしかないんじゃね?
16 2009/02/14(土) 19:41:36 ID:???
基本は読み直して再入力でしょう
楽観的ロックすらしないでおくと
先に編集したのが無効になっちゃうわけだから

オフコン使ってた時はそんなの関係ねーでやってたみたいだけどね
富士通cobolだったかな

あとはロックとかフラグたてるけどあとから来たほうが所有権
ぶんどれるような仕掛けにするとか

17 2009/02/15(日) 12:22:31 ID:???
>>13
既に書かれてるけど、結論はケースバイケース。

・エラーメッセージを出して更新処理を中断し、再度データ確認後に必要なら再入力。
・そんなの関係ねぇで、更新する。

俺がいつもやるのは下記の通り。

主キーとタイムスタンプでチェックし、タイムスタンプが異なっていた場合、
・エラーメッセージを表示
・更新画面でユーザが入力した値は残しつつ、現在のデータを並列表示させる。
 (別画面とか入力項目の上とか画面上または下とか場合によって表示場所は事なるが・・・)
・ユーザは現在の内容を確認し、変更の必要がなければ処理を中止
・変更が必要な場合は再度入力値を確認、修正の後に更新を行う事ができる。
18 [age] 2009/02/15(日) 17:16:16 ID:???
ケースごとに分けてWHERE以下などをどう書いていったらよいのかをまとめるといいかもね。
ケースバイケースという結論になるのも分かるけれど、どういう処理をした方が良いかは
ADO.NETは提供しない(当然だが)のだから、そのあたりのノウハウをまとめるのは必要だと思う。

0.スタンドアロン
・UPDATE時は主キーのみでおk
・将来の拡張を考えるならば、1を参考にコーディングしておくと良い。

1.小規模、同時アクセスが少ないケース
・UPDATE時のWHERE 以下は主キーとタイムスタンプで確認
・ダイアログを出して判断を促すなど。

2.同時アクセスが多く、先にデータを表示させた方が更新できるようにするケース
(列車の予約で、空席の状況を確認し、予約するなどのケース)

3.同時アクセスが多く、確実に更新処理を行いたいケース
(銀行で自分の口座から他銀行の口座へ振込みを行うなど)
19 [age] 2009/02/15(日) 23:36:07 ID:???
3においてはUPDATEの内容よりも、Transaction を設定するみたいな話だな。
「ケースに分けてWHERE以下」というよりも、「ケースに分けてUPDATEの方法を」だったな。訂正
20 2009/02/20(金) 19:02:54 ID:???
ADO.NETになっても結局SQL文を生成するスタイルはそんなに変わらないの?
21 2009/02/20(金) 19:40:24 ID:???
自動生成は使ったことないな
SQL Server2008だけどManagementStudioでクエリ手書きで書いて
パラメータ化してDataadapterかDatareaderにいれるケースが多い
伝票の登録とかもsqlcommandでパラメタ化した素のinsert文とか
排他制御はtimestamp使って楽観的ロックを自前で
複雑な処理はストアドにして結果をselectで返すようにして
DatasetにFillして処理
Access使ってた時はGUIのクエリデザイナで書いてたけど
慣れたら手書きのほうがやりやすいな
22 [age] 2009/02/20(金) 20:06:49 ID:???
ADO.NETは、SQLの自動生成機能を強化するかと思ってたが、そうでは無いみたい。
SQLは自分で書くスタイルを維持してて、それ以外の部分をウィザードやGUIで操作
出来るようにするモットーのようだ。(俺はウィザードやGUIはほとんど使わないけれどw)
今後は、SQLコードを書く際の支援(LINQ)をする方向に持っていくと見るといいのかな。
23 2009/02/20(金) 20:12:33 ID:p5QGPAc4(1)
>>22
LINQ使ったことないけど、見ただけだと、O/Rマッパーっぽい感じがしてるんだけど
#違うか
24 2009/02/20(金) 20:14:29 ID:???
なるほど
自動生成スゲー!ADO.NETスゲー!って思って手を出してみたんですが、
なんとなく扱いづらい気がして結局手で書いてる自分がいて「コレでいいのか?」と疑問に。
なかなかうまくいかないなあ。

意外に人がいてびっくり。
25 [age] 2009/02/20(金) 20:18:12 ID:???
>>23
LINQのモットーはこれじゃないの?
今までは、操作するデータが異なると、その処理を行うコードもそれにあわせて
書く必要があった。(例えば、配列の全データにアクセスするコードと、
DBからテーブルを読み込んで全データにアクセスするコードは異なる。)
そこが面倒なので、処理を行うコードを統一化しよう、という考え。
26 2009/02/20(金) 20:37:00 ID:???
linq to sql はそこそこ便利だったぞw
27 [age] 2009/02/20(金) 21:50:55 ID:???
>>26
便利かもしれないが、しばらくの間は、規格が変わったりしそうに思う。
なので俺は ADO.NET を使うように考えてるな。
28 [age] 2009/02/20(金) 22:34:52 ID:???
>>26
ADO.NET と関係しそうなところを中心にレビューよろw
29 2009/02/21(土) 15:07:14 ID:???
C#2008(.NET3.5)+Access(mdb)でADO.NETを勉強し始めたんだけど、usingのネストになってしまった。
ADOやらoo4oやらは弄ったことあるんだけどこれは・・・考え方がそもそも間違ってる?

//testtableから指定testidのレコードを持ってくる
using (OleDbConnection cnn = new OleDbConnection(connectionstring))
{
  string selectsql = "select * from testtable where testid = @testid ";
  
  using (OleDbCommand selectcmd = new OleDbCommand(selectsql, cnn))
  {
    selectcmd.Parameters.Add(new OleDbParameter("@testid", "1"));

    using (OleDbDataAdapter da = new OleDbDataAdapter(selectcmd))
    {
      DataSet ds = new DataSet();
      da.Fill(ds);



田舎なので本屋にプログラミング関係の本がない・・・
「プログラミングMicrosoft ADO.NET2.0」って良書ですか?
30 2009/02/21(土) 17:47:12 ID:???
>>29
Adapterと一緒にCommandもConnectionも生成して、
Adapterだけ解放すれば、Adapterと一緒に生成したObjectも解放される…のが理想なんだが
現実はそうならない。そのへんは色々問題があってなー

例)
DataSet ds = new DataSet();
using (SqlDataAdapter adp = new SqlDataAdapter("SELECT * FROM hoge", new SqlConnection(ConnectionString)))
{
adp.Fill(ds);
}
これで済ませたいところなんだけど…このとき生成されたCommandやConnectionは解放されない。まさに仕様という名のバグw

このへんからいくつか辿ってみるとちょっと良いことあるかもしれない。
http://www.ailight.jp/blog/mnow/archive/2006/05/28.aspx
31 2009/02/21(土) 23:16:30 ID:???
>>29
Connectionのusingだけで十分だ。
CommandやDataAdapterのインスタンスがDisposeされるまでに
時間がかかるが、そんなもん放っておけば良い。
重要なアンマネージリソースはConnectionにしかない。
32 29です 2009/02/21(土) 23:50:13 ID:???
Dispose基準は重要なリソースか・・・目からウンコがおちたようだ。
せっかくのGCを無駄にするところだったかな。
URLありがとう、じっくり読んでみます。
33 2009/02/23(月) 03:34:32 ID:kcpJjeEI(1)
accessのMDBファイルに、以下のように接続してSQLを発行してます。

using (OleDbConnection cn = new OleDbConnection(m_connectString))
{
try
{
cn.Open();
OleDbCommand com = new System.Data.OleDb.OleDbCommand("SELECT name FROM Aテーブル ORDER BY sort;", cn);
OleDbDataReader reader = com.ExecuteReader();
(データを取得する処理 省略)
}
catch (Exception e)
{
System.Diagnostics.Debug.WriteLine(e.Message);
}
finally
{
cn.Close();
}
}

このとき、SQLの対象のAテーブルにレコードがあれば問題なく動くんですが、
Aテーブルにレコードが1件もないとき、com.ExecuteReader()で例外が発生します。
例外の内容は
Message="1 つ以上の必要なパラメータの値が設定されていません。"
Source="Microsoft JET Database Engine"
ErrorCode=-2147217904
StackTraceはExecuteReader()の行です。

どうやったらレコードが1件もないときにExecuteReader()で例外を発生させないようにできるのでしょうか。

34 2009/02/23(月) 09:58:47 ID:wqMGnrpl(1)
>>(データを取得する処理 省略)
while で回してる?
35 2009/02/23(月) 20:30:44 ID:???
hasrowでチェックするとかしたら?

36 2009/02/23(月) 21:18:04 ID:???
クエリの中のどっかがプレースホルダとして認識されてんだろjk
テーブル名と列名全部ブラケットで括ってみ。

//CurrentRecordが無いところでFieldを参照しようとした場合はInvalidOperationExceptionになる。
//OleDbExectionにはならん。
37 2009/02/23(月) 21:31:53 ID:???
//同じコードで>>33試してみたが再現せんな…
38 2009/02/23(月) 22:10:44 ID:???
>com.ExecuteReader()で
catchで捕まえたからではなく、ステップ実行してそこで例外発生したって認識でOK?
フィールド名のtypoだったらレコードの有無に関わらず発生しそうなものだけど・・・。
同じく試してみたけど再現しないですね。
39 2009/02/23(月) 22:20:28 ID:???
if ( !com.Read() )
{
  // データないときの処理
}


…なんてやってるわけないよね。
40 2009/02/24(火) 08:55:02 ID:???
まさかとは思うが、レコードがないってのは
テーブルは存在してるんだよな?

41 2009/02/24(火) 19:24:19 ID:???
そこまで疑うのかよww
42 2009/02/25(水) 06:57:33 ID:???
>>33
どうやったらっていうか、普通レコードがなくても例外は発生しません

JETのSQLが間違ってる時のエラーメッセージはかなりいい加減だからなぁ
ほんとにExecuteReaderでエラーになってるなら、フィールド関係ないとは思うんだが、
実際に実行してるSQLは>>33とまったく同一?
JETはカラムかテーブル名が見つからないと、パラメータが足りないみたいなメッセージを出す時がある
だから>>36や>>40のような指摘があるわけなんだが...nameやsortが予約語だったりするのか?

あと可能性としてはMDBが壊れてる可能性もあるな
一度ACCESSで修復かけてみては?

43 2009/02/25(水) 11:43:53 ID:???
>>33
ソース見るに finally は try ブロック内で実行されると思ってない?
あくまで finally が実行されるタイミングはメソッド終了時。
using で宣言してるオブジェクトが解放されるタイミングもそう。

メソッドがこのソースで完結してるなら問題はでないと思うけど、
ほかにもいろいろ処理が含まれるなら思わぬ問題が出る可能性があるね。
using or try のネストはその辺理解して使わないと後でめんどいよ。

つーことでこのソースだけじゃ不具合原因はわからんと思う。
>>42 が言うように JET のエラーメッセージは当てにならんw
44 2009/02/25(水) 22:33:57 ID:???
Dim DS As New DataSet
Using db As New SqlConnection(db.ConnectionString)
Using ocmd As SqlCommand = db.CreateCommand
Using adp As New SqlDataAdapter(cmd)

cmd.CommandText = sql1
cmd.Parameters.Clear()
cmd.Parameters.AddWithValue("@01","01")
adp.Fill(DS)

If DS.Tables(0).Rows(0).Item(0).ToString <> "OK" Then
msg = DS.Tables(0).Rows(0).Item(0).ToString
Return -1
End If

Return 1

End Using
End Using
End Using

こんな感じでdataset使ってるんですがdatasetから値を取り出すのってこれがベストな
方法なの?
datareaderならgetstringとgetint32とかデータ型にあった方法あるけど

45 2009/02/26(木) 01:35:24 ID:???
>>44
単一の値を取ってくるなら、ExecuteScalarを利用すると良いよ。
あと、型があらかじめわかってるならToStringやCTypeよりDirectCastの方が良いな。
46 2009/02/26(木) 04:16:14 ID:???
>>45
揚げ足をとるみたいだが、それはDBから値をとるなら、だな
まあ、まずデータセット使う必要があるのかという話もあるんだがw

データセットから値を取り出すなら、って質問だし、
ここは型付きデータセット使えってのがMS的推奨回答じゃないかな

47 2009/02/26(木) 08:41:34 ID:???
だから2行目のキャスト。上で書いてるGet〜メソッドも型がわかってて使うわけだからさw

型付データセットを使わない場合であれば、どんな型で入ってくるかは
http://msdn.microsoft.com/ja-jp/library/cc716729.aspx
48 44 2009/02/26(木) 11:47:22 ID:???
型付データセットは手間かかりそうでなんかいやなんだよね^^
さくっとSQL書いて結果欲しい時にいちいちデザイナ?xml?とか

49 2009/02/26(木) 13:53:28 ID:???
さくっと結果がほしいだけならデータセット使う必要すらないだろう
DataReaderつかえよ。まさに>>45の指摘の通りだ。>>2のまとめも読んでみろ

データセットから値をとりだすのは、まあどんな方法も似たり寄ったりだろう
コードの書き方とかキャストのしかたとかに多少の差がでる程度かと


50 2009/02/27(金) 23:11:52 ID:???
データセットから取り出すコード、個人的にはあまり美しいコードとは思えないんだけど、
そうせざるを得ないんだよなあ・・・(´・ω・`)

51 [age] 2009/02/28(土) 07:26:54 ID:???
>>50
比較としてどんなコードが美しいのかを書いてくれた方が話も進むと思うんだが。
52 2009/02/28(土) 14:36:21 ID:???
>>51
イヤ直感的な意味であって「これがいい!」というのはないんだ、すまない。
53 2009/02/28(土) 22:06:39 ID:???
クラス?配列?作ってdatareaderでloopしていれていくより
datasetにfillして取り出す時に適当にcastする方が楽だんだよね〜
ちょっとした印刷なら全部tostringで済んじゃうし

54 2009/02/28(土) 22:18:44 ID:???
さくっと結果がほしいだけならDataSetにFillするのが楽だよな
55 [age] 2009/02/28(土) 22:35:46 ID:???
型指定されたDataSetであれば、クリスタルレポートを使わずとも、
ドラッグ&ドロップで帳票が作れるところまで機能があれば、
Access依存度も解消できるのになぁ。。。
なんか、DataSetにFillっていうのは、ちゅうぶらりんな気がする。
56 2009/02/28(土) 22:45:31 ID:???
そこで>>2の
2.DataSetって意味あるの?
 ・DataAdapterからDataTableに読み込んだ方が軽くて良い。
 ・GUIを中心としたスタイルならば、型指定されたDataSetもいいかもしれないが。

57 2009/03/01(日) 04:25:39 ID:???
型指定されたDataSetって何の事?
58 2009/03/01(日) 09:15:46 ID:???
>>57
参照されたし
http://msdn.microsoft.com/ja-jp/library/esbykkzb.aspx
http://www.atmarkit.co.jp/fdotnet/bookpreview/vs2005webapp_07/vs2005webapp_07_03.html

object型じゃなくて厳密に型が決まっているからコンパイル時にチェックができたりインテリセンスが効いたり
59 2009/03/01(日) 12:31:11 ID:???
>>33は結局何がどうなったんだろう
60 [age] 2009/03/01(日) 21:22:31 ID:???
>>57を読んで、ADO.NETが以前よりも浸透して、このような質問をする人が
出てくるようになったのかなと思った。
ちょっと前までは、MSDNや公式図書くらいしか情報源が無くて、それを
しっかりと読んだ人たちだけが書き込みしてたような感があったからなぁ。
61 2009/03/01(日) 23:12:28 ID:???
MSDNや公式図書をしっかり読まないような人がプログラムするには、
今の.NET環境は敷居が高すぎると思うんだが

62 2009/03/02(月) 00:06:03 ID:???
型指定されたDataSetって、SQL Server以外でも使えるの?
MySQL, Postgres, SQLiteとかで。
63 2009/03/02(月) 00:16:35 ID:???
つかえるよ
64 [age] 2009/03/02(月) 22:59:41 ID:???
>>61
そうなんだよな。だから、VBが誰でも組めるお手軽言語じゃなくなってしまった。
VB6は完全にサポート打ち切ってしまったしね。
それで、VB.NETの意義もちゅうぶらりんな感じになった。

代わりに、ADO.NETなどが非常に使い勝手の良い、便利な機能満載の
物であればいいのだが、実際は、他の言語でDB接続する場合と大きく変わらない。

言語仕様を大幅に変えてしまった上、過去のバージョンのサポート打ち切り、
開発ツールの販売ばかりを考えた方針にあきれてしまって、VBでの開発を
打ち切る方向にしたところ、結構あるんじゃないかな。
65 2009/03/03(火) 01:53:13 ID:???
>>64
正直、VB6なんてもう触りたくねー
Windows7でも動作することになったからまだ続くんだろうけど。

開発ツールの販売って、何か問題ある?
土方業務用なら、MSDNサブスクリプション1人1ライセンスで大体は事足りると思う。
まぁそれすらケチる会社もあるがw
66 2009/03/03(火) 21:16:08 ID:???
>>65
一人1ライセンスじゃねー
会社で1ライセンスじゃあああああああああああ

67 2009/03/04(水) 04:25:50 ID:???
DBを正規化してると、レコード追加時に文字列そのものじゃなくて親テーブルのID値を
INSERTしなくちゃいけない事が多いと思うんだけど、その辺のめんどくさい処理を
DataAdapterとかで上手く処理出来たりする?

親テーブルに未追加だったら追加して……、あたりの処理も含めて。
68 [age] 2009/03/04(水) 18:10:08 ID:???
>>67
残念だが、DataAdapterは、各種Commandオブジェクトに格納されている
SQL文を実行するくらいの機能しかもちあわせていない。
69 [age] 2009/03/04(水) 18:14:34 ID:???
ADO.NET の売りを見つけようとしても、あまり大したものは見つからなかったりする。
(同じようなものを0から作ろうとすると、非常に面倒なのは分かるが)
・各種DBに接続するためのコネクションなどが準備されている。
・DataTableがあるので、配列を準備してテーブルのデータを読み込んで処理する手間が省ける。
これぐらいかな。

>>67がいうような、DBで行うことの多い処理を自動でやってくれるような
クラスが準備されているのであれば、非常にいいんだろうけどな。
(処理速度が多少遅くなる分はいいとして。)
それが無いから、特に魅力を感じなかったりする。
70 [age] 2009/03/06(金) 08:03:04 ID:???
SQL Server があって、それに VB6 で ADO で接続しているシステムがある。
これに、ADO.NET で接続するプログラムを追加しても、問題ないとみていいのかな?
それとも、VB6 と VB.NET の混在は開発元がサポート範囲内では無いと
考えているので、あまり好ましくないとなるのかな?
71 2009/03/06(金) 08:10:38 ID:???
問題ない
72 2009/03/06(金) 22:02:55 ID:???
何が問題なのかわからない
73 2009/03/07(土) 03:33:25 ID:???
質問です。

フォームにテキストボックス2つとボタン1つを配置して
2つのテキストボックスにIDとパスワードを入れて
ボタンを押したらDBを見に行って、一致していたら別のフォームに遷移させる
というプログラムを以下のように記述したのですが、うまく遷移できません。
何がおかしいのでしょうか?
環境はVC++2005 EEと
SQLServer 2005 EE
です。

ちなみに、testTableのLoginID列とPassword列の値はともに Adminとしてあり、
データ型はnvarcharです。

テキストボックスにそれぞれAdminと入力してボタン押下しても遷移できず、
メッセージボックスが表示されてしまいます。。。

FrmTest^ frmtest = gcnew FrmTest();
SqlConnection^ conn;
conn = gcnew SqlConnection();
conn->ConnectionString =
"Data Source=xxx;" +
"Integrated Security=True;" +
"Initial Catalog=xxx;";

if(textBox1->Text != "" && textBox2->Text != "")
{
SqlCommand^ cmd = gcnew SqlCommand("SELECT * FROM dbo.testTable",conn);
SqlDataReader^ dr = cmd->ExecuteReader();

while(dr->Read())
{
if(dr["LoginID"] == textBox1->Text && dr["Password"] == textBox2->Text)
{
frmtest->ShowDialog();
}
else
{
MessageBox::Show("ユーザIDまたはパスワードが違います。");
}
}
74 [age] 2009/03/07(土) 09:19:04 ID:???
>>73
メッセージボックスが表示されるというのは、何のメッセージボックスなの?
システムエラーメッセージとか?
MessageBox::Show("ユーザIDまたはパスワードが違います。");
これのことだったら、必ず表示されると思うんだが。
75 2009/03/07(土) 09:45:01 ID:???
ありがとうございます。

MessageBox::Show("ユーザIDまたはパスワードが違います。");

これが表示されます。

if(dr["LoginID"] == textBox1->Text && dr["Password"] == textBox2->Text)
{
  frmtest->ShowDialog();
}

ここが実行されて欲しいんです。

ボタンを押したときにテキストボックスに入力したIDとパスワードがDBに登録されているデータと比較して一致していたら遷移する
というふうにしたいのです。

なぜ必ず偽になってしまうのか分かりません。
76 [age] 2009/03/07(土) 12:59:27 ID:???
>>75
ADO.NETの話じゃないぞ。
もう、プログラム辞めたら?
77 2009/03/07(土) 18:49:49 ID:???
ステップ実行してみろ
話はそれからだ
78 2009/03/07(土) 19:26:12 ID:???
C#使おうぜ
79 2009/03/08(日) 18:12:29 ID:???
デバッグ時くらい、そのエラーメッセージに
dr["LoginID"] textBox1->Text dr["Password"] textBox2->Textも混ぜとけば
80 [―{}@{}@{}-] 2009/03/09(月) 09:29:39 ID:???
全行検索して何したいやら・・・
81 2009/03/09(月) 20:40:39 ID:???
ユーザーが増えてきたら大変だなw
82 2009/03/10(火) 22:36:36 ID:???
パスワードを生で保存すんなよと・・・
83 2009/03/11(水) 00:45:52 ID:???
パスワードなんか生でいいよ、
パスワード忘れたから教えろとかうぜーんだよ
84 2009/03/11(水) 10:44:10 ID:???
パッと見でわかるようには保存しないかな。
復元可能な形にするかどうかは運用次第。
85 [age] 2009/03/14(土) 16:10:51 ID:???
連載:VB研公開ゼミ議事録
第7回 ADO.NET開発初心者の疑問、解決します!
http://www.atmarkit.co.jp/fdotnet/vblab/opensemi_07/opensemi_07_01.html

@ITの記事もだいぶ増えてきたね。
内容としては、2ちゃんねるのスレで語られたことの要約だと感じる部分が多いがw
86 2009/03/14(土) 19:41:11 ID:???
>>85
なんか初心者向け?っぽいね
パネラーは熟練者なんだろうけど

87 [age] 2009/03/15(日) 16:09:16 ID:???
メリットとしては、いろいろなDBへの接続クラスが準備されていることと、
非接続型への対応ということだが、それ以外に語っていないということは、
特に目立ったメリットがないということなんだなw

つまり、大きなメリットはないが、状況的に変えなければならないので、
我慢をして受け入れなさい、とw
こういうところで、VBの言語仕様が複雑になったことをフォローできる
くらい大きな便利機能があるべきだと思うのだが。
88 2009/03/16(月) 07:19:03 ID:???
>>87
> メリットとしては、いろいろなDBへの接続クラスが準備されていることと、

これ全然メリットじゃないよね
よし、今日はオラクルでいっとくか
雨の日はMS SQLにしとくか
週末はDB2だな。アゥ

89 2009/03/18(水) 14:49:44 ID:???
http://blogs.msdn.com/nakama/archive/2008/10/16/ado.aspx

何も考えずにサーバカーソル使われることが無くなったのが
一番のメリットかもしれん。
90 2009/03/22(日) 10:26:54 ID:s8j4mKbf(1)
datatable.load(sqldatareader) が使えるのは、すげー楽なんだが
#と普段VB6が多いので、特にそう思う

>>88
オレもそう思う

>>89
countとるのめんどいからいや
91 2009/03/23(月) 23:10:33 ID:???
バーサーカーソウルに見えた
92 2009/03/31(火) 02:02:31 ID:???
非接続型について質問なのですが、
エントリ系のプログラムで、伝票Noを叩いた時には、Datasetで取得して、非連結フィールド・datagridviewへセットして見せてます。
ここまでは良いと思っていますが、その後にDataを修正・実行ボタン等でsqlserverへ更新しに行く時に、非接続でのUpdateを使わずに、接続型で更新しに行ってます。
例えばDataがdatagridviewにセットされている場合は、レコード数分loopしてUpdateしてます。
というのも、Transaction内での非接続による処理がネットを検索してもあまり出て来ず、Taransaction使うなら接続型っていう頭になっちゃってます。
なので、FormにData引っ張ってくる時は非接続型、sqlserverへ追加・更新次時は接続型でいつもやっているのですが。。
これってイレギュラーですか?

93 2009/03/31(火) 07:38:10 ID:???
別にいいんじゃね
94 2009/03/31(火) 12:01:31 ID:???
もう一点。

1Transaction内で、接続型・非接続型の両方を使いたいと思ったりするのは私だけでしょうか。
現実的には接続型で接続中に非接続型を利用・・・・もしくはその反対(もちろん1Transaction内)

これって?
95 [―{}@{}@{}-] 2009/03/31(火) 12:17:50 ID:???
>>94
System.Transactionsでも使えばどうよ
96 2009/03/31(火) 18:03:26 ID:???
>>95
ありがとう。
System.Transactions見てみたけど、敷居高そうな希ガス。
97 2009/04/01(水) 01:39:46 ID:???
sql server相手なら余裕
98 2009/04/01(水) 05:55:40 ID:???
つか、DBを更新に行ってるなら、その間は接続してるだろう
接続型とか非接続型とか分けて考えるのがおかしくないか?

接続型、非接続型と、連結、非連結の区別がついてないんじゃないか?

99 2009/04/01(水) 10:43:14 ID:???
>>98
>接続型とか非接続型とか分けて考えるのがおかしくないか?

分けて考えるのは当然と思っていますが。
まったく動作が異なるので。
もちろんDB更新時には接続型・非接続型関係なく接続しないと更新できない訳で。。
それを承知で、1Transaction内で接続型・非接続型の両方を使うということについて
意見を聞いていたのですが。。
100 2009/04/01(水) 10:44:15 ID:???
連投すまん。

>>97
>sql server相手なら余裕
そうなの?

1-
あと 301 レスあります
スレ情報 赤レス抽出 画像レス抽出 歴の未読スレ AAサムネイル

ぬこの手 ぬこTOP 0.368s*