こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

VB2010 DataSet 更新

VB2010で社員名簿を作成しています。Form1にDataGridViewを使って名簿を作成し、Form2で更新のボタンを押します。
次のようにプログラムを作成しましたが、更新できません。エラーも出ません。
DataRowをdeleteで消して、それを保存する方法です。
どこが悪いのでしょうか。ご存知の方はご教授いただけませんでしょうか。

’新年度につき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.社員名簿)

投稿日時 - 2013-01-03 08:55:31

QNo.7873115

すぐに回答ほしいです

質問者が選んだベストアンサー

お返事ありがとうございます。


誰も投稿してくださらないので、自分で投稿してます。
実際のコードをみたわけではありませんので、またもや無責任な投稿です。


>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


本当はデータ処理はデータ処理専門のクラスを作成する方が良いのかもしれませんが、混乱のもとになりますので割愛させてくささい。
未検証コードですいません。

投稿日時 - 2013-01-04 16:27:36

お礼

回答をありがとうございました。
かなりの時間と労力をお使いいただきまして、感謝しています。
これだけ詳細に書いていただきましたので、あとは自分で解決いたします。
思ったよりも、コーディングが複雑なのに驚いています。
兎に角、正月休みにお時間をいただきまして、感謝しています。

投稿日時 - 2013-01-04 22:07:50

このQ&Aは役に立ちましたか?

7人が「このQ&Aが役に立った」と投票しています

回答(2)

こんにちは



コードの全容がわかりませんので、想像で投稿しています。

>それを保存する方法です。
これはデータベースに保存でしょうか?
それともメモリー上の値だけ変更するのかな~?


データベースそのもを変更する場合は下記のように「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
がデータベースの変更なのかわかりませんので、かなり無責任な回答です。
ごめんなさい。

但しこの情報を他の方が見て良い回答を付けていただける可能性がありますので、できる範囲で結構ですので追加の情報をお願いします。(いつもの通り他力本願作戦です)

投稿日時 - 2013-01-03 23:06:30

補足

端折って書いたところもございますので、記載が不十分で申し訳ございません。
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」の文字が必要というと頭が混乱しています。

投稿日時 - 2013-01-04 09:55:57

あなたにオススメの質問