C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[2]: ADO.NETで最終レコードまで更新したいのですが


(過去ログ 74 を表示中)

[トピック内 10 記事 (1 - 10 表示)]  << 0 >>

■43349 / inTopicNo.1)  ADO.NETで最終レコードまで更新したいのですが
  
□投稿者/ がながな (5回)-(2009/11/06(Fri) 13:35:58)

分類:[.NET 全般] 

いつもお世話になります。
テーブル内の金額フィールドを全て更新したいのですが、アクションクエリを使用する以外に方法ってありますか?
ADOですと、
*********************************************************************************
do until rs商品マスタ.eof
rs商品マスタ!金額=0
rs商品マスタ.update
rs商品マスタ.movenext
loop
*********************************************************************************

と言う構文をADO.NETで実現したいのですが、以下のように現在記述したのですが、この状態ですと、1行目のみ金額:0円になります。次のレコードへ行くための記述方法がわかりません。
**********************************************************************************
MySQL = "select " _
& "金額" _
& " from " _
& "[T0000_商品マスタ]"
ad商品マスタ = New SqlDataAdapter(MySQL, cnn)

'++++++++++++++++++++++++++++++++++++++++++++++++++++++++'
' データセット
'++++++++++++++++++++++++++++++++++++++++++++++++++++++++'
ds商品マスタ = New DataSet
ad商品マスタ.Fill(ds商品マスタ, "T0000_商品マスタ")
tb商品マスタ = ds商品マスタ.Tables("T0000_商品マスタ")
If tb商品マスタ.Rows.Count <> 0 Then



'----------------------------------------------------'
' 更新開始
'----------------------------------------------------'
rw商品マスタ = tbASO.Rows(0)
rw商品マスタ.BeginEdit()
rw商品マスタ("金額") = 0
rw商品マスタ.EndEdit()
'//---自動生成コマンド作成
cmd商品マスタ = New SqlCommandBuilder(ad商品マスタ)
ad商品マスタ.UpdateCommand = cmdASO.GetUpdateCommand
ad商品マスタ.Update(ds商品マスタ, "T0000_商品マスタ")

End If
****************************************************************************************

以上よろしく御願いいたします。
引用返信 編集キー/
■43352 / inTopicNo.2)  Re[1]: ADO.NETで最終レコードまで更新したいのですが
□投稿者/ はつね (1099回)-(2009/11/06(Fri) 14:50:51)
はつね さんの Web サイト
No43349 (がながな さん) に返信
> テーブル内の金額フィールドを全て更新したいのですが、アクションクエリを使用する以外に方法ってありますか?

アクションクエリってなんですか?


> ADOですと、
> *********************************************************************************
> do until rs商品マスタ.eof
>     rs商品マスタ!金額=0
>     rs商品マスタ.update
>     rs商品マスタ.movenext
> loop
> *********************************************************************************
> 
> と言う構文をADO.NETで実現したいのですが、

DataReaderをつかって

Do While dr.Read
'ここでUPDATE文を作ってExecuteNonQuery
Loop

引用返信 編集キー/
■43353 / inTopicNo.3)  Re[2]: ADO.NETで最終レコードまで更新したいのですが
□投稿者/ がながな (6回)-(2009/11/06(Fri) 14:54:21)
早速の御返事ありがとうございます。

やはりデータリーダーを使用するしか方法はないんでしょうか・・・
引用返信 編集キー/
■43354 / inTopicNo.4)  Re[3]: ADO.NETで最終レコードまで更新したいのですが
□投稿者/ επιστημη (2255回)-(2009/11/06(Fri) 14:57:05)
επιστημη さんの Web サイト
> アクションクエリを使用する以外に方法ってありますか?
>
> やはりデータリーダーを使用するしか方法はないんでしょうか・・・

アクションクエリ=データリーダ ってことですか?

引用返信 編集キー/
■43355 / inTopicNo.5)  Re[3]: ADO.NETで最終レコードまで更新したいのですが
□投稿者/ gtk2k (108回)-(2009/11/06(Fri) 14:57:52)
rw商品マスタ = tbASO.Rows(0)
rw商品マスタ.BeginEdit()
rw商品マスタ("金額") = 0
rw商品マスタ.EndEdit()
ここんところをループすればいいと思うが。
間違ってたらすまん。
引用返信 編集キー/
■43358 / inTopicNo.6)  Re[4]: ADO.NETで最終レコードまで更新したいのですが
□投稿者/ がながな (7回)-(2009/11/06(Fri) 15:19:33)
LOOPの記述方法ってどのように書けばいいのでしょうか??
よろしく御願いいたします。
引用返信 編集キー/
■43360 / inTopicNo.7)  Re[5]: ADO.NETで最終レコードまで更新したいのですが
□投稿者/ gtk2k (109回)-(2009/11/06(Fri) 15:30:22)
No43358 (がながな さん) に返信
> LOOPの記述方法ってどのように書けばいいのでしょうか??
> よろしく御願いいたします。

For Each rw商品マスタ As DataRow In tbASO.Rows
rw商品マスタ.BeginEdit()
rw商品マスタ("金額") = 0
rw商品マスタ.EndEdit()
Next

こんな感じ(未実証)
引用返信 編集キー/
■43362 / inTopicNo.8)  Re[1]: ADO.NETで最終レコードまで更新したいのですが
□投稿者/ オショウ (376回)-(2009/11/06(Fri) 16:27:02)
SQL文一発で、金額フィールドをゼロ化したい・・・と言うだけですよネ?

    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click

        Dim bRet As Boolean

        Using SqlDB As SqlConnection = New SqlConnection(GetDBConnectString())
            Try
                SqlDB.Open()
                bRet = True
            Catch ex As Exception
                bRet = False
            End Try

            If bRet Then
                Dim sb As StringBuilder
                Dim iRet As Integer

                sb = New StringBuilder

                With sb
                    .Length = 0
                    .Append("update ")
                    .Append("T0000_商品マスタ ")
                    .Append("set ")
                    .Append("金額=0")
                End With

                Using SqlCMD As SqlCommand = SqlDB.CreateCommand
                    With SqlCMD
                        .CommandType = CommandType.Text
                        .CommandTimeout = SqlDB.ConnectionTimeout
                        .CommandText = sb.ToString
                    End With

                    iRet = SqlCMD.ExecuteNonQuery

                End Using

                SqlDB.Close()
            End If
        End Using

    End Sub

    Private Function GetDBConnectString() As String

        Dim sb As SqlConnectionStringBuilder

        sb = New SqlConnectionStringBuilder

        With sb
            .DataSource = "LocalHost"
            .InitialCatalog = "TEST"
            .IntegratedSecurity = False
            .UserID = "hoge"
            .Password = "hogehoge"
            .ConnectTimeout = 10
        End With

        Return sb.ToString

    End Function

※ 動作未確認ですが、こういうことじゃ〜ないのかな・・・

以上。参考まで

引用返信 編集キー/
■43365 / inTopicNo.9)  Re[1]: ADO.NETで最終レコードまで更新したいのですが
□投稿者/ 魔界の仮面弁士 (1377回)-(2009/11/06(Fri) 17:20:40)
2009/11/06(Fri) 18:40:10 編集(投稿者)

No43349 (がながな さん) に返信
> テーブル内の金額フィールドを全て更新したいのですが、アクションクエリを使用する以外に方法ってありますか?

データベース用語ではなく、Access 固有の用語なので、あまり一般的では無いかも。>アクションクエリ


で、今回の質問の意図としては、UPDATE の SQL を一発流して終わり、という方法で処理したいのではなく、
ADO の更新可能カーソルをループさせて、一件ずつ更新処理を進めていきたい…という意図かと思います。


まず、ADO.NET で使用可能なカーソルは、ファイアホースのみとなります。
具体的には「DataReader」系のクラスが、ADO でいうところの
adUseServer / adOpenForwardOnly / adLockReadOnly タイプの Recordset に相当しています。
しかし残念ながら、これは ReadOnly ですから、もちろん更新には使えません。


更新のために、ADO の adOpenStatic カーソルタイプに相当する処理を行いたいのであれば、
TableAdapter(もしくは DataAdapter)を使い、DataTable 経由で編集するのが、処理としては近いかと思います。

http://msdn.microsoft.com/ja-jp/events/dd252635.aspx
上記では DataGrid 経由で、DataTable 内のデータを編集していますが、
コントロールを使わずに、DataTable の各行をループ編集させても OK です。

たとえば、その DataSet が型付きでは無い場合には、DataTable の各行を
 For Each row As DataRow In tb商品マスタ.Rows
  row("金額") = 0d
 Next
などのループで処理していき、最後に DataAdapter (または TableAdapter)を通じて
 ad商品マスタ.Update(tb商品マスタ)
という感じです。
概念的には、ADO でいうところの adLockBatchOptimistic タイプに対する
Recordset.UpdateBatch メソッドに相当する物だと思えば良いかと。


なお、ADO の adOpenKeyset カーソルタイプに相当する処理は
ADO.NET ではサポートされていなかったかと思います。
# SQL Server 2005 の段階で、『ISqlResultSet』として実装される予定でしたが、
# 結局、2005 には実装されませんでした…。
# http://technet.microsoft.com/ja-jp/library/ms345147.aspx


それ以外では、ADO.NET Entity Framework で更新するという選択肢もありますが、
これはカーソルモデルでは無いので、今回の目的にはやや使い難いかもしれません。
引用返信 編集キー/
■43369 / inTopicNo.10)  Re[2]: ADO.NETで最終レコードまで更新したいのですが
□投稿者/ がながな (9回)-(2009/11/07(Sat) 00:03:17)
皆さんありがとうございました。無事解決いたしました。 魔界の仮面弁士 様非常によく理解で来ました。ありがとうございます。
解決済み
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -