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

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

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

MySQLデータ更新

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

■94451 / inTopicNo.1)  MySQLデータ更新
  
□投稿者/ あい (32回)-(2020/04/13(Mon) 16:03:19)

分類:[.NET 全般] 

VB.Net 2010
MySQL

DataGridViewにDBから取得したデータを表示しています。
その表示しているデータを編集した場合に、その内容をDBに反映(更新)したいと考えております。
UPDATEコードはできているのですが、MySqlParameterにDataGridViewのValueの入れ方が分かりません。

 'データ保存
 Private Sub Save_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Save.Click
        Dim r As DataGridViewRow
    
    'MySqlConnectionセット
    
    'MySqlCommand(UPDATE)セット
    
    'パラメータセット
        For Each r In DataGridView1.SelectedRows
            cmd.Parameters.Add(New MySqlParameter("UPDATE", DataGridView1.Rows(r).Cells(0).Value))
        Next r
    End Sub

問題のところのみ書きました。cmdはMySqlCommandです。

パラメータセットの部分なんですが、New MySqlParameterのところでエラーメッセージが表示されてしまいます。
「型 System.Windows.Form.DataGridViewの値をIntegerに変換できません。」
どのようにすればいいのでしょうか?

宜しくお願い致します。

引用返信 編集キー/
■94458 / inTopicNo.2)  Re[1]: MySQLデータ更新
□投稿者/ WebSurfer (2038回)-(2020/04/13(Mon) 16:44:58)
No94451 (あい さん) に返信

今のやり方をかなり変えることになるかもしれませんが・・・

> DataGridViewにDBから取得したデータを表示しています。
> その表示しているデータを編集した場合に、その内容をDBに反映(更新)したいと考えております。

DataGridView などを UI として非接続型のデータ更新を行う場合は、

DataGridview ⇔ BindingSource / BindingNavigator ⇔ DataSet / DataTable ⇔ DataAdapter⇔ SQL Server

と言う構造にすることをお勧めします。Visual Studio のデータソース構成ウィザードを利用して型付 DataSet +
TableAdapter を作って、それを利用してアプリを作ると、以下のページの図のような構造のアプリが、ほとんど
自分でコードを書くこと無しに作れます。

Windows フォーム アプリケーションでのデータへの接続
https://docs.microsoft.com/ja-jp/previous-versions/wxt2cwcc(v=vs.120)

作り方は、DB が SQL Server の場合ですが、以下のチュートリアルを見てください。

チュートリアル : データベースへのデータの保存 (単一テーブル)
https://docs.microsoft.com/ja-jp/previous-versions/0f92s97z(v=vs.120)

10 行でズバリ !! 非接続型のデータ アクセス
https://github.com/microsoftarchive/msdn-code-gallery-community-0-9-non-alphabetic/tree/master/10%20%E8%A1%8C%E3%81%A7%E3%82%BA%E3%83%90%E3%83%AA%20!!%20%E9%9D%9E%E6%8E%A5%E7%B6%9A%E5%9E%8B%E3%81%AE%E3%83%87%E3%83%BC%E3%82%BF%20%E3%82%A2%E3%82%AF%E3%82%BB%E3%82%B9%20(ADO.NET)%20(VB)

MySQL でも MySQL for Visual Studio, Connector/NET をインストールすれば同等のことができます。(バージ
ョン不一致の問題を修正しなければならないかもしれませんが)

データソース構成ウィザードを利用してアプリを作るとどうなるかというと、以下の記事の「非接続型のデータ更新」
のセクションの図1と図2を見てください。

DB 設計者のための明解 ADO.NET 第 1 回
https://docs.microsoft.com/ja-jp/previous-versions/cc482903(v=msdn.10)

そのような構造のアプリにすれば、ユーザーが DataGridView を操作した結果は図1にあるように DataSet /
DataTable に反映されます。

編集作業が終了後、ユーザーが更新ボタンをクリックすれば、図2のように DataAdapter によって SQL が自動発行
され、DB のテーブルが更新されます。

自力で一からコードを書く場合のような種々の問題に悩むことはなくなり、開発工数は激減するはずです。保守工数
も減るはずです。お試しください。
引用返信 編集キー/
■94472 / inTopicNo.3)  Re[2]: MySQLデータ更新
□投稿者/ あい (33回)-(2020/04/14(Tue) 13:06:14)
No94458 (WebSurfer さん) に返信

ご回答ありがとうございます。
データソース構成ウィザードに関しては存じております。
ただ今回は使用しない方向で考えているため、今後の勉強として学ばせていただきます。
一通り目を通そうと思ったのですが、何故かどれもURLが開きませんでした。

もしよろしければ、データソース構成ウィザードを使用しない場合を教えていただけたらと思います。
宜しくお願い致します。
引用返信 編集キー/
■94473 / inTopicNo.4)  Re[1]: MySQLデータ更新
□投稿者/ Hongliang (996回)-(2020/04/14(Tue) 13:39:39)
> パラメータセットの部分なんですが、New MySqlParameterのところでエラーメッセージが表示されてしまいます。
> 「型 System.Windows.Form.DataGridViewの値をIntegerに変換できません」
> どのようにすればいいのでしょうか?

rがDataGridViewRowなので、DataGridView1.Rows(r)は意味不明です。
r.Cells(以下略 で十分です。

// ほかにも首をひねる箇所はありますが、オリジナルコードから限定的に抜き出されているだけかもしれないので何とも言えません。
引用返信 編集キー/
■94474 / inTopicNo.5)  Re[3]: MySQLデータ更新
□投稿者/ WebSurfer (2040回)-(2020/04/14(Tue) 14:04:04)
No94472 (あい さん) に返信

> 一通り目を通そうと思ったのですが、何故かどれもURLが開きませんでした。

http から終わりまで URL をコピーして、それをブラウザのアドレスバーに張り付けて移動させてください。
それで 4 つ全て表示されます。

> もしよろしければ、データソース構成ウィザードを使用しない場合を教えていただけたらと思います。

「データソース構成ウィザードを使用しない場合」というわけではなく、質問に書かれているコードをどの
ように直せばいいかということが聞きたいのだと思いますが、今質問に提供されている情報だけでは分かり
ません。
引用返信 編集キー/
■94475 / inTopicNo.6)  Re[2]: MySQLデータ更新
□投稿者/ あい (34回)-(2020/04/14(Tue) 14:41:56)
No94473 (Hongliang さん) に返信

ご回答ありがとうございます。

> rがDataGridViewRowなので、DataGridView1.Rows(r)は意味不明です。
> r.Cells(以下略 で十分です。
確かに言われてみればそうでした…。

>// ほかにも首をひねる箇所はありますが、オリジナルコードから限定的に抜き出されているだけかもしれないので何とも言えません。

http://www.moonmile.net/blog/archives/1298
上記のURLを参考に書いていました。
MySqlParameter()の中身を変更してそのままの形で使用していました。

教えていただいた通り変更してもできなかったので、やり方が違うのでしょうか。
DataGridViewを使用してデータベースを更新する場合はどのようにしたらいいのでしょうか?

引用返信 編集キー/
■94476 / inTopicNo.7)  Re[3]: MySQLデータ更新
□投稿者/ 魔界の仮面弁士 (2685回)-(2020/04/14(Tue) 15:15:21)
No94475 (あい さん) に返信
> DataGridViewを使用してデータベースを更新する場合はどのようにしたらいいのでしょうか?

DataGridView は、TextBox や ComboBox などと同様、
表示・入力・選択を行うために使われますが、
実際に値を保持しているのは、通常は DataSet/DataTable です。


DataGridView に DataSource を割り当てず、直接セルの値を読み書きすることも
出来なくもないですが、手間もかかりますしパフォーマンスも悪いので、
通常は DataSource にバインドして使うようにします。


そして、DataGridView 等で編集された情報(行追加、行削除、行編集、未変更行)は
すべて DataTable に保持されています。そのため、DataGridView の各行を
列挙して変更点を取り出すようなことは、あまり行われません。


編集結果を保持している DataSet あるいは DataTable を、
MySqlDataAdapter の Update メソッドに渡すだけで更新処理は完了します。
ループ処理も不要です。


この時の MySqlDataAdapter は、事前に MySqlCommandBuilder を用いて、
SELECT 文から、Insert/Delete/UpdateCommand を自動生成しておく必要がありますが、
これにより、DataTable 内の編集情報を元に、自動的に適切な INSERT/DELETE/UPDATE の
SQL が、自動的にそれぞれ呼び出されるという寸法です。


言葉だけだと分からないと思うので、コードで示すとこんな感じです。
C# のコードですが、イメージはつかめるかと思います。
https://ameblo.jp/tetsuya-staff/entry-10157130800.html



ここで用いた MySqlCommandBuilder は、更新用クエリを生成するためのもので、
個別に生成するなら
 adapter = New MySqlDataAdapter(selectSQL, MySqlConnectionオブジェクト)
 builder = New MySqlCommandBuilder(adapter)
 adapter.UpdateCommand = builder.GetUpdateCommand()
 adapter.DeleteCommand = builder.GetDeleteCommand()
 adapter.InsertCommand = builder.GetInsertCommand()
などのようにもできますが、結合条件を含むような複雑な SQL 文など、
MySqlCommandBuilder で自動生成できない場合には、MySqlCommandBuilder を用いずに、
MySqlDataAdapter の UpdateCommand 等を自分で構築しても構いません。


なお、データソース構成ウィザードなどによる「型付 DataSet の TableAdapter」を使えば、
この MySqlDataAdapter 等の構築をデザイン時に行うこともできます。
デザイナーを使わない方が融通が利くこともありますが…。

引用返信 編集キー/

このトピックをツリーで一括表示


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

このトピックに書きこむ