繁体   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