DOBON.NET DOBON.NETプログラミング掲示板過去ログ

更新パラメータを使わずに

環境/言語:[Windows2000 VB.Net]
分類:[.NET]

初めまして。よろしくお願いします
どうも頭が古くてSQLなどからの実行などができず
Recordset的な考えで作成しているのですが以下のようなことをしたいのですが
どのようにすればよろしいでしょうか?
SQLやパラメータを使えばもっと楽なのは重々承知です

Dim RS As SqlClient.SqlDataReader

SqlConnection1.Open()
SqlCommand1.CommandText = "select * from MasterTable"
RS = SqlCommand1.ExecuteReader

While (RS.Read = True)
RS!UniqueName = "AA"
End While

RS.Close()
SqlConnection1.Close()
こんばんは。

> どうも頭が古くてSQLなどからの実行などができず
> Recordset的な考えで作成しているのですが以下のようなことをしたいのですが
> どのようにすればよろしいでしょうか?

> SQLやパラメータを使えばもっと楽なのは重々承知です

いや〜、その気持ちわかります〜
が、.NETでは通用しませんので、素直にupdateを使いましょう
ちなみに、.ExecuteReader は、読み取り専用ですので
更新には利用できませんよ

1:Dim SqlConnection1 As New SqlClient.SqlConnection()
2:Dim SqlCommand1 As New SqlClient.SqlCommand()
3:Dim i As Integer

4: SqlConnection1.Connection = _
"data source=PCNAME;initial catalog=DATABASENAME; _
user id=USERID;password=PASSWORD"
5: SqlCommand1.Connection = SqlConnection1
6: SqlCommand1.CommandText = _
"update MasterTable set UniqueName = 'AA'"

7: SqlConnection1.Open()
8: i = SqlCommand1.ExecuteNonQuery()
9: SqlConnection1.Close()

1〜3行目は、お約束ですね
4行目でコネクションを指定します。ご自分の環境に合わせて変更してください
(データベースはSQLServerかMSDEですよね)
接続文字列は↓などで確認してくださね
http://library.station.ez-net.jp/references/database/oledb/string.asp

5行目でコマンドにコネクションを指定します
6行目でコマンドを指定します
SQLの文法は↓などで確認してくださいね
 http://www.webconnection.jp/Technical/index.php?index=006
一応ここでは、MasterTableのUniqueNameにAAという文字をセットしています
ただ、この方法だとMasterTableのすべてのレコードのUniqueNameにAAが代入
されてしまいますので、特定のレコードを更新する場合は
"update MasterTable set UniqueName = 'AA' where No = 1"の様に
更新条件を指定してください

7行目でデータベースと接続
8行目で更新(6行目のSQL文が実行されます)
iの戻り値は、更新が成功した場合、更新したレコード数が入ります
9行目でデータベースと切断

こんなところでしょうか
間違いがあったらごめんなさい。私も勉強中の身ですので
こんにちは
fnさんご丁寧なレスありがとうございます。

やはりRecordSet的なことはできないのですね
VBAから入ってきたものでものすごく不便に感じますがじき慣れるでしょう
VB.Netではデータ更新はテーブル・ビューからの手入力更新と
SQLでの一括更新しかできないのですね
こんにちわ

SQLの基本構文(select, insert into, update, delete)は、
それほど難しいものではありませんので、
この際、覚えてみてはいかがでしょうか?

がんばってください

■No2395に返信(えりえーるさんの記事)
> こんにちは
> fnさんご丁寧なレスありがとうございます。
>
> やはりRecordSet的なことはできないのですね
> VBAから入ってきたものでものすごく不便に感じますがじき慣れるでしょう
> VB.Netではデータ更新はテーブル・ビューからの手入力更新と
> SQLでの一括更新しかできないのですね
VBAを使用していたときにもRecordSetとSQLを使い分けしていたので
SQL自体には理解はあります。ただSQLだと自分的にわかりづらいし汎用性もないかな、と
横槍失礼します。

 No2401 を拝見した感じだと、えりえーるさんは DataSet は使われてるのですよね。
 SqlDataAdapter の Update メソッドを使うようにすれば、 Recordset の操作をしてた時と
同じような感覚でデータ更新が出来るかと思うのですけど、試されましたか?

# 内部的にはパラメータを使うことになりますし、ご要望の件とは合致しないのかも‥‥(^_^;)
# 的外れなことを言ってるようでしたら申し訳ありません。
横槍なんか全然OKです。深山さんありがとうございます。

Dim rs As DataRow()
rs = DataSet11.MasterTable.Select("ID = 1")

のような形でなんか取得することはできたのですが
この先参照したり更新したりすることができません。
Msgbox rs!ID
などとやっても全然検討違いらしくて・・・
何かご意見などありましたらどんどんお願いします
> Dim rs As DataRow()
> rs = DataSet11.MasterTable.Select("ID = 1")
> Msgbox rs!ID

 このコードでは上手くいかない理由は二点あるでしょうか。

 まず、 DataTable.Select メソッドは(えりえーるさんもコードで記述されてる通り)
DataRow の配列を戻り値をして返してきます。ですので、 DataRow の値を取得するには
その要素数を指定する必要があります。

 それから、 DataRow では Recordset のように "!" を使ってフィールドにアクセスすることは
できないようです。その代わり(と言ったら変ですけど)

変数名("列名")

という記述は大丈夫ですので然程違和感はないかと。
# Recordset でも Fields を省略して同じように書けましたよね。
こんばんは、えりえーるさん。ピラルクです。

> 何かご意見などありましたらどんどんお願いします

ActiveX ADOを参照させれば、従来通り(?)な
RecordSetからのUpdateも可能です。
「.NETの学習は2の次で、今のコレさえ動けば!」
というのであれば利用するのも良いかも。

Imports ADODB '参照設定COMタブよりMicrosoft ActiveX Data Object Library追加

……

Dim objCon As New Connection()
objCon.Open("Provider=sqloledb;Initial Catalog=MyDB;", "sa", "sa_pass")

objCon.BeginTrans()

Dim objRecordSet As New ADODB.Recordset()
objRecordSet.Open("SELECT * FROM T_CUSTOMER", objCon, _
CursorTypeEnum.adOpenDynamic, LockTypeEnum.adLockOptimistic, CommandType.Text)

While Not objRecordSet.EOF
Dim value As String = objRecordSet.Fields("NAME").Value
objRecordSet.Update("NAME", value & "_updated")
objRecordSet.MoveNext()
End While

objCon.CommitTrans()

objCon.Close()

> VBAから入ってきたものでものすごく不便に感じますがじき慣れるでしょう

でも、慣れるほうがおすすめです。
Dataまわりは、.NETになって高度に成長してますので、
確かに大変です。私もここで分かったようなフリして
時折回答してますが、まだ全体を把握しきれてません。(^^;
深山さん。ピラルクさんレスありがとうございます

>深山さん
言われるとおりにして
変数名("列名")
という形にしてみたのですが、やはり構文エラーが出てしまいました
ヘルプを見てもわざとわかりにくくしてるようにしか見えないし><

>ピラルクさん
ADOを使えると言うことは知っていたのですがActiceXの存在はてっきり・・・
確かにこれだとそのままいけるような感じはするのですが
たとえば処理速度的な面から見るとどうなのでしょうか
またASP.netの方でもADOは問題ないのでしょうか
質問ばっかりですみません
> 言われるとおりにして
> 変数名("列名")
> という形にしてみたのですが、やはり構文エラーが出てしまいました

どのようなコードを書いて、どのようなエラーになられたのでしょう?
構文エラーということはビルドに失敗したということでしょうか。もしそうではなく、実行時に

文字列 "ID" から型 'Integer' へのキャストが有効ではありません。

というようなエラーが発生したのでしたら、 No2405 に書いたような要素数の指定をしていないから
なのでしょうけども‥‥。
下記のようなコードではどうでしょうか?

    Dim rs As DataRow()
    Dim i As Integer
    rs = DataSet11.MasterTable.Select("ID = 1")
    For i = 0 To rs.Length - 1
        MsgBox(rs(i)("ID"))
    Next

# ループさせて ID の表示を行うのは(ID で抽出してるので)無意味でしょうけど、例ということで(^_^;)


ところで今気付いたのですが、えりえーるさんはプロジェクトにデータセットを追加して、
型指定されたデータセットとして使用されてるのですよね?
もし ID を主キーにしているのでしたら、次ようなやり方もあります。

    Dim r As Dataset1.MasterTableRow
    r = Dataset11.MasterTable.FindByID(1)
    MsgBox(r.ID)

クラス名はもしかしたら違うかも知れません。念のためにクラスビューでご確認くださいませ。
# 蛇足になりそうな気もしましたが参考までに。


> ヘルプを見てもわざとわかりにくくしてるようにしか見えないし><

確かにヘルプは解りづらいですよね。私もよく悩まされます(^_^;)
なかなか仲良くなれませんけど、それでも最初の頃よりはマシになったのかなぁ。
お互い、日々勉強ですね。


■私信■
ピラルクさん、こんにちは。先日はお世話になりました(礼)
こんばんは、えりえーるさん。ピラルクです。

> たとえば処理速度的な面から見るとどうなのでしょうか

COMはラッパーが入るし、System.Data.Sql〜は
SQLServerに最適化されたClassですから、相対
的にADODBは不利でしょう。
絶対的に問題となるかはシステム次第なので、
パフォーマンスの懸念がある箇所でテストとい
うことになるでしょう。

> またASP.netの方でもADOは問題ないのでしょうか

ぁゃ、ASPだったのですか。
クラサバでサーバーカーソル使うみたいな感じ
を想像していましたが。
サーバ側でDBアクセス部品として使う分には、
ADODBでも機能的に問題ないと思いますが、ある
としたら、ADODBは(.NET)フレームワークの一員
でないので、それでどこかに不都合があるかどう
かでしょう。(システム次第)
でもWebシステムなら、非接続型でシリアライズ
してDataSetを渡す.NETの生産性の高さを享受する
のが普通だと思いますが。
レスありがとうございます

>深山さん
申し訳ありません。ちょっと言葉が足りませんでしたね
要素数の定義の仕方がまずかったようです
ヘルプを見てやったのですが、どうやら見当違いのようでした
キーから取得する方法もできました。

>ピラルクさん
やはりDBがSQLなのでADOのがどうしても不利ですね
やはり今後のことを考えてSQLに精進したいと思います。
後ASPのことですが上司に「VB.netできればASPも楽だろ?」と言われたので
ASP.NetでもADOが使えるかどうか気になったのです

結果的にSQLでやるとだいぶ遠回りしてしまいましたが
みなさん本当ありがとうございました
解決済み!

DOBON.NET | プログラミング道 | プログラミング掲示板