我创建了一个宏/一些VBA来更新SQL Server表,它可以正常工作。
简而言之,代码从表中提取定义数量的记录到excel,然后最终用户更新某些特定信息,然后单击更新。将为表创建连接,并运行SQL更新语句以更新相关记录。
问题在于用户不必更新NULL字段(NULL在SQL Server表中,但在Excel中显示为'空')当使用单击更新时SQL语句强制空的'空条目。
为了解决这个问题,我希望For Each语句中的代码检查单元格/记录是NULL还是Empty,并跳转到NEXT行,这样就不会执行SQL Execute命令。
以下是有问题的VBA:
cnn.Open cnnstr
Dim row As Range
For Each row In [tbl_data].Rows
uSQL = "UPDATE BREACH_DATA SET [VAL_BREACH_REASON] = '" & (row.Columns(row.ListObject.ListColumns("VAL_BREACH_REASON").Index).Value) _
& "' ,[VAL_BREACH_DETAIL] = '" & (row.Columns(row.ListObject.ListColumns("VAL_BREACH_DETAIL").Index).Value) _
& "' ,[VAL_VALID] = '" & (row.Columns(row.ListObject.ListColumns("VAL_VALID").Index).Value) _
& "' ,[VAL_NOTES] = '" & (row.Columns(row.ListObject.ListColumns("VAL_NOTES").Index).Value) _
& "' WHERE [ATD_NUMBER] = '" & (row.Columns(row.ListObject.ListColumns("ATD_NUMBER").Index).Value) & "'"
'Debug.Print uSQL
cnn.Execute uSQL
Next
cnn.Close
Set cnn = Nothing
任何建议
亲切的问候 恐龙
答案 0 :(得分:0)
您正在使用来自单元格的字符串直接更新SQL Server数据。这是打开注射攻击之门的典型例子 - 用户可以对数据库执行各种不好的坏事。但是考虑到你修复了这里是一种检查每个单元格不为空或为空的方法(我假设其中一个字段不为空或你想要更新的空...):
如果不是
(
(isempty(row.Columns(row.ListObject.ListColumns("VAL_BREACH_REASON").Index).Value)
and isnull(row.Columns(row.ListObject.ListColumns("VAL_BREACH_REASON").Index).Value)
and do same for the other cell values....
)
然后更新......