使用OLEDB在VB.NET中更新SQL

时间:2016-09-27 12:20:28

标签: sql vb.net

我正在尝试使用VB.NET和OleDB从XML文件更新Access数据库。我使用以下代码但无法使更新生效。我没有收到任何错误,但没有发生更新 - 尽管.DbType.Int32似乎将CRSID视为字符串。 Debug输出显示所有正确的值,并且Insert SQL的类似方法正常工作。如果我在CRSID中硬编码值,则db会更新,但数据位于错误的列中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    

1 个答案:

答案 0 :(得分:2)

在OleDb中,参数是位置的。他们的名字不承认他们。 (请参阅OleDbCommand.Parameters collection上的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的初始化,创建空参数并打开连接。在循环内部,只需从当前行设置参数值并执行命令。 (当然,在循环结束之前不要关闭连接)。这种逻辑更好,没有副作用,但如果你有很多行,它可以提供更好的性能。