- PR -

VB.NET DataGridに表示したDataTableの更新

1
投稿者投稿内容
Taito
常連さん
会議室デビュー日: 2005/07/21
投稿数: 43
投稿日時: 2005-10-28 11:00
DataGridに表示したDataTableの更新について、うまく動作しなくて
悩んでいます。

SQLサーバにデータがあり、それをDataGridに表示・編集・保存という処理
を行なっています。
DataAdapterでDataSetにセットしそれをDataGridに表示していた時は
Updateでうまく更新できていました。
しかし、そのDataGridで新規レコードの追加及びレコードの削除ができない
よう変更する必要が出てきたため、DataSetからDataTableにデータをセットし、
 dt.DefaultView.AllowNew = False
 dt.DefaultView.AllowDelete = False
を使うことにより、追加削除はできないようになりました。

そうすると、Updateがうまくできなくなってしまいました。

1.DataSetをDataGridに表示する方法で追加・削除ができないようにする方法
2.DataTableをDataGridに表示する方法で、Updateがうまくできる方法

上記のうち1点だけでも分かるといいなと思います。
色々方法を探しましたが、探しきれませんでした。
もし分かる方、アドバイスお願い致します。

ソースを下に貼り付けます。
DataSetをDataGridに表示していた時はadp.Update(ds, "ZWFAX")
で更新できていました。DataTableの場合adp.Update(dt)にしてみましたが
更新できませんでした。

' SQL接続用のオブジェクトを宣言
Dim cn As New SqlClient.SqlConnection
Dim cmd As New SqlClient.SqlCommand
Dim dr As SqlClient.SqlDataReader
Dim adp As New SqlClient.SqlDataAdapter
Dim ds As New DataSet
Dim dt As DataTable

Private Sub F_nouba_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load

'接続文字列を指定
cn.ConnectionString = "Server=" & DB_SERVER & ";Initial Catalog=" & DB_CATALOG & ";User ID=" & DB_USER & ";Password=" & DB_PASSWORD & ";"
'接続を確立
cn.Open()
'接続済みの Connection を指定する
cmd.Connection = cn
'クエリ文字列を指定
cmd.CommandText = "select * from ZWFAX"
'レコードデータを取得
adp.SelectCommand = cmd
ds.Clear()
adp.Fill(ds, "ZWFAX")
'接続を切断
cn.Close()

dt = ds.Tables("ZWFAX")

dt.DefaultView.AllowNew = False
dt.DefaultView.AllowDelete = False
'dt.DefaultView.AllowEdit = False
DataGrid1.SetDataBinding(dt.DefaultView, "")

End Sub

Private Sub btn_閉じる_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btn_閉じる.Click
Dim sqlCB As SqlClient.SqlCommandBuilder
Try
sqlCB = New SqlClient.SqlCommandBuilder(adp)
'データベース更新
'adp.Update(ds, "ZWFAX")
adp.Update(dt)
Me.Close()
Catch Ex As Exception
'例外メッセージ表示
MsgBox(Ex.Message, MsgBoxStyle.Exclamation)
Me.Close()
End Try
End Sub
ぼのぼの
ぬし
会議室デビュー日: 2004/09/16
投稿数: 544
投稿日時: 2005-10-28 11:50
Updateがうまくできなくなってしまった、というのは、具体的にどうなったのでしょう?
例外が発生するのか、例外は発生しないけどDBが更新されないのか。
例外が発生するのであれば、その内容を示して頂けないでしょうか。
Taito
常連さん
会議室デビュー日: 2005/07/21
投稿数: 43
投稿日時: 2005-10-28 11:57
引用:

ぼのぼのさんの書き込み (2005-10-28 11:50) より:
Updateがうまくできなくなってしまった、というのは、具体的にどうなったのでしょう?
例外が発生するのか、例外は発生しないけどDBが更新されないのか。
例外が発生するのであれば、その内容を示して頂けないでしょうか。



ぼのぼのさん、書込みありがとうございます。

DataSetをDataGridに表示していて、更新の場合
adp.Update(ds, "ZWFAX")
これで、更新もうまくいっていました。

DataTableをDataGridに表示していて、更新の場合
adp.Update(dt)
で、うまく行ったように見えるのですが、実際には
データ更新されていません。例外処理などでエラーは出ません。

DataTableをDataGridに表示し、データ更新する場合
なにか方法が違うのでしょうか…?
というか、できるんでしょうか…、不安になってきました。
ぼのぼの
ぬし
会議室デビュー日: 2004/09/16
投稿数: 544
投稿日時: 2005-10-28 12:07
ちなみに、DataTableをDataGridに表示した状態で
adp.Update(ds, "ZWFAX")
で更新するとどうなりますか?
Taito
常連さん
会議室デビュー日: 2005/07/21
投稿数: 43
投稿日時: 2005-10-28 12:13
引用:

ぼのぼのさんの書き込み (2005-10-28 12:07) より:
ちなみに、DataTableをDataGridに表示した状態で
adp.Update(ds, "ZWFAX")
で更新するとどうなりますか?



ぼのぼのさんありがとうございます。
その場合、エラーは何も出ませんが、更新もされません。
更新されなかったのでdsではなくdtを更新しないといけないのかな?
と思ったのですが、検索してもそういう例が見つけきれなくて…。
ぼのぼの
ぬし
会議室デビュー日: 2004/09/16
投稿数: 544
投稿日時: 2005-10-28 12:38
ひょっとすると、SqlCommandBuilderが自動生成するSqlCommandが、
意図していないものになってしまっているかもしれません。
デバッガでUpdateメソッドの直前で止めて、クイックウォッチで

sqlCB.GetUpdateCommand().CommandText

の内容を確認してみてください。意図したSQL構文になってますか?
もし違ってたら、ここを自分で設定すればうまくいくかもです。
方法については、ADO.NET基礎講座の第5回と第6回が参考になると思います。
Taito
常連さん
会議室デビュー日: 2005/07/21
投稿数: 43
投稿日時: 2005-10-28 13:19
引用:

ぼのぼのさんの書き込み (2005-10-28 12:38) より:
ひょっとすると、SqlCommandBuilderが自動生成するSqlCommandが、
意図していないものになってしまっているかもしれません。



ぼのぼのさん、アドバイス大変ありがとうございます。
自動生成するSqlCommandの値を見てみたところ、問題ありませんでした。
すごく、長かったですが。

それで、逆に、これで更新されていないのがおかしいと思い、
見直したところ…私のミスでした…解決しました。
申し訳ございません。

DataGridを表示する前に別プログラムでデータを作成しているのですが、
データの初期化(deleteのsql文を実行)のプログラムを入れたままでした。
何度、画面を開いても初期化されているので、変更が反映されていない
と勘違いしていました。
adp.Update(dt)で
データベースの方は、ちゃんと変更されていました;

でも、ぼのぼのさんのアドバイスのおかげでそれに気がつくことが
出来ました。本当にすみません。ありがとうございました。

#思い込みが激しいは直すように気をつけます…
1

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