tagCANDY CGI VBレスキュー(花ちゃん) の Visual Basic 2010 用 掲示板(VB.NET 掲示板) [ツリー表示へ]   [Home]
一括表示(VB.NET VB2005)
タイトルDataGridViewでDate型カラムを更新するとエラーになる
記事No7171
投稿日: 2008/03/09(Sun) 22:14
投稿者teraman
1.DataGridViewコントロールにバインドして更新するとき、Date型の値を更新するとエラー(UPDATE ステートメントの構文エラーです。)になります。Text型は正常に動作します。原因が解かりません。

2.以下のHPを参考にSqlからOleDbへ変更して動作確認しました。
ms-help://MS.VSCC.v80/MS.MSDN.v80/MS.VisualStudio.v80.ja/dv_fxmclictl/html/1660f69c-5711-45d2-abc1-e25bc6779124.htm


3.以下のプログラムを貼り付けてMdbファイルを変更して確認できます。
Imports System
Imports System.Data
Imports System.Data.OleDb
Imports System.Windows.Forms

Public Class Form1
    Inherits System.Windows.Forms.Form

    Private dataGridView1 As New DataGridView()
    Private bindingSource1 As New BindingSource()
    Private dataAdapter As New OleDb.OleDbDataAdapter
    Private WithEvents reloadButton As New Button()
    Private WithEvents submitButton As New Button()

    <STAThreadAttribute()> _
    Public Shared Sub Main()
        Application.Run(New Form1())
    End Sub
    Public Sub New()

        ' この呼び出しは、Windows フォーム デザイナで必要です。
        InitializeComponent()

        ' InitializeComponent() 呼び出しの後で初期化を追加します。
        Me.dataGridView1.Dock = DockStyle.Fill

        Me.reloadButton.Text = "reload"
        Me.submitButton.Text = "submit"

        Dim panel As New FlowLayoutPanel()
        panel.Dock = DockStyle.Top
        panel.AutoSize = True
        panel.Controls.AddRange(New Control() {Me.reloadButton, Me.submitButton})

        Me.Controls.AddRange(New Control() {Me.dataGridView1, panel})
        Me.Text = "DataGridView databinding and updating demo"

    End Sub

    Private Sub Form1_Load(ByVal sender As Object, ByVal e As System.EventArgs) _
        Handles Me.Load

        ' Bind the DataGridView to the BindingSource
        ' and load the data from the database.
        Me.dataGridView1.DataSource = Me.bindingSource1
        GetData("select * from ProjectRev")

    End Sub

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

        ' Reload the data from the database.
        GetData(Me.dataAdapter.SelectCommand.CommandText)

    End Sub

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

        ' Update the database with the user's changes.
        Me.dataAdapter.Update(CType(Me.bindingSource1.DataSource, DataTable))

    End Sub

    Private Sub GetData(ByVal selectCommand As String)

        Try
            ' Specify a connection string. Replace the given value with a
            ' valid connection string for a Northwind SQL Server sample
            ' database accessible to your system.
            Dim connectionString As String = String.Concat("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\Users\terada\Desktop\TEST.mdb ;Persist Security Info=False;")

            ' Create a new data adapter based on the specified query.
            Me.dataAdapter = New OleDb.OleDbDataAdapter(selectCommand, connectionString)

            ' Create a command builder to generate SQL update, insert, and
            ' delete commands based on selectCommand. These are used to
            ' update the database.
            Dim commandBuilder As New OleDb.OleDbCommandBuilder(Me.dataAdapter)

            ' Populate a new data table and bind it to the BindingSource.
            Dim table As New DataTable()
            table.Locale = System.Globalization.CultureInfo.InvariantCulture
            Me.dataAdapter.Fill(table)
            Me.bindingSource1.DataSource = table

            ' Resize the DataGridView columns to fit the newly loaded content.
            Me.dataGridView1.AutoResizeColumns( _
                DataGridViewAutoSizeColumnsMode.AllCellsExceptHeader)
        Catch ex As OleDb.OleDbException
            MessageBox.Show("To run this example, replace the value of the " + _
                "connectionString variable with a connection string that is " + _
                "valid for your system.")
        End Try

    End Sub

End Class

[ツリー表示へ]
タイトルRe: DataGridViewでDate型カラムを更新するとエラーになる
記事No7172
投稿日: 2008/03/09(Sun) 23:24
投稿者魔界の仮面弁士
> 1.DataGridViewコントロールにバインドして更新するとき、Date型の値を更新するとエラー(UPDATE ステートメントの構文エラーです。)になります。Text型は正常に動作します。原因が解かりません。

MDB の日付型の列は、初期状態では OleDbType.DBDate ではなく
OleDbType.Date にマッピングされますので、それが原因では無いでしょうか。

UpdateCommand に指定された CommandText と Parameters の内容を確認してみてください。

DBDate の場合、時刻部が切り捨てられてしまうため、本来とは異なる日時となります。
そのため、時刻部が 0時0分0秒ちょうどの場合は問題なく更新されますが、それ以外の
場合、UPDATE の SQL が、(1 件更新されるはずが)処理件数が 0 件という事になり、
更新時にエラーを発生させることがあります。


> 2.以下のHPを参考にSqlからOleDbへ変更して動作確認しました。
> ms-help://MS.VSCC.v80/MS.MSDN.v80/MS.VisualStudio.v80.ja/dv_fxmclictl/html/1660f69c-5711-45d2-abc1-e25bc6779124.htm
これはローカルヘルプのアドレスですね。Web 版だとこちら。
http://msdn2.microsoft.com/ja-jp/library/fbk67b6z.aspx

[ツリー表示へ]
タイトル削除
記事No7175
投稿日: 2008/03/10(Mon) 15:18
投稿者teraman
削除します。

[ツリー表示へ]
タイトルRe^3: DataGridViewでDate型カラムを更新するとエラーになる
記事No7176
投稿日: 2008/03/10(Mon) 15:28
投稿者teraman
お騒がせして申し訳ありませんでした。
原因は動的に作成したテーブルのフィールド名を[DATE]としたのが原因でした。
[DATE]は予約語と解ってはいましたが、各種のクエリは問題なく動作するのですが、
データアダプタのUpdateではエラーになることが解りました。
予約語は[]で明記してクエリを作成できるので問題はないのですが、
データアダプタのUpdateは原理的に駄目だと気付きました。
魔界の仮面弁士さん ありがとうございました。

[ツリー表示へ]