ネットワーク上のSQLServer2000のデータベースを参照更新をするプログラムの質問です

Public DBcn As SqlClient.SqlConnection
Public SQLcmd As SqlClient.SqlCommand
(関数1)
Dim dr As SqlClient.SqlDataReader
関2
SQLcmd.CommandText = ”select 略”
dr = SQLcmd.ExecuteReader
dr.Read
関3
DBcn.Close

(関数2)
DBcn = New SqlClient.SqlConnection
SQLcmd = New SqlClient.SqlCommand
DBcn.ConnectionString = ”接続情報”
DBcn.Open
SQLcmd.Connection = DBcn

(関数3)
Dim dr As SqlClient.SqlDataReader
SQLcmd.CommandText = ”Insert 略”
dr = SQLcmd.ExecuteReader
dr.Read

①Open、Closeはselect,insertなどをするたびにopen,Closeをするべきですか?
②デバックで、関3のExecuteReader処理後、Readに進まずに関数を抜けてしまいます、なぜ><
 →SqlDataReaderは、グローバルにするべき?
③Updateしたいのですが、Select,Insertと同じようにやればできますか?
④SqlDataAdapter,Datasetはどんな時に使うのですか?

回答の条件
  • URL必須
  • 1人2回まで
  • 登録:2005/06/28 15:30:30
  • 終了:--

回答(2件)

id:Chaborin No.1

ちゃぼりん回答回数189ベストアンサー獲得回数72005/06/28 16:09:08

ポイント25pt

http://www.microsoft.com/japan/msdn/thisweek/catchupASP/catchupA...

エバンジェリスト チーム コラム:Multi Web UI アプリケーション開発への道 第 5 回 ADO.NET 概要

(1)いいえ。Connectionは、1本の処理内できるだけCloseせずに使うべきです。クエリとクエリの間で人間の操作などが入り、時間が経過する場合はCloseすべきです。


(2)普通に考えればこのコードで関数を抜けることはないので、別の理由があると思います。例えば、ON ERRORでエラートラップされていませんか?

(3)はい。正しくは、INSERT,DELETEと同じようにやればできます。SELECTはまた少し違います。

http://www.microsoft.com/japan/msdn/thisweek/meikaiADONET/meikai...

エバンジェリスト チーム コラム : DB 設計者のための明解 ADO.NET 第 1 回

(4)ExecuteReaderとの最大の違いは、接続型か非接続型かにつきます。つまり、DBMSと常にコネクションを貼らなくてもデータの取得・操作ができることが特長です。

id:haul

レスありがとうございます。

①、④はわかりました。②はエラートラップぽいのがあったので消したら飛ばなくなりましたが、

下記のような記述で、Selectで値が見つからないとエラーになってしまいます。

どういう風に対処すればよいのでしょうか?

SQLcmd.CommandText = ”select * from cstmMst where memberNum = ’” & GetMemberNum & ”’”

dr = SQLcmd.ExecuteReader()

dr.Read()

If dr.Item(”memberNum”) = Nothing Then

③なのですが調べた結果下記のような文になったのですがあってますか?

SQLcmd.CommandText = ”insert into CstmMst (memNum, amStrNum)”

SQLcmd.ExecuteNonQuery()

2005/06/28 17:16:25
id:Chaborin No.2

ちゃぼりん回答回数189ベストアンサー獲得回数72005/06/28 18:12:53

ポイント25pt

「値が見つからないとエラーになってしまいます」とはどのようなエラーですか?

正しいエラー文字を書いてもらえると助かります。

おそらくEOFなのでしょうが、その時はdr.Itemを呼びに行った時点でEOFエラーが出ていることと思います。もし0件か1件しかレコードがないのであれば、

’--

If dr.Read() = True Then

xxx = dr.Item(”memberNum”)

End If

dr.Close()

’--


このようにして、dr.Readの戻り値がTrueかFalseかで判定します。


もし複数件あるときは、

’--

While dr.Read() = True

dr.Item(~)

End While

’--

として回すのが良いでしょう。


(3)はそれで正解です。

id:haul

そうですーデータが見つからなかった場合です。

できました。ありがとうございました。

2005/06/29 16:42:21

コメントはまだありません

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

絞り込み :
はてなココの「ともだち」を表示します。
回答リクエストを送信したユーザーはいません