C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[8]: DataGridViewの変更をアクセスデータベースに反映


(過去ログ 30 を表示中)

[トピック内 9 記事 (1 - 9 表示)]  << 0 >>

■14215 / inTopicNo.1)  DataGridViewの変更をアクセスデータベースに反映
  
□投稿者/ いの (1回)-(2008/02/13(Wed) 14:10:44)

分類:[VB.NET/VB2005] 

環境:VS2005
OS:Windows XP
言語:VB

初めまして。こちらも含めてVBの質問は初めてになりますが、よろしくお願いします。
至らないところがあればすみません。

今、Accessデータベースのテーブルを取得して、DataGridViewに表示させています。
そこから、任意にDataGridViewの内容を変更(変更させる列は決まっています)し、まずDataGridViewに反映させます。
次にAccessデータベースのテーブルに変更した内容を反映させる予定です。
本やインターネットで色々調べたのですがどうしてもうまくいかず、こちらで質問させていただきます。
プログラムは以下の通りです。ある程度簡略化して書きます。

Dim A As New DataTable
Dim E As OleDb.OleDbCommand
Dim F As OleDb.OleDbConnection = New OleDb.OleDbConnection
Dim G As OleDb.OleDbTransaction

F.ConnectionString = _
"Provider=Microsoft.Jet.OLEDB.4.0;" _
& "Data Source=Access.mdb;Persist Security Info=False"

F.Open()
E = F.CreateCommand
G = F.BeginTransaction()
E.Connection = F
E.Transaction = G
E.CommandText = "UPDATE Accessテーブル SET 〜〜〜 WHERE 〜〜〜"
E.ExecuteNonQuery()
G.Commit()
F.Close()

For Each Row As DataRow In A.Rows
Dim SQL As String = ""

Select Case Row.RowState
Case DataRowState.Modified

SQL = "UPDATE Accessテーブル SET 〜〜〜 WHERE 〜〜〜"

Case Else
Continue For

End Select

E.CommandText = SQL
F.Open()
E.ExecuteNonQuery()
F.Close()

Next

Row.AcceptChanges()

A.Dispose()
F.Dispose()

本では、OleDB.OleDBDataAdapterやDataSetを使い、データセットにコマンドビルダを作成、
DataAdapterをUPDATEしてデータベースに反映させていますが、うまくいきませんでした。
上のプログラムはインターネット上でのやり方(アレンジはしています)で書いていますが、これもうまくいっていません。
トランザクション処理も混ぜています。2回ExecuteNonQueryしていますが1回でも十分なことは確認済みなんですが、
こういうやり方もしていますってことで書いてみました。
SQL文は、DataGridViewの内容にCheck Boxや数値、文字が混じっていますので、DataBindingでLabelと関連付けて書いています。

上のプログラムの内容ですと、DataGridViewの内容は変更されています。イミディエイトウインドウでもModifiedになっています。
しかし、Accessデータベースのテーブルの内容までは変更されていません。

色々ごちゃ混ぜになっていてややこしくなっていますが、ご教授いただければ幸いです。

引用返信 編集キー/
■14333 / inTopicNo.2)  Re[1]: DataGridViewの変更をアクセスデータベースに反映
□投稿者/ いの (4回)-(2008/02/15(Fri) 12:47:01)
No14215 (いの さん) に返信
結構プログラムを変更しましたので、あげさせていただきます。依然解決には至っていません。

プログラムは以下の通りです。

    Dim A As DataRow
Dim B As New DataTable
Dim C As New OleDb.OleDbDataAdapter
Dim D As OleDb.OleDbCommandBuilder
Dim E As OleDb.OleDbCommand
Dim F As OleDb.OleDbConnection = New OleDb.OleDbConnection
Dim H As OleDb.OleDbTransaction

F.ConnectionString = _
"Provider=Microsoft.Jet.OLEDB.4.0;" _
& "Data Source=Access.mdb;Persist Security Info=False"

F.Open()
E = cn1.CreateCommand
H = cn1.BeginTransaction()
E.Connection = F
E.Transaction = H
E.CommandText = "UPDATE Accessテーブル SET 〜〜〜 WHERE 〜〜〜"
H.Commit()
F.Close()

B = CType(DataGridView1.DataSource, DataTable)
C = New OleDb.OleDbDataAdapter(E)

aa1.Fill(dtTable1)
DataGridView1.DataSource = B

For Each Row As DataRow In B.Rows
Dim SQL As String = ""

Select Case Row.RowState
Case DataRowState.Modified

SQL = "UPDATE Accessテーブル SET 〜〜〜 WHERE 〜〜〜"
MessageBox.Show("変更しました。")
Case Else
Continue For

End Select

Dim I As OleDb.OleDbCommand = F.CreateCommand

I.CommandText = SQL

F.Open()
I.ExecuteNonQuery()
F.Close()

Next

For Each A In B.Rows
If A.RowState <> DataRowState.Unchanged Then
A.AcceptChanges()
End If
Next

D = New OleDb.OleDbCommandBuilder(C)

C.Update(B)

End Sub

上のプログラムは本とインターネット上でのやり方(アレンジはしています)で書いていますが、うまくいっていません。
SQL文は、DataGridViewの内容にCheck Boxや数値、文字が混じっていますので、DataBindingでLabelと関連付けて書いています。

上のプログラムの内容ですと、DataGridViewの内容は変更されています。イミディエイトウインドウでもModifiedになっています。
修正前のプログラムでは、見かけ上変更されているだけでした(Data Rowの内容は変更されていなかったみたいです)。
今のプログラムは、MessageBoxの"変更しました。"が表示されていますので大丈夫だと思います。
しかし、Accessデータベースのテーブルの内容までは変更されていません。
色々ごちゃ混ぜになっていてややこしくなっていますが、ご教授いただければ幸いです。
宜しくお願いします。


引用返信 編集キー/
■14334 / inTopicNo.3)  Re[2]: DataGridViewの変更をアクセスデータベースに反映
□投稿者/ やじゅ (164回)-(2008/02/15(Fri) 12:51:40)
No14333 (いの さん) に返信
> 修正前のプログラムでは、見かけ上変更されているだけでした(Data Rowの内容は変更されていなかったみたいです)。

そうかなーと思ってたけど、指摘しませんでした。

> しかし、Accessデータベースのテーブルの内容までは変更されていません。

このプログラムとは別に単純なUPDATE句を作成して、DBに更新出来るかを確認した方がいいでしょう。

引用返信 編集キー/
■14352 / inTopicNo.4)  Re[3]: DataGridViewの変更をアクセスデータベースに反映
□投稿者/ いの (5回)-(2008/02/15(Fri) 18:52:44)
No14334 (やじゅ さん) に返信
返信ありがとうございます。

仰るとおり、SQL文を簡単にしたUPDATE句を作って、他は同じにしてプログラムを走らせてみました。
結果は、変更した列はテーブルには属していませんというエラーが出ました。
そこで一度プログラムを終了させてみて、もう一度プログラムを走らせてみるとなぜか変更した値が入って変更されています。
変更はDataGridViewから直接入力して変更させています。
SQL文は以下の通りです。

SQL = "UPDATE テーブル SET 列の名前 = " & Row(Label.Text) & ""

この現象を元に元のプログラムを考えてみましたが、どうしても同じエラーがでてしまい、こちらは変更の挙動が統一されていません。
まず、チェックボックスのチェックを付けたり外したりしても一切変更はききません。
数値の場合、元のテーブルの値も消えて空の状態に変更されます。以後どの数字を入れても空のままです。
SQL文は以下の通り書いています。全部は長いので一部です。

SQL = UPDATE テーブル SET チェックボックスの列の名前 = " & Row(CheckBox1.Text) & " And 数値型の列の名前 = " & Row(Label.Text) & " WHERE 列の名前 = " & Row(Label.Text, DataRowVersion.Original) & ""

CheckBoxやその他の列は全てCheckBoxやLabelにDataBindingしています。
何かお気づきのことがあれば返信宜しくお願いします。
引用返信 編集キー/
■14353 / inTopicNo.5)  Re[4]: DataGridViewの変更をアクセスデータベースに反映
□投稿者/ やじゅ (166回)-(2008/02/15(Fri) 18:59:20)
No14352 (いの さん) に返信
> SQL = UPDATE テーブル SET チェックボックスの列の名前 = " & Row(CheckBox1.Text) & " And 数値型の列の名前 = " & Row(Label.Text) & " WHERE 列の名前 = " & Row(Label.Text, DataRowVersion.Original) & ""

"And"が違うと思います、","ではないですか?
引用返信 編集キー/
■14354 / inTopicNo.6)  Re[5]: DataGridViewの変更をアクセスデータベースに反映
□投稿者/ いの (6回)-(2008/02/15(Fri) 19:31:18)
No14353 (やじゅ さん) に返信
返信ありがとうございます。

"And"の部分を","に変更してみましたが、依然変更した列はテーブルには属していませんというエラーが出ています。
SQL文の前にE(OleDb.OleDbCommand)でもSQLで書いているのですが、そちらも"And"で繋げて書いていますが、問題なく動いています。
またお気づきの箇所があれば宜しくお願いします。

引用返信 編集キー/
■14495 / inTopicNo.7)  Re[6]: DataGridViewの変更をアクセスデータベースに反映
□投稿者/ いの (7回)-(2008/02/20(Wed) 00:56:57)
最後の返信から少し時間がたっていますがまた質問させていただきます。

単純なUPDATE句を用いたプログラムですが、無事更新されるようになりました。
Row("")の括弧の中身が間違っていました。
単純な間違いをしていた事に気づくのにかなり時間がかかってしまい何度も質問してしまい申し訳ありませんでした。

簡単な方のプログラムを元に本家も修正しました。
エラーは出なくなりましたが、依然としてデータベースの更新がうまくいっていません。
AcceptChangesメソッドを走らせる前に更新前の値と更新後(プログラム上しているはず)の値を調べましたが、
きちんと変更されていました。

単純なUPDATE句を用いたプログラムと更新のプログラムは同じにしている(UPDATE句が違うだけ)のにもかかわらず、
更新されない理由が見当もつきません。
何かお気づきになることがあればご教授願います。


引用返信 編集キー/
■14620 / inTopicNo.8)  Re[7]: DataGridViewの変更をアクセスデータベースに反映
□投稿者/ いの (8回)-(2008/02/23(Sat) 02:19:40)
また書き込みさせていただきます。

単純なUPDATE句を用いたプログラムにチェックボックスの列を追加して数字とチェックボックスの列のプログラムを走らせてみたところ、数字の列を変更して更新してもチェックボックスの状態の数値が入るようになってしまいます。
次に、チェックボックスの列のチェックを変更してみましたが変更されていません。
DataGridViewには、数字・チェックボックスの列共に値は反映されているのですが、データベースまでは反映されていません。
チェックボックスを入れると何か特別な挙動でもするのでしょうか?
度々済みませんが分かることがあれば宜しくお願いします。


引用返信 編集キー/
■14622 / inTopicNo.9)  Re[8]: DataGridViewの変更をアクセスデータベースに反映
□投稿者/ いの (9回)-(2008/02/23(Sat) 13:34:00)
色々ありましたが無事更新されるようになりました。
やじゅ様、何度も返信ありがとうございました。
この場をかりてお礼申しあげます。

解決済み
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -