[英]Updating a row in an Access database using OleDb, SQL and VB.NET
[英]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.