- PR -

Datasetで更新する行の指定の方法について

1
投稿者投稿内容
としくん
会議室デビュー日: 2002/07/27
投稿数: 7
お住まい・勤務地: Tokyo
投稿日時: 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/01/18
投稿数: 5
投稿日時: 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/07/27
投稿数: 7
お住まい・勤務地: Tokyo
投稿日時: 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")
Jitta
ぬし
会議室デビュー日: 2002/07/05
投稿数: 6267
お住まい・勤務地: 兵庫県・海手
投稿日時: 2002-08-27 08:27
引用:

としくんさんの書き込み (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")




SQLBuilderにつくってもらったSQLは、デバッガなどで確認しておいた方がいいですよ。とんでもないステートメントを作成してくれている可能性があります。
ぷりっつ
会議室デビュー日: 2002/01/18
投稿数: 5
投稿日時: 2002-08-27 10:07
引用:

Jittaさんの書き込み (2002-08-27 08:27) より:
SQLBuilderにつくってもらったSQLは、デバッガなどで確認しておいた方がいいですよ。とんでもないステートメントを作成してくれている可能性があります。



そうですね。たまにそんなこともあります。やっぱりビルダの限界といったところでしょうか。
更新も行うDataSetを作るときは、2表間の簡単な結合ぐらいしかやってません。
それよりSqlCommandでSQL送ったほうが楽だと思っている私は邪道でしょうか?
そもそも接続型と非接続型なんで使い方も違うわけではありますが・・・
としくん
会議室デビュー日: 2002/07/27
投稿数: 7
お住まい・勤務地: Tokyo
投稿日時: 2002-08-28 10:11
Jittaさんアドバイスありがとうございます。
SQLBuilderを使う場合は確認しながら上手くつかえるようにしたいと思います。

ぷりっつさん、SqlCommandでSQL送るのは邪道なんかじゃないと思いますよ。
私が質問させていただいたいきさつとしては、
グリッドなどを使用してアプリケーションを作成した場合、
サーバーに対して更新を実行する回数が頻繁になると思ったので、
できればDatasetで更新をかけおいて、一括してサーバーに送れたらいいなと
考えたからです。。。
Jitta
ぬし
会議室デビュー日: 2002/07/05
投稿数: 6267
お住まい・勤務地: 兵庫県・海手
投稿日時: 2002-08-29 11:00
引用:

としくんさんの書き込み (2002-08-28 10:11) より:
できればDatasetで更新をかけおいて、一括してサーバーに送れたらいいなと
考えたからです。。。




DataRowのプロパティーで更新、追加、削除を行ったかがわかるので、そこからSQL文を組み立てるかなぁ・・・と思っています。今の作成方針です。
1

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