DataGridViewの更新

タグの編集
投稿者 Zi  (社会人) 投稿日時 2009/10/16 03:09:43
DataGridViewの更新方法で手間取っているので質問に来ました。
データを削除して更新を行おうとすると、クエリ式A=データの数値の構文エラーですとエラーが出てできません。なぜなのでしょうか?

ソースです。
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
'▼データ取得
SQLCm.CommandText = "SELECT 1列目,2列目,3列目 FROM T_データマスタ"
Adapter.Fill(Table)

'▼値の表示
DataGridView1.DataSource = Table
'▼セルをクリックしたらその行が選択される
DataGridView1.MultiSelect = False
DataGridView1.SelectionMode = DataGridViewSelectionMode.FullRowSelect

'▼後処理
'Table.Dispose()
'Adapter.Dispose()
'SQLCm.Dispose()
'Cn.Dispose()
End Sub
'▼削除ボタン
Dim Cn As New OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=データフ                 ァイル.mdb")
Dim SQLCm As OleDbCommand = Cn.CreateCommand
Dim Adapter As New OleDbDataAdapter(SQLCm)
Dim Builder As New OleDbCommandBuilder(Adapter)
Dim Table As New DataTable

Private Sub btn_sakuzyo_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btn_sakuzyo.Click
Dim r As DataGridViewRow
    For Each r In DataGridView1.SelectedRows
        If Not r.IsNewRow Then
        DataGridView1.Rows.Remove(r)
        End If
    Next r
End Sub

Private Sub btn_save_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btn_save.Click

Dim Table As DataTable = DirectCast(DataGridView1.DataSource, DataTable)
For Each Row As DataRow In Table.Rows
Dim SQL As String = ""

Select Row.RowState
Case DataRowState.Deleted
'▼削除されたレコードの場合
SQL = "DELETE FROM T_データマスタ WHERE "
SQL &= " 1列目 = " & Row("1列目", DataRowVersion.Original)
Case Else
Continue For
End Select
SQLCm.CommandText = SQL
Try
Cn.Open()
SQLCm.ExecuteNonQuery()←ここでエラーが発生
Cn.Close()
Catch ex As Exception
MessageBox.Show(ex.Message)
End Try
Next
Table.Dispose()
SQLCm.Dispose()
Cn.Dispose()
End Sub

削除ボタンがエラーを起こしている要因の一つかもという懸念があるので削除ボタンものせておきました。
よろしくお願いします。
投稿者 るしぇ  (社会人) 投稿日時 2009/10/21 22:58:34
クエリ式の構文エラーと言われたら
SQL が間違っていますね。

実際問題、SQL 文をデータで直接編集するようなコードなので
SQLインジェクションを起こすようなデータも入れられてしまう
何でもありなプログラムです。実際に作成されている SQL 文
次第で何が起こっても不思議でないかと。

あと、フィールド名が数字始まりなのも良くないですね。
http://support.microsoft.com/kb/932994/ja

>SQL &= " 1列目 = " & Row("1列目", DataRowVersion.Original)
ま、全角半角混在しちゃってる時点で出直してこいって話ですが。
投稿者 daive  (社会人) 投稿日時 2009/10/21 23:45:26
るしぇ さんの、
>SQL が間違っていますね。
を確認するには、
MS-SQL2000 ならば、Enterprise Manager
MS-SQL2005以降ならば、Management Studio
で、
SQLCm.CommandText = SQL
のクエリを、実行してみるのが、手っ取り早い確認方法です。

MS-SQLでなかったり、SQL-CLIENTで接続していない場合は、
別のデータ接続を用意して、一時的に使う、テストクエリを入れてみたり、
EXCELなどをつかって、ADO用、クエリ発行-データ取得プログラムを作ってみるのもありかと。
(ADOがわかっている方なら、数時間で作れます。)
投稿者 るしぇ  (社会人) 投稿日時 2009/10/22 00:06:55
> SQLCm.CommandText = SQL
> のクエリを、実行してみるのが、手っ取り早い確認方法です。
エラーメッセージとしては同じものが出てくる可能性も高いのよね。。。
# 直接実行すれば追加情報が取れる場合もあるけど。

それで構文エラーだから SQL を多少勉強すれば解決するような内容
なんだろうけど、それができる人が
> なぜなのでしょうか?
なんて質問しないだろうし、フィールドのデータ型と照らし合わせて
こう変更したらこうなりましたくらいの事は言います。…プログラム
勉強し始めて3ヶ月の新人でできてます。。。

ま、VB 関係ない話題っぽいし、早いのは SQL の内容をここに投稿する
ことだろうねw
投稿者 zi  (社会人) 投稿日時 2009/10/26 23:13:28
すみません、結局Dataadaputerを利用して解決いたしました。
SQLに関しては、私はどうも理解力が低く単ではなんとかなるものの。
VBのような言語とからめられるとどのように処理してよいのかわからなくなってしまいます。
まぁ、勉強をして理解を深めろということなんでしょうけども。

ともかくとして、アドバイスありがとうございました。