- PR -

データセットの更新

投稿者投稿内容
とも
会議室デビュー日: 2004/10/21
投稿数: 12
投稿日時: 2004-11-08 15:22
いつもお世話になります。
ASP.NETとVB.NETを使っていて、データベースからテーブルを取り出して表示し、変更をしてからデータベースを更新するという動作をしたいのですが。。

http://www.microsoft.com/japan/msdn/library/default.asp?url=/japan/msdn/library/ja/Vbcon/html/vbtskupdatingexistingrecordsindataset.asp
などのページを参考にしてみたのですがDatarowを変更してそれをデータセットに戻すというところがうまくいきません。

ds.Tables("P").Rows(0).Item("Num") = 9999
のようなコードを使う場合、該当行のインデックス番号はどのように探し出せば
いいのでしょうか?

http://msdn.microsoft.com/library/default.asp?url=/library/en-us/cpguide/html/cpconupdatingdatabasewithdataadapterdataset.asp
にある、

Dim catDS As DataSet = New DataSet
catDA.Fill(catDS, "Categories")

Dim cRow As DataRow = catDS.Tables("Categories").Rows(0)
cRow("CategoryName") = "New Category"

catDA.Update(catDS)
というコードも使ってみたのですがこちらもうまくいきません。
この場合、cRowとcatDSとのつながりがないように思うのですが、
そうではないのでしょうか?初心者で説明が足りないかもしれませんが、
どのような方法でもやり方を教えてくださる方がいましたらご教示下さい。
よろしくお願いします。
さかもと
ぬし
会議室デビュー日: 2004/05/14
投稿数: 586
投稿日時: 2004-11-08 17:09
さかもとです。
>データベースからテーブルを取り出して表示し
の部分ですがデータグリッドへ表示させたり,テキストボックスなどへ直接表示させたり
とあると思いますが,どのような方法ですか?

その後の動作も含めてもう少し詳細に記述してみてください。
(分からないかもしれませんが(笑)
とも
会議室デビュー日: 2004/10/21
投稿数: 12
投稿日時: 2004-11-09 00:27
説明不足ですいません。
やろうとしているのは「顧客が自分のアカウントの登録情報(商品配送先など)を
変更する」という動作で、まずページがロードされたときにテキストボックスに
データベースから取り出してセッション変数に収めてあった顧客情報を表示します。
顧客が自分の情報を変更してボタンがクリックするとテキストボックスの内容をDatarowに収め、それをデータセットに戻して別のクラスに設定したDataAdapterのupdateファンクションに渡し、データベースを更新するというものです。顧客テーブルの
主キーにはオートナンバー型を使っています。
つまずいているのはテキストボックスに表示された変更された行をどのように
データセットに戻すかというところなのですが。。

drCust = dsCust.Tables("tblCustomer").NewRow
         ・
dsCust.Tables("tblCustomer").Rows.Add(drCust)
とすると新しい行として追加されてしまい、「行はすでに
存在します」のようなエラーがでてしまいます。
インデックス番号がわからないので
dsCust.Tables("tblCustomer").Rows(0).Item("Tel") = 9999
のように直接データセットを変更することもできず、
という具合です・・

ちなみにUpdateのファンクションは
Dim strUpdate As String = "UPDATE tblCustomer SET Email = ?, WHERE CustID = ?"
& "AND (Email = ? OR ? IS NULL AND Email IS NULL)"
Dim prmEmail As New OleDbParameter("Email", OleDbType.VarChar, 50, "Email")
cmdUpdate.Parameters.Add("Email", OleDbType.VarChar, 50, "Email")
Dim prmCID As OleDbParameter = objDACust.UpdateCommand.Parameters.Add("CustID", OleDbType.Integer)
prmCID.SourceColumn = "CustID"
prmCID.SourceVersion = DataRowVersion.Original

cmdUpdate.CommandText = strUpdate
cmdUpdate.Connection = connection()(データベースと接続するファンクション)
objDACust.UpdateCommand = cmdUpdate
dsCust.GetChanges()
objDACust.Update(dsCust, "tblCustomer")
dsCust.AcceptChanges()

という様に記述しています。いろいろ見てコピー&ペーストを繰り返したので
見にくいコードかと思いますがよろしくお願いします。

さかもと
ぬし
会議室デビュー日: 2004/05/14
投稿数: 586
投稿日時: 2004-11-09 08:17
おはようございます。さかもとです。
つまり,現在指定されているレコードの行位置が分かればよいのでしょうか?
ちょっと違うかもしれませんが私は以下の方法で表示中のレコード行位置を指定しています。

1:更新Subのところで
Dim drv As DataRowView = getCurrentDataRowView() 
'/この後に更新の処理(catDA.Update(catDS))がある
としておく

2:drvへは以下のFunctionで行位置を取得して値を戻します

Private Function getCurrentDataRowView() As DataRowView

Dim bm As BindingManagerBase = Me.BindingContext(Dataset, "mst_test")

Return CType(bm.Current, DataRowView)
End Function

応用できるかどうか不明ですが,私はこれでしのいでいます。

iStation
大ベテラン
会議室デビュー日: 2003/12/08
投稿数: 158
投稿日時: 2004-11-09 08:24
データフォームウィザードで生成したコードを
参考にするのも1つの手法かと思います。
とも
会議室デビュー日: 2004/10/21
投稿数: 12
投稿日時: 2004-11-10 12:38
さかもとさん、iStationさんありがとうございます。
さかもとさんに教えていただいたコードを試してみたのですが
BindingManagerBaseという型が見つからず、System.Windows.Forms
という名前空間も探せないのですが、インストールしているソフトの
問題でしょうか?あまりに基本的な質問でお恥ずかしいのですが・・

iStationさんのアドバイスにあったデータフォームウィザードの
Updateコマンドの参考にしてUpdateのコードも書いてみたのですが、
detaset内から取り出して変更したDatarowをdatasetに戻す方法が
やはりわかりません。
 できましたらまたアドバイスをいただけますでしょうか?
よろしくお願いします。
burton999
ぬし
会議室デビュー日: 2003/10/06
投稿数: 898
お住まい・勤務地: 東京
投稿日時: 2004-11-10 13:05
http://www.google.com/search?num=50&lr=lang_ja&q=BindingManagerBase

ググれば一発ででてきます。。。
burton999
ぬし
会議室デビュー日: 2003/10/06
投稿数: 898
お住まい・勤務地: 東京
投稿日時: 2004-11-10 13:09
引用:

BindingManagerBaseという型が見つからず、System.Windows.Forms
という名前空間も探せないのですが、インストールしているソフトの
問題でしょうか?あまりに基本的な質問でお恥ずかしいのですが・・



System.Windows.Formsを参照設定に追加してないからですか?

スキルアップ/キャリアアップ(JOB@IT)