- ベストアンサー
VB2010 DataSet 更新できない問題について
- VB2010で社員名簿を作成し、更新のボタンを押してもエラーが出て更新ができません。
- 問題の原因は、DataRowをdeleteで消して保存する方法にあります。
- 正しい更新方法をご存知の方はご教授いただけませんでしょうか。
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
お返事ありがとうございます。 誰も投稿してくださらないので、自分で投稿してます。 実際のコードをみたわけではありませんので、またもや無責任な投稿です。 >OleDbConnection、 OleD~~~andなど分かりにくいです。 すいません、混乱のもとを作ってしまいました。 上記はアクセスの場合でした。SQLServerの場合は「OleDb」を全て「Sql」に変更します。 >「UPDATE」「SET」「WHERE」 データベースの操作ができていれば必要ありません。 >Form1.社員名簿TableAdapter1.Update(Form1.本店DataSet1.社員名簿) 上記の記入方法はVBでは許されてますが、VBがオブジェクト指向であることを考えると少し妙な感じがしますので、サンプルでは変更しています。(もしかするとここが原因かもしれません) Class Form1とあるように「Class」と書かれている以上クラスの扱いをします。 サンプルは 「プロジェクト」→「~~プロパティ」→「アプリケーションタブ」→「シャットダウンモード」→「最後のフォームが閉じるとき」に設定しています。ここの真ん中あたりに画像があります。 http://kagoturich.kakukaku-sikajika.com/ Imports System.Data.SqlClient Public Class Form1 Dim adapta As SqlDataAdapter Private Sub F() Handles MyBase.Shown 'ここから Dim conect As New SqlConnection("接続文字") Dim sqlcmd As SqlCommand = conect.CreateCommand adapta = New SqlDataAdapter(sqlcmd) Dim Builder As New SqlCommandBuilder(adapta) Dim tabl As New DataTable 'ここまでは変更してください 'tablを全ての名簿にする 但し「SELECT * FROM」が混乱の元でしたら無視してください sqlcmd.CommandText = "SELECT * FROM 社員名簿" adapta.Fill(tabl) DataGridView1.DataSource = tabl '新年度につきForm1の社員名簿のDATAを初期化する Dim j As Integer For j = 0 To DataGridView1.Rows.Count - 1 DataGridView1.DataSource.Rows(j).Delete() Next 'Form2のボタンが押されたときの処理 f.boolで判断する Dim f As New Form2 If f.bool = True Then adapta.Update(DataGridView1.DataSource) End If tabl.Dispose() End Sub 'Form2を開くイベントハンドラはボタンクリックよりもほかの方が操作が楽ですね。 Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click Dim f As New Form2 f.Show() Me.Close() 'Closeのタイミングはほかの方法のほうがいいですね End Sub End Class Public Class Form2 'Sharedを使ってますのでどこかのタイミングでクリアしてください。 Shared _bool As Boolean 'Button1_Clickイベント Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click _bool = True Dim f1 As New Form1 f1.Show() Me.Close() End Sub '_boolを返す Public Function bool() Return _bool End Function End Class 本当はデータ処理はデータ処理専門のクラスを作成する方が良いのかもしれませんが、混乱のもとになりますので割愛させてくささい。 未検証コードですいません。
その他の回答 (1)
- 田中 裕之(@bybalsendercase)
- ベストアンサー率88% (56/63)
こんにちは コードの全容がわかりませんので、想像で投稿しています。 >それを保存する方法です。 これはデータベースに保存でしょうか? それともメモリー上の値だけ変更するのかな~? データベースそのもを変更する場合は下記のように「UPDATE」「SET」「WHERE」の文字が必要です。 下記は1項目のみの変更です。 Dim setuzoku As New OleDbConnection("接続文字") Dim database As OleDbCommand = setuzoku.CreateCommand database.CommandText = "UPDATE 「データベースのテーブル名」 SET 「表のお題」」 = '「社員名」' WHERE 「~番号」" setuzoku.Open() database.ExecuteNonQuery() setuzoku.Close() >DataSet1 がデータベースの変更なのかわかりませんので、かなり無責任な回答です。 ごめんなさい。 但しこの情報を他の方が見て良い回答を付けていただける可能性がありますので、できる範囲で結構ですので追加の情報をお願いします。(いつもの通り他力本願作戦です)
補足
端折って書いたところもございますので、記載が不十分で申し訳ございません。 SQLServerを利用して名簿の管理をしようとしています。 データベースのファイル名は、本店ですので「本店.sdf」が作成され、テーブルとして社員名簿を作成しました。 その結果、本店DataSet1と社員名簿TableAdapter1が作成され、DataDridViewとDataSetを繋ぐ為に、社員名簿BindingSourceが作成してあります。 質問で書きましたコードは次のようになります。 ’新年度につきForm1の社員名簿のDATAを初期化する Dim j As Integer For j = 0 To Form1.DataGridView1.Rows.Count - 1 Form1.本店DataSet1.社員名簿.Rows(j).Delete() Next ’ 初期化した社員名簿を保存する Form1.社員名簿TableAdapter1.Update(Form1.本店DataSet1.社員名簿) 以前、メモリー上でのDATAの初期化は、「Clear()」を使い、データベースの初期化は「delete()」を使うように教わりましたので、今回上記のように書きました。 ご教授いただきました内容は、少し難しいので勉強しましたが、OleDbConnection、 OleDbCommand 、CommandText、CreateCommandなど分かりにくいです。 今までDATAの書き込み(保存)と読み込みは、「Update」と「Fill」で出来ていたので、「UPDATE」「SET」「WHERE」の文字が必要というと頭が混乱しています。
お礼
回答をありがとうございました。 かなりの時間と労力をお使いいただきまして、感謝しています。 これだけ詳細に書いていただきましたので、あとは自分で解決いたします。 思ったよりも、コーディングが複雑なのに驚いています。 兎に角、正月休みにお時間をいただきまして、感謝しています。