当我运行此更新查询时,发生此错误:System.InvalidCastException:'从字符串“ UPDATE Tbl_User_Privilges_Forms”到类型'Long'的转换无效。'
"UPDATE Tbl_User_Privilges_Forms SET [F_View]= " & rw.Cells(4).Value & ", [F_Edit]= " & rw.Cells(5).Value & " Where [FormID] =" & rw.Cells(2).Value And "[UserID] =" & H
当我与一个Where条件一起使用时,它可以很好地工作,但是与“ And”一起使用时,会出现错误。
答案 0 :(得分:1)
编译器认为您想执行按位的 And 操作,这不能在字符串上完成。您的意图是使 And 操作成为SQL查询的一部分。因此,需要将其放在双引号内;不在外面像这样:
"UPDATE Tbl_User_Privilges_Forms SET [F_View]= " & rw.Cells(4).Value & ", [F_Edit]= " & rw.Cells(5).Value & " Where [FormID] =" & rw.Cells(2).Value & " And [UserID] =" & H
正如已经提到的,最佳实践是对此类操作进行参数化,否则您可能会为SQL注入攻击铺平道路。示例here
答案 1 :(得分:1)
正如已经建议的那样,您绝对应该使用参数将值插入SQL代码。就是说,每当您想要执行这样的多个串联操作时,总是最好使用String.Format
或字符串插值。您犯了此错误,因为使用大量的串联运算符(&)会使代码难以阅读。如果您使用过String.Format
或字符串插值,那么将不可能将And
运算符放在VB代码而不是SQL代码中:
String.Format("UPDATE Tbl_User_Privilges_Forms SET [F_View] = {0}, [F_Edit] = {1} WHERE [FormID] = {2} AND [UserID] = {3}",
rw.Cells(4).Value,
rw.Cells(5).Value,
rw.Cells(2).Value,
H)
或:
$"UPDATE Tbl_User_Privilges_Forms SET [F_View] = {rw.Cells(4).Value}, [F_Edit] = {rw.Cells(5).Value} WHERE [FormID] = {rw.Cells(2).Value} AND [UserID] = {H}"
请注意,这确实可以解决您的问题,但这并不是您做错了什么的直接答案。 Danski对此提供了解释,因此在此不再赘述。我本可以在评论中发布此信息,但是我想提供的代码量使这不切实际。