- - PR -
Datasetで更新する行の指定の方法について
1
投稿者 | 投稿内容 | ||||
---|---|---|---|---|---|
|
投稿日時: 2002-08-25 17:58
以下にデータセットにレコードを追加してサーバーに反映させる際の
コードの一部分を書いてみたのですが、 DataSetの特定のレコードを更新する(編集する)方法の サンプルなどを探しても見つかりません。 どのようにしてDataSet内の編集したいレコードを指定すればいいのでしょうか? 'SqlDataAdaperを使ってDataSetにデータを格納する objDA.Fill(objDS, "Authors") '追加をDatasetに行う objDS.Tables("Authors").Rows(0)("au_id") = txtau_id.Text objDS.Tables("Authors").Rows(1)("au_fname") = txtau_fname.Text objDS.Tables("Authors").Rows(2)("au_lname") = txtau_lname.Text objDS.Tables("Authors").Rows(3)("phone") = txtphone.Text '更新内容をサーバーに書き戻す objDA.Update(objDS, "Authors") | ||||
|
投稿日時: 2002-08-26 16:04
ずいぶん久しぶりの書き込みです。
概出の話題なのと、チュートリアルにずばり書かれているのでレスがないのだとはおもいますが・・・ SqlDataAdapter(DataAdapter)はメモリ上に保持しているだけのDataSetと DBの橋渡しをしてくれるものですね。 >objDA.Fill(objDS, "Authors") で行っていることは、多分それ以前に発行しているであろう、 SqlDataAdapter objDA = new SqlDataAdapter([SELECT文],[有効なコネクション]) で指定したSELECT文の結果をDataSetのインスタンスobjDSへの書き込みです。 このSqlDataAdapterには、.SelectCommand .UpdateCommand .DeleteCommand .InsertCommand というプロパティがあり、 .SelectCommandには上記で書いたSELECT文が入っているはずです。 更新をしたいのなら .UpdateCommandプロパティにupdate用のSQLを入れて、 .Update()メソッドを発行すればできます。他も同様ですね。 かといってUPDATEコマンドあたりも全部書くとなると面倒だし、保守も大変なので SqlCommandBuilderクラスに作ってもらいましょう。 | ||||
|
投稿日時: 2002-08-26 16:35
レスとアドバイス、ありがとうございます。
コードの一部しか書いてなくて申し訳ありません。 コードをすべて書きますと、追加の処理は以下のように書いています。 CommandでSQL文を発行する方法以外にも レコード編集の方法がないのかと思ったのですが、 やはりSQL文を発行するしかないんですね。。 ありがとうございました。 --------------------------------------------------- Dim strSQL As String Dim strConn As String Dim objDA As SqlClient.SqlDataAdapter Dim objDS As New Data.DataSet() Dim objCB As SqlClient.SqlCommandBuilder Dim objRow As Data.DataRow Dim intCounter As Integer Dim strResult As String 'SQL文字列と接続文字列を構築する strConn = "Initial Catalog=pubs;Data Source=xxxxx;User ID=xx;password=;" strSQL = "SELECT * FROM authors" 'SQL文字列と接続文字列を使ってSqlDataAdapterを初期化する objDA = New SqlClient.SqlDataAdapter(strSQL, strConn) 'DataAdapterを渡すことによってSQLCommandBuilderを初期化する 'これによって、DataAdaoterオブジェクトのINSERT、UPDATE、DELETEコマンドが '構築される objCB = New SqlClient.SqlCommandBuilder(objDA) 'SqlDataAdaperを使ってDataSetにデータを格納する objDA.Fill(objDS, "Authors") '新しい作者をメモリ内のローカルテーブルに追加する objRow = objDS.Tables("Authors").NewRow objRow("au_id") = txtau_id.Text objRow("au_fname") = txtau_fname.Text objRow("au_lname") = txtau_lname.Text objRow("phone") = txtphone.Text objRow("contract") = 0 objDS.Tables("Authors").Rows.Add(objRow) '更新内容をサーバーに書き戻す objDA.Update(objDS, "Authors") | ||||
|
投稿日時: 2002-08-27 08:27
SQLBuilderにつくってもらったSQLは、デバッガなどで確認しておいた方がいいですよ。とんでもないステートメントを作成してくれている可能性があります。 | ||||
|
投稿日時: 2002-08-27 10:07
そうですね。たまにそんなこともあります。やっぱりビルダの限界といったところでしょうか。 更新も行うDataSetを作るときは、2表間の簡単な結合ぐらいしかやってません。 それよりSqlCommandでSQL送ったほうが楽だと思っている私は邪道でしょうか? そもそも接続型と非接続型なんで使い方も違うわけではありますが・・・ | ||||
|
投稿日時: 2002-08-28 10:11
Jittaさんアドバイスありがとうございます。
SQLBuilderを使う場合は確認しながら上手くつかえるようにしたいと思います。 ぷりっつさん、SqlCommandでSQL送るのは邪道なんかじゃないと思いますよ。 私が質問させていただいたいきさつとしては、 グリッドなどを使用してアプリケーションを作成した場合、 サーバーに対して更新を実行する回数が頻繁になると思ったので、 できればDatasetで更新をかけおいて、一括してサーバーに送れたらいいなと 考えたからです。。。 | ||||
|
投稿日時: 2002-08-29 11:00
DataRowのプロパティーで更新、追加、削除を行ったかがわかるので、そこからSQL文を組み立てるかなぁ・・・と思っています。今の作成方針です。 |
1