tagCANDY CGI VBレスキュー(花ちゃん) の Visual Basic 2010 用 掲示板(VB.NET 掲示板) [ツリー表示へ]   [Home]
一括表示(VB.NET VB2005)
タイトルVB2010よりアクセスのデータ型YES/NO型の更新について
記事No10953
投稿日: 2012/11/15(Thu) 15:02
投稿者かっちゃん
アクセスフィールド
SubjectNo   長整数型
ClassNo     テキスト型
Kind        バイト型
Check       Yes/No型

VB2010

' データセットエリア
    Private StanderdMDs As New DataSet  
    Private StanderdMDt As New DataTable
    Dim wkstrSql As String ' SQLを指定

   ’アクセスから読み出し
    wkstrSql = "select *  from StanderdM ORDER BY SubjectNo Asc, ClassNo Asc, Kind Asc"
    Cmd.CommandText = wkstrSql
    Adp = New OleDbDataAdapter(Cmd)
    StanderdMDs = New DataSet
    Adp.Fill(StanderdMDs, "StanderdM")
    StanderdMDt = StanderdMDs.Tables("StanderdM")

    ' アクセスへ更新
    Dim dtrow As DataRow
    dtrow = StanderdMDt.NewRow
    dtrow("SubjectNo") = cboBox1.SelectedValue.ToString()
    dtrow("ClassNo") = Trim(cboBox2.SelectedValue.ToString())
    dtrow("Kind") = 20
    If chkBox3.CheckState = 0 Then
       dtrow("Check") = False
      Else
       dtrow("Check") = True
    End If
    StanderdMDt.Rows.Add(dtrow)
    Call SubmitChangesByHand()
  
    Private Sub SubmitChangesByHand()
        Dim cmdInsert As OleDbCommand = CreateInsertCommand()
        Dim row As DataRow
        Dim intRowsAffected As Integer
        Dim dvrs As DataViewRowState
        dvrs = DataViewRowState.ModifiedCurrent _
               Or DataViewRowState.Deleted Or DataViewRowState.Added
        For Each row In StanderdMDt.Select("", "", dvrs)
            Select Case row.RowState
                Case DataRowState.Added
                    intRowsAffected = SubmitInsert(row, cmdInsert)
            End Select
            If intRowsAffected = 1 Then
                row.AcceptChanges()
            Else
                row.RowError = "更新に失敗しました。"
            End If
        Next row
    End Sub

    Private Function CreateInsertCommand() As OleDbCommand
        Dim strSQL As String
        strSQL = "INSERT INTO [StanderdM] " & _
                 "   (SubjectNo, ClassNo, Kind, Check) " & _
                 "   VALUES (?, ?, ?, ?)"
        Dim cmd As New OleDbCommand(strSQL, Cnn)
        Dim pc As OleDbParameterCollection = cmd.Parameters
        pc.Add("SubjectNo", OleDbType.Integer)
        pc.Add("ClassNo", OleDbType.VarChar)
        pc.Add("Kind", OleDbType.TinyInt)
        pc.Add("Check", OleDbType.Boolean)
        Return cmd
    End Function

    Private Function SubmitInsert(ByVal row As DataRow, _
                                  ByVal cmd As OleDbCommand) As Integer
        Dim pc As OleDbParameterCollection = cmd.Parameters
        pc("SubjectNo").Value = row("SubjectNo")
        pc("ClassNo").Value = row("ClassNo")
        pc("Kind").Value = row("Kind")
        pc("Check").Value = row("Check")
        Return cmd.ExecuteNonQuery
    End Function

   ・ Return cmd.ExecuteNonQueryの箇所で下記のエラーがでてしまいます
  ”INSERT INTO ステートメントの構文エラーです。”
  ※ Checkの項目をはずして更新するとうまくいきます。
  
  よろしくお願いいたします

    追伸:サンプル投稿版の方に誤って書いてしまいました
     削除をよろしくお願いたします

[ツリー表示へ]
タイトルRe: VB2010よりアクセスのデータ型YES/NO型の更新について
記事No10954
投稿日: 2012/11/16(Fri) 10:50
投稿者魔界の仮面弁士
OleDbCommandBuilder を使わず、自分で INSERT 文を作成しているのですね?


> ※ Checkの項目をはずして更新するとうまくいきます。
"Check"という「列名」が原因です。
(同様の障害を起こす列名としては、"No" や "Update" などがあります)


>  strSQL = "INSERT INTO [StanderdM] " & _
>           "   (SubjectNo, ClassNo, Kind, Check) " & _
>           "   VALUES (?, ?, ?, ?)"

"( [SubjectNo], [ClassNo], [Kind], [Check]) " のように、
それぞれの列名を角括弧で囲めば、もしくは、Check という
フィールド名を改名することで解決するかと思います。



以下、本題とは関係のない所に反応。

>  strSQL = "INSERT INTO [StanderdM] " & _
「StanderdM」ではなく、
「StandardM」なのでは?


> Private StanderdMDs As New DataSet
> StanderdMDs = New DataSet

> Private StanderdMDt As New DataTable
> StanderdMDt = StanderdMDs.Tables("StanderdM")
この使い方なら、変数宣言時に New する必要は無いかと。


> dtrow("SubjectNo") = cboBox1.SelectedValue.ToString()
SubjectNo は「長整数型」なのですよね。

自動的に型変換されるとはいえ、Int32 を必要としているフィールドに
String を代入するというのは違和感が…。


> dtrow("Kind") = 20
バイト型に Int32 を代入しているようですが、こちらは許容範囲。


> If chkBox3.CheckState = 0 Then
これはおかしいです。

そもそも CheckState は、3状態チェックボックス(ThreeState)で
使われるべきプロパティです。True / False の 2状態なら、
 dtrow("Check") = chkBox3.Checked
のように、Checked As Boolean なプロパティを用いるべきかと。

仮に、CheckState プロパティを使う必要があるとしても、
「If chkBox3.CheckState = CheckState.Unchecked Then」
のように、CheckState 列挙体と比較するのが妥当です。

[ツリー表示へ]
タイトルRe^2: VB2010よりアクセスのデータ型YES/NO型の更新について
記事No10955
投稿日: 2012/11/16(Fri) 14:19
投稿者かっちゃん
> OleDbCommandBuilder を使わず、自分で INSERT 文を作成しているのですね?
>
>
> > ※ Checkの項目をはずして更新するとうまくいきます。
> "Check"という「列名」が原因です。
> (同様の障害を起こす列名としては、"No" や "Update" などがあります)
>
>
> >  strSQL = "INSERT INTO [StanderdM] " & _
> >           "   (SubjectNo, ClassNo, Kind, Check) " & _
> >           "   VALUES (?, ?, ?, ?)"
>
> "( [SubjectNo], [ClassNo], [Kind], [Check]) " のように、
> それぞれの列名を角括弧で囲めば、もしくは、Check という
> フィールド名を改名することで解決するかと思います。
>
>
>
> 以下、本題とは関係のない所に反応。
>
> >  strSQL = "INSERT INTO [StanderdM] " & _
> 「StanderdM」ではなく、
> 「StandardM」なのでは?
>
>
> > Private StanderdMDs As New DataSet
> > StanderdMDs = New DataSet
>
> > Private StanderdMDt As New DataTable
> > StanderdMDt = StanderdMDs.Tables("StanderdM")
> この使い方なら、変数宣言時に New する必要は無いかと。
>
>
> > dtrow("SubjectNo") = cboBox1.SelectedValue.ToString()
> SubjectNo は「長整数型」なのですよね。
>
> 自動的に型変換されるとはいえ、Int32 を必要としているフィールドに
> String を代入するというのは違和感が…。
>
>
> > dtrow("Kind") = 20
> バイト型に Int32 を代入しているようですが、こちらは許容範囲。
>
>
> > If chkBox3.CheckState = 0 Then
> これはおかしいです。
>
> そもそも CheckState は、3状態チェックボックス(ThreeState)で
> 使われるべきプロパティです。True / False の 2状態なら、
>  dtrow("Check") = chkBox3.Checked
> のように、Checked As Boolean なプロパティを用いるべきかと。
>
> 仮に、CheckState プロパティを使う必要があるとしても、
>  「If chkBox3.CheckState = CheckState.Unchecked Then」
> のように、CheckState 列挙体と比較するのが妥当です。

魔界の仮面弁士 様
更新できました。
ありがとうございました。

VB6.0からの変換で色々変更されておりまして苦労しております。
更新の方も"OleDbCommandBuilder"を使わずにロジックをくんでおります。
列名の制限には気づかず、何度もロジックを変えて困っているところでした
本当に助かりました。
また、他のロジックも指摘いただき、すべて修正いたしました
感謝・感謝です。
今後もよろしくお願いいたします。
       かっちゃん より

[ツリー表示へ]