tagCANDY CGI VBレスキュー(花ちゃん) の Visual Basic 2010 用 掲示板(VB.NET 掲示板) [ツリー表示へ]   [Home]
一括表示(VB.NET VB2005)
タイトルSQLサーバの更新
記事No11178
投稿日: 2013/12/14(Sat) 17:41
投稿者かっちゃん
いつもお世話になります
大変助かっております。
色々してみたのですが、更新エラーが直りません
よろしくお願いいたします

データベース:SQLサーバ2008
プログラム :VB2010
OS    :Windows7

テーブル:JusyoF
  JU-NO   JU- NAME     JU- JUSYO   JU-CODE
      1        AAA         東京都        A15
      2        BBB         埼玉県        B25
      3        CCC         神奈川県      C30
      4        DDD         千葉県        D45
      5        EEE         山梨県        E55

更新内容

テーブルJusyoFのJU-NO=3のJU-CODEをC35に変更するプログラムを
VB2010で作成中ですが更新でエラーになります。

最後のReturn cmd.ExecuteNonQueryのロジックで
“'?' 付近に不適切な構文があります。”
色々変更してみましたが、直りませんでした
すみません。よろしくお願いいたします

定義
Imports System.Data.SqlClient
Public Cnn As New SqlClient.SqlConnection
Public Cmd As New SqlCommand
Public Adp As SqlClient.SqlDataAdapter
Private JusyoFDs As DataSet
Private JusyoFDt As DataTable
Dim glstrCnpath = "Persist Security Info=False;" _
              & "User ID=sa;" _
              & "Password=PASS;" _
              & "Initial Catalog=JusyoS;" _
              & "Data Source=192.168.1.10;"
Cnn = New SqlConnection(glstrCnpath)
Cmd.Connection = Cnn
Cnn.Open()

設定
Try
  Dim wkstrSql = "select JU-NO , JU- NAME , JU- JUSYO , JU-CODE from JusyoF"
  Cmd.CommandText = wkstrSql
  Adp = New SqlDataAdapter(Cmd)
  JusyoFDs = New DataSet
  Adp.Fill(JusyoFDs, "JusyoF")
  JusyoFDt = JusyoFDs.Tables("JusyoF")
Catch ex As Exception
  MessageBox.Show(ex.ToString, "エラー")
End Try

更新
Dim dtrow As DataRow
Dim pk() As DataColumn = {JusyoFDt.Columns("JU-NO")}
Dim wkTxt1 As Byte
Dim wkTxt2 As String
wkTxt1 = 3
wkTxt2 = “C35”
JusyoFDt.PrimaryKey = pk
dtrow =JusyoFDt.Rows.Find(wkTxt1)
dtrow("JU-CODE") = Trim(wkTxt2)
Call SubmitChangesByHand()

Private Sub SubmitChangesByHand()
  Dim cmdUpdate As SqlCommand = CreateUpdateCommand()
  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 JusyoFDt.Select("", "", dvrs)
     Select Case row.RowState
       Case DataRowState.Modified
         intRowsAffected = SubmitUpdate(row, cmdUpdate)
     End Select
     If intRowsAffected = 1 Then
       row.AcceptChanges()
      Else
       row.RowError = "更新が失敗"
     End If
  Next row
End Sub

Private Function CreateUpdateCommand() As SqlCommand
 Dim strSQL As String
  strSQL = "UPDATE [JusyoF] " & _
          " SET JU-NO = ? ,  JU-CODE  = ? " & _
          " Where JU-NO = ? "
  Dim cmd As New SqlCommand(strSQL, Cnn)
  Dim pc As SqlParameterCollection = cmd.Parameters
  pc.Add("JU-NO _New", SqlDbType.Int)
  pc.Add("JU-CODE _New", SqlDbType.VarChar)
  pc.Add("JU-NO _Orig", SqlDbType.Int)
  pc.Add("JU-CODE _Orig", SqlDbType.VarChar)
  Return cmd
End Function

Private Function SubmitUpdate(ByVal row As DataRow, _
                              ByVal cmd As SqlCommand) As Integer
  Dim pc As SqlParameterCollection = cmd.Parameters
  pc("JU-NO _New").Value = row("JU-NO ")
  pc("JU-CODE _New").Value = row("JU-CODE ")
  pc("JU-NO _Orig").Value = row("JU-NO ", _
                                 DataRowVersion.Original)
  pc("JU-CODE _Orig").Value = row("JU-CODE ", _
                                DataRowVersion.Original)
  Return cmd.ExecuteNonQuery
End Function

[ツリー表示へ]
タイトルRe: SQLサーバの更新
記事No11179
投稿日: 2013/12/14(Sat) 19:51
投稿者魔界の仮面弁士
>   JU-NO   JU- NAME     JU- JUSYO   JU-CODE
>   Dim wkstrSql = "select JU-NO , JU- NAME , JU- JUSYO , JU-CODE from JusyoF"

[JU-NAME] と[JU-JUSYO] ではなく、
[JU- NAME]と[JU- JUSYO]なのですね?


本来は、空白やマイナス記号を含んだ列名を作るべきでは無いのですが、
どうしてもそうした名前が必要な場合には、それぞれを
= "select [JU-NO], [JU- NAME], [JU- JUSYO], [JU-CODE] from [JusyoF]"
のように、角括弧で囲む必要があります。

そうしないと、「JU-CODE」が「JU から CODE を引いた値」という数式として
誤解されてしまいますので。


仮に、「-」の部分がマイナス記号で無かったとしても、空白が含まれていると、
それが別名の指定であると誤解され、
= "select [JU-NO], [JU-] AS [NAME], [JU-] AS [JUSYO], [JU-CODE] from [JusyoF]"
の意味で認識されてしまうかと思います。


> Dim pk() As DataColumn = {JusyoFDt.Columns("JU-NO")}
上記では「JU-NO」という列名にしていますが、
> pc("JU-NO _New").Value = row("JU-NO ")
こちらは「JU-NO 」という列名を右辺に指定していますね。
本当の列名はどちらなのでしょうか?

もし、末尾に空白を含む名前ならであれば、SQL 文を記述する際、
SELECT * FROM の構文を使うか、先述したように
フィールド名を角括弧で囲まないと呼び出せないはずです。
(囲み記号はダブルクォーテーションでも OK)


今のままだと、そもそも
> 最後のReturn cmd.ExecuteNonQueryのロジックで
> “'?' 付近に不適切な構文があります。”
に到達する前にエラーになってしまいそうですが…。


> “'?' 付近に不適切な構文があります。”
? を使うのは System.Data.Odbc です。System.Data.SqlClient の場合は
= "UPDATE [JusyoF] SET [JU-NO] = @p1, …"
とか
= "UPDATE [JusyoF] SET [JU-NO] = [@JU-NO _New], …"
などのように、@で始まる名前で指定します。

Parameters.Add で使う名前も、同様に同じ名前をセットしてください。

[ツリー表示へ]
タイトルRe^2: SQLサーバの更新
記事No11180
投稿日: 2013/12/14(Sat) 23:44
投稿者かっちゃん
> >   JU-NO   JU- NAME     JU- JUSYO   JU-CODE
> >   Dim wkstrSql = "select JU-NO , JU- NAME , JU- JUSYO , JU-CODE from JusyoF"
>
> [JU-NAME] と[JU-JUSYO] ではなく、
> [JU- NAME]と[JU- JUSYO]なのですね?
>
>
> 本来は、空白やマイナス記号を含んだ列名を作るべきでは無いのですが、
> どうしてもそうした名前が必要な場合には、それぞれを
>  = "select [JU-NO], [JU- NAME], [JU- JUSYO], [JU-CODE] from [JusyoF]"
> のように、角括弧で囲む必要があります。
>
> そうしないと、「JU-CODE」が「JU から CODE を引いた値」という数式として
> 誤解されてしまいますので。
>
>
> 仮に、「-」の部分がマイナス記号で無かったとしても、空白が含まれていると、
> それが別名の指定であると誤解され、
>  = "select [JU-NO], [JU-] AS [NAME], [JU-] AS [JUSYO], [JU-CODE] from [JusyoF]"
> の意味で認識されてしまうかと思います。
>
>
> > Dim pk() As DataColumn = {JusyoFDt.Columns("JU-NO")}
> 上記では「JU-NO」という列名にしていますが、
> > pc("JU-NO _New").Value = row("JU-NO ")
> こちらは「JU-NO 」という列名を右辺に指定していますね。
> 本当の列名はどちらなのでしょうか?
>
> もし、末尾に空白を含む名前ならであれば、SQL 文を記述する際、
> SELECT * FROM の構文を使うか、先述したように
> フィールド名を角括弧で囲まないと呼び出せないはずです。
> (囲み記号はダブルクォーテーションでも OK)
>
>
> 今のままだと、そもそも
> > 最後のReturn cmd.ExecuteNonQueryのロジックで
> > “'?' 付近に不適切な構文があります。”
> に到達する前にエラーになってしまいそうですが…。
>
>
> > “'?' 付近に不適切な構文があります。”
> ? を使うのは System.Data.Odbc です。System.Data.SqlClient の場合は
>  = "UPDATE [JusyoF] SET [JU-NO] = @p1, …"
> とか
>  = "UPDATE [JusyoF] SET [JU-NO] = [@JU-NO _New], …"
> などのように、@で始まる名前で指定します。
>
> Parameters.Add で使う名前も、同様に同じ名前をセットしてください。

魔界の仮面弁士 様
ありがとうございます。
@p1, …" ですか
ACCESSでは更新できたのに
SQLサーバーではなぜと、色々とロジックを変えてやってみましたが
できなかったので、助かりました。
さっそく月曜日に実施してみます。
本当に本当に
ありがとうございました

      かっちゃん

[ツリー表示へ]