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

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

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

Re[7]: DataGridViewの変更値をDBに更新


(過去ログ 115 を表示中)

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

■67784 / inTopicNo.1)  DataGridViewの変更値をDBに更新
  
□投稿者/ SUM (1回)-(2013/09/01(Sun) 23:03:41)

分類:[.NET 全般] 

環境
WindowsXP
VB2005
SQLserver2008

お世話になります。

職場でOracleとVBで開発をしており、復習を兼ねて
家で簡単なシステムを作っているのですが、
家ではSQLServerの為もあるのか、うまくいかないので
ご教授願います。

DataGridViewにDBのデータを表示させていまして、
値を変更して更新ボタンを押すとDBに更新させるという処理が
どうもうまくいきません。。(最下行の値のみ更新されています)

DataGridViewには以下の列があり、修正可能項目はCASEとBIKOUです。

No Cd CASE BIKOU

DBのテーブルには更新日付項目(UPDATEDT)を設けており、
更新を行った日時を設定するようにしています。

Noは数値で、あとは文字扱いです。
テストデータとして、3行分表示させており、
CASEとBIKOUの値を3行共変えて更新しますと、
最下行のCASEとBIKOUの値のみ更新されている状態です。

以下コードです。

    Private Sub btnF6_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnF6.Click

        Dim con As SqlConnection
        Dim sql As String
        Dim adapter As SqlDataAdapter
        Dim commandBuilder As SqlCommandBuilder
        Dim dataTable As New DataTable()
        Dim row As DataRow = Nothing
        Dim dateNow As DateTime = DateTime.Now
        Dim rows() As DataRow
        Dim No As Integer
        Dim Cd As String
        Dim i As Integer
        Dim j As Integer

        con = New SqlConnection()

        'Using con
        '---<< 接続文字列の設定>>---
        con.ConnectionString = _
        "Data Source=.\SQLEXPRESS;" & _
        "AttachDbFilename=" & _
        """C:\Program Files\Microsoft SQL Server\MSSQL10.SQLEXPRESS\MSSQL\DATA\Test.mdf"";" & _
        "Integrated Security=True;" & _
        "Connect Timeout=30;" & _
        "User Instance=True"

        'DBを開く
        con.Open()

        For i = 0 To DataGridView.RowCount - 1

            'No
            No = DataGridView("No", i).Value

            '倉庫コード
            Cd = DataGridView("Cd", i).Value

            'SQL文の作成
            sql = "SELECT * FROM TESTTABLE WHERE No = " & No & _
                           " AND Cd = " & "'" & Cd & "'"


        Next

        adapter = New SqlDataAdapter()

        adapter.SelectCommand = New SqlCommand(sql, con)

        adapter.SelectCommand.CommandType = CommandType.Text

        adapter.Fill(dataTable)

        '更新コマンドの作成
        commandBuilder = New SqlCommandBuilder(adapter)

        For j = 0 To DataGridView.RowCount - 1

            'No
            No = DataGridView("No", j).Value

            'コード
            Cd = DataGridView("Cd", j).Value

            adapter = New SqlDataAdapter()

            adapter.SelectCommand = New SqlCommand(sql, con)

            adapter.SelectCommand.CommandType = CommandType.Text

            adapter.Fill(dataTable)

            '更新コマンドの作成
            commandBuilder = New SqlCommandBuilder(adapter)

            rows = dataTable.Select()

            If rows.Count > 0 Then
                '既存行の取得
                row = dataTable.Rows(0)
                row.BeginEdit()

            Else

            End If

            '' データのセット
            row("CASE") = DataGridView("CASE", j).Value
            row("BIKOU") = DataGridView("BIKOU", j).Value
            row("UPDATEDT") = dateNow

            If rows.Count > 0 Then
                row.EndEdit()
            Else

            End If

            ' データの更新
            adapter.Update(dataTable)

        Next

        MsgBox("データを更新しました。")

        con.Close()

    End Sub

引用返信 編集キー/
■67785 / inTopicNo.2)  Re[1]: DataGridViewの変更値をDBに更新
□投稿者/ WebSurfer (38回)-(2013/09/02(Mon) 07:59:12)
No67784 (SUM さん) に返信
> 環境
> WindowsXP
> VB2005
> SQLserver2008
>
> お世話になります。
>
> 職場でOracleとVBで開発をしており、復習を兼ねて
> 家で簡単なシステムを作っているのですが、
> 家ではSQLServerの為もあるのか、うまくいかないので
> ご教授願います。

家で SQL Server + SqlClient を使ったアプリは期待通りに動くが、それをそのまま職場の Oracle 環境で動かすと期待通りに動かないと言ってますか? ODP.NET を使わないのは何故ですか?
引用返信 編集キー/
■67787 / inTopicNo.3)  Re[2]: DataGridViewの変更値をDBに更新
□投稿者/ しま (24回)-(2013/09/02(Mon) 09:56:10)
No67784 (SUM さん) に返信

提示されているコード中に For 文が2つありますが、
最初の For 文中で生成しているクエリー (変数 sql の select 文)を二つ目の For 文中で使っています。

DataGridView にある最後の行(この DataGridView は行の追加が出来ない設定らしい)のデーターを取得する
select 文が文字列 sql に残るので、この sql を使って
>    adapter.Fill(dataTable)
 adapter を用いて dataTable に 読込んでいるから、No と Cd との値が最後の行の値なので

dataTable にはそれ以外の No と Cd との値の組合せの行がないことになります。
なので、最後の行だけが更新対象になっているという結果なのでしょう。

使っているのは SQL Server 2008 ではなく、 SQL Server 2008 Express ですか?

引用返信 編集キー/
■67791 / inTopicNo.4)  Re[3]: DataGridViewの変更値をDBに更新
□投稿者/ WebSurfer (39回)-(2013/09/02(Mon) 13:40:03)
No67787 (しま さん) に返信
> ■No67784 (SUM さん) に返信
>
> 提示されているコード中に For 文が2つありますが、
> 最初の For 文中で生成しているクエリー (変数 sql の select 文)を二つ目の For 文中で使っています。
>
> DataGridView にある最後の行(この DataGridView は行の追加が出来ない設定らしい)のデーターを取得する
> select 文が文字列 sql に残るので、この sql を使って
>> adapter.Fill(dataTable)
> adapter を用いて dataTable に 読込んでいるから、No と Cd との値が最後の行の値なので
>
> dataTable にはそれ以外の No と Cd との値の組合せの行がないことになります。
> なので、最後の行だけが更新対象になっているという結果なのでしょう。
>
> 使っているのは SQL Server 2008 ではなく、 SQL Server 2008 Express ですか?

しまさんのレスを見て期がつきましたが、「職場でOracleとVBで開発」は今回の問題とは全然関係がなくて、要するにアップされたコードが自宅での SQL Server 環境で期待通りに動かない(最下行の値のみ更新されています)ということのようですね。

その理解で、アップされたコードを拝見しましたが、失礼ながらはっきり言ってメチャクチャで、ちょっと修正すれば動くというレベルではありません。まずは、ADO.NET に関する基本的な知識を実につけ、さらに Visual Studio の自動ツールを使って DB を更新するための know-how を習得したからでないと、「開発」はおぼつかないと思います。

ADO.NET の基本は以下のページが参考になると思います。図1、図2を見てください。DataGridView をユーザーインターフェイスとして、ユーザーが追加・削除・修正を DataSet へ入力し、DataAdapter を使って「メモリ内での更新後の DataSet」の内容に従ってデータベースに Update, Delete, Insert をかけるというのが基本です。DataAdapter.Update メソッドを呼び出せば、全て自動的に DataSet と DataAdapter が行うので、プログラマが DataSet の中身を見ながらループを回して処置するコードを書く必要はありません。

DB 設計者のための明解 ADO.NET 第 1 回
http://msdn.microsoft.com/ja-jp/events/dd231281.aspx


上記のページはちょっと古いので普通の DataSet と DataAdapter をベースに書かれていますが、.NET 2.0 から型付 DataSet + TableAdapter と BindingSource + BindingNavigator を利用できます。以下のページにある図がその基本形です。

Visual Studio でのデータへの接続の概要
http://msdn.microsoft.com/ja-jp/library/wxt2cwcc(VS.80).aspx


この基本形のアプリであれば、Visual Studio の自動ツールを使って、ほとんど自力でコードを書かなくてもアプリを作ることができます。以下のチュートリアルを参考に作ってみてください。

チュートリアル : データベースへのデータの保存 (単一テーブル)
http://msdn.microsoft.com/ja-jp/library/0f92s97z(VS.80).aspx

10 行でズバリ !! 非接続型のデータ アクセス (ADO.NET) (VB)
http://code.msdn.microsoft.com/10-ADONET-VB-1c64942f/
引用返信 編集キー/
■67797 / inTopicNo.5)  Re[4]: DataGridViewの変更値をDBに更新
□投稿者/ SUM (2回)-(2013/09/02(Mon) 23:17:26)
No67791 (WebSurfer さん) に返信
> ■No67787 (しま さん) に返信
>>■No67784 (SUM さん) に返信
>>
>>提示されているコード中に For 文が2つありますが、
>>最初の For 文中で生成しているクエリー (変数 sql の select 文)を二つ目の For 文中で使っています。
>>
>>DataGridView にある最後の行(この DataGridView は行の追加が出来ない設定らしい)のデーターを取得する
>>select 文が文字列 sql に残るので、この sql を使って
> >>   adapter.Fill(dataTable)
>> adapter を用いて dataTable に 読込んでいるから、No と Cd との値が最後の行の値なので
>>
>>dataTable にはそれ以外の No と Cd との値の組合せの行がないことになります。
>>なので、最後の行だけが更新対象になっているという結果なのでしょう。
>>
>>使っているのは SQL Server 2008 ではなく、 SQL Server 2008 Express ですか?
> 
> しまさんのレスを見て期がつきましたが、「職場でOracleとVBで開発」は今回の問題とは全然関係がなくて、要するにアップされたコードが自宅での SQL Server 環境で期待通りに動かない(最下行の値のみ更新されています)ということのようですね。
> 
> その理解で、アップされたコードを拝見しましたが、失礼ながらはっきり言ってメチャクチャで、ちょっと修正すれば動くというレベルではありません。まずは、ADO.NET に関する基本的な知識を実につけ、さらに Visual Studio の自動ツールを使って DB を更新するための know-how を習得したからでないと、「開発」はおぼつかないと思います。
> 
> ADO.NET の基本は以下のページが参考になると思います。図1、図2を見てください。DataGridView をユーザーインターフェイスとして、ユーザーが追加・削除・修正を DataSet へ入力し、DataAdapter を使って「メモリ内での更新後の DataSet」の内容に従ってデータベースに Update, Delete, Insert をかけるというのが基本です。DataAdapter.Update メソッドを呼び出せば、全て自動的に DataSet と DataAdapter が行うので、プログラマが DataSet の中身を見ながらループを回して処置するコードを書く必要はありません。
> 
> DB 設計者のための明解 ADO.NET 第 1 回
> http://msdn.microsoft.com/ja-jp/events/dd231281.aspx
> 
> 
> 上記のページはちょっと古いので普通の DataSet と DataAdapter をベースに書かれていますが、.NET 2.0 から型付 DataSet + TableAdapter と BindingSource + BindingNavigator を利用できます。以下のページにある図がその基本形です。
> 
> Visual Studio でのデータへの接続の概要
> http://msdn.microsoft.com/ja-jp/library/wxt2cwcc(VS.80).aspx
> 
> 
> この基本形のアプリであれば、Visual Studio の自動ツールを使って、ほとんど自力でコードを書かなくてもアプリを作ることができます。以下のチュートリアルを参考に作ってみてください。
> 
> チュートリアル : データベースへのデータの保存 (単一テーブル)
> http://msdn.microsoft.com/ja-jp/library/0f92s97z(VS.80).aspx
> 
> 10 行でズバリ !! 非接続型のデータ アクセス (ADO.NET) (VB)
> http://code.msdn.microsoft.com/10-ADONET-VB-1c64942f/



>しま さん
ありがとうございます。
SQL Server 2008 Expressを使用しています。
ご指摘の通り余分なLoopがあり、修正してなんとか想定する動きになりました。

>WebSurfer さん
ありがとうございます。
元になる参考のコードを上司にもらって作成していたので、
ODP.NETは使用していませんでした。
参考サイトを教えて頂き、ありがとうございます。
もっと知識を深めていきたいと思います。

以下のコードで想定する動きができました。
ありがとうございました。


    Private Sub btnF6_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) _
	Handles btnF6.Click

        Dim con As SqlConnection
        Dim sql As String
        Dim adapter As SqlDataAdapter
        Dim commandBuilder As SqlCommandBuilder
        Dim dataTable As New DataTable()
        Dim row As DataRow = Nothing
        Dim dateNow As DateTime = DateTime.Now
        Dim rows() As DataRow
        Dim No As Integer
        Dim Cd As String
        Dim i As Integer

        con = New SqlConnection()

        'Using con
        '---<< 接続文字列の設定>>---
        con.ConnectionString = _
        "Data Source=.\SQLEXPRESS;" & _
        "AttachDbFilename=" & _
        """C:\Program Files\Microsoft SQL Server\MSSQL10.SQLEXPRESS\MSSQL\DATA\Test.mdf"";" & _
        "Integrated Security=True;" & _
        "Connect Timeout=30;" & _
        "User Instance=True"

        'DBを開く
        con.Open()

        For i = 0 To DataGridView.RowCount - 1

            'No
            No = DataGridView("No", i).Value

            'コード
            Cd = DataGridView("Cd", i).Value

            sql = Nothing

            'SQL文の作成
            sql = "SELECT * FROM TESTTABLE WHERE No = " & No & _
                           " AND Cd = " & "'" & Cd & "'"

            adapter = New SqlDataAdapter()

            adapter.SelectCommand = New SqlCommand(sql, con)

            adapter.SelectCommand.CommandType = CommandType.Text

            dataTable.Clear()

            adapter.Fill(dataTable)

            '更新コマンドの作成
            commandBuilder = New SqlCommandBuilder(adapter)

            rows = dataTable.Select()

            If rows.Count > 0 Then
                '既存行の取得
                row = dataTable.Rows(0)
                row.BeginEdit()

            Else

            End If

            '' データのセット
            row("CASE") = DataGridView("CASE", i).Value
            row("BIKOU") = DataGridView("BIKOU", i).Value
            row("UPDATEDT") = dateNow

            If rows.Count > 0 Then
                row.EndEdit()
            Else

            End If

            ' データの更新
            adapter.Update(dataTable)

        Next

        MsgBox("データを更新しました。")

        con.Close()

    End Sub



解決済み
引用返信 編集キー/
■67799 / inTopicNo.6)  Re[5]: DataGridViewの変更値をDBに更新
□投稿者/ WebSurfer (40回)-(2013/09/03(Tue) 02:12:30)
No67797 (SUM さん) に返信
> >WebSurfer さん
> ありがとうございます。
> 元になる参考のコードを上司にもらって作成していたので、
> ODP.NETは使用していませんでした。

すみません、はっきり言わさせていただきます。依然としてメチャクチャです。もし上司の方がこのコードで OK というなら、あなたの会社にはソフト開発は依頼したくないレベルです。上司の方に伝えておいていただければと思います。
引用返信 編集キー/
■67816 / inTopicNo.7)  Re[6]: DataGridViewの変更値をDBに更新
□投稿者/ SUM (3回)-(2013/09/04(Wed) 00:56:19)
No67799 (WebSurfer さん) に返信
> ■No67797 (SUM さん) に返信
>>>WebSurfer さん
>>ありがとうございます。
>>元になる参考のコードを上司にもらって作成していたので、
>>ODP.NETは使用していませんでした。
>
> すみません、はっきり言わさせていただきます。依然としてメチャクチャです。もし上司の方がこのコードで OK というなら、あなたの会社にはソフト開発は依頼したくないレベルです。上司の方に伝えておいていただければと思います。

ただ批判するだけでなく、どこがどう悪いのか指摘頂けないのが残念です。
掲示板は批判する場所ではないと思いますが。。
解決済み
引用返信 編集キー/
■67823 / inTopicNo.8)  Re[7]: DataGridViewの変更値をDBに更新
□投稿者/ WebSurfer (41回)-(2013/09/04(Wed) 10:33:50)
No67816 (SUM さん) に返信
> ■No67799 (WebSurfer さん) に返信
>>■No67797 (SUM さん) に返信
> >>>WebSurfer さん
> >>ありがとうございます。
> >>元になる参考のコードを上司にもらって作成していたので、
> >>ODP.NETは使用していませんでした。
>>
>>すみません、はっきり言わさせていただきます。依然としてメチャクチャです。もし上司の方がこのコードで OK というなら、あなたの会社にはソフト開発は依頼したくないレベルです。上司の方に伝えておいていただければと思います。
>
> ただ批判するだけでなく、どこがどう悪いのか指摘頂けないのが残念です。
> 掲示板は批判する場所ではないと思いますが。。

先のレスでとっくに指摘しています。あなたがレスを読んでない(もしくは理解できない)だけ。一番重要なポイントをもう一度書きます。よく読んで理解してください。

ADO.NET の基本は以下のページが参考になると思います。図1、図2を見てください。DataGridView をユーザーインターフェイスとして、ユーザーが追加・削除・修正を DataSet へ入力し、DataAdapter を使って「メモリ内での更新後の DataSet」の内容に従ってデータベースに Update, Delete, Insert をかけるというのが基本です。DataAdapter.Update メソッドを呼び出せば、全て自動的に DataSet と DataAdapter が行うので、プログラマが DataSet の中身を見ながらループを回して処置するコードを書く必要はありません。

DB 設計者のための明解 ADO.NET 第 1 回
http://msdn.microsoft.com/ja-jp/events/dd231281.aspx


引用返信 編集キー/


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

このトピックに書きこむ

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

管理者用

- Child Tree -