- - PR -
データセットの更新
| 投稿者 | 投稿内容 | ||||
|---|---|---|---|---|---|
|
投稿日時: 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-11-08 17:09
さかもとです。
>データベースからテーブルを取り出して表示し の部分ですがデータグリッドへ表示させたり,テキストボックスなどへ直接表示させたり とあると思いますが,どのような方法ですか? その後の動作も含めてもう少し詳細に記述してみてください。 (分からないかもしれませんが(笑) | ||||
|
投稿日時: 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-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 応用できるかどうか不明ですが,私はこれでしのいでいます。 | ||||
|
投稿日時: 2004-11-09 08:24
データフォームウィザードで生成したコードを
参考にするのも1つの手法かと思います。 | ||||
|
投稿日時: 2004-11-10 12:38
さかもとさん、iStationさんありがとうございます。
さかもとさんに教えていただいたコードを試してみたのですが BindingManagerBaseという型が見つからず、System.Windows.Forms という名前空間も探せないのですが、インストールしているソフトの 問題でしょうか?あまりに基本的な質問でお恥ずかしいのですが・・ iStationさんのアドバイスにあったデータフォームウィザードの Updateコマンドの参考にしてUpdateのコードも書いてみたのですが、 detaset内から取り出して変更したDatarowをdatasetに戻す方法が やはりわかりません。 できましたらまたアドバイスをいただけますでしょうか? よろしくお願いします。 | ||||
|
投稿日時: 2004-11-10 13:05
http://www.google.com/search?num=50&lr=lang_ja&q=BindingManagerBase
ググれば一発ででてきます。。。 | ||||
|
投稿日時: 2004-11-10 13:09
System.Windows.Formsを参照設定に追加してないからですか? | ||||
