簡體   English   中英

使用OLEDB在VB.NET中進行SQL更新

[英]SQL Updating in VB.NET using OLEDB

我正在嘗試使用VB.NET和OleDB從XML文件更新Access數據庫。 我正在使用以下代碼,但無法使更新生效。 我沒有收到任何錯誤,但沒有更新發生-盡管.DbType.Int32,它似乎將CRSID視為字符串。 調試輸出顯示所有正確的值,並且使用類似的方法插入SQL也可以正常工作。 如果我對CRSID中的值進行硬編碼,則會更新數據庫,但數據在錯誤的列中LastName包含CRSID,而FirstName包含LastName。 希望有人能幫忙。

For Each drCurrent In dt.Rows
            Using cmd As New OleDb.OleDbCommand With
                {
                    .Connection = cn,
                    .CommandText =
                    <SQL>
                        Update NewPMS SET LastName = @LastName, FirstName = @Firstname WHERE CRSID = @CRSID
                    </SQL>.Value
                }
                cmd.Parameters.AddRange(New OleDb.OleDbParameter() _
                    {
                      New OleDb.OleDbParameter With {.ParameterName = "@CRSID", .DbType = DbType.Int32},
                      New OleDb.OleDbParameter With {.ParameterName = "@LastName", .DbType = DbType.String},
                      New OleDb.OleDbParameter With {.ParameterName = "@FirstName", .DbType = DbType.String}
                    }
                )
                cmd.Parameters(0).Value = drCurrent("CRSID")
                cmd.Parameters(1).Value = drCurrent("LastName")
                cmd.Parameters(2).Value = drCurrent("FirstName")
                cn.Open()
                cmd.ExecuteNonQuery()
                cn.Close()
                cmd.Parameters.Clear()
            End Using
        Next    

在OleDb中,參數是位置。 他們的名字無法識別。 (請參閱OleDbCommand.Parameters集合上的“ Remarks section

@CRSID的參數占位符顯示為查詢中的最后一個,但第一個OleDbCommand.Parameter被命名,命名並用@CRSID的值填充。

這意味着您所有的參數都用於錯誤的字段或條件,並且最終出現where子句完全錯誤的情況。 該命令使用FirstName的值搜索CRSID字段(當然,它找不到任何匹配項)。

您的sql的正確代碼是

Update NewPMS SET 
    LastName = @LastName, 
    FirstName = @Firstname 
WHERE CRSID = @CRSID

....

cmd.Parameters.AddRange(New OleDb.OleDbParameter() _
    {
      New OleDb.OleDbParameter With {.ParameterName = "@LastName", .DbType = DbType.String},
      New OleDb.OleDbParameter With {.ParameterName = "@FirstName", .DbType = DbType.String}
      New OleDb.OleDbParameter With {.ParameterName = "@CRSID", .DbType = DbType.Int32},
    }
)
cmd.Parameters(0).Value = drCurrent("LastName")
cmd.Parameters(1).Value = drCurrent("FirstName")
cmd.Parameters(2).Value = drCurrent("CRSID")

附帶說明,您應該將OleDbCommand的初始化移到循環外,創建空參數並打開連接。 在循環內部,只需設置當前行中參數的值並執行命令即可。 (在循環結束之前,請不要關閉連接)。 這種邏輯更好,沒有副作用,但是如果您有很多行,它可能會帶來稍微更好的性能。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM