【发布时间】:2015-04-30 15:45:04
【问题描述】:
我正在使用 .Open 检查记录是否存在。 如果存在,我将其删除。 如果没有,我添加它。 然后我关闭 ADODB 记录集。
我确信有更好的方法来做到这一点 - 这可能是一种缓慢的方法。 有没有办法只用一个打开和一个关闭来做到这一点?
这是我的代码(在 Do 循环中):
Dim myRecSet As New ADODB.Recordset
Dim strSql As String
strSql = "select * from RentBalances where KeyTcyIdSubAcDate = '" & sKeyTcyIdSubAcDate & "'"
'Display "SQL: " & strSql
myRecSet.Open strSql, SQLSVSExtractConnection, adOpenKeyset, adLockOptimistic
'Display "Total no of records = " & myRecSet.RecordCount
If myRecSet.RecordCount < 1 Then
'Display ("There are no RentBalances record for this ID. ID = " & sKeyTcyIdSubAcDate)
Else
' delete the record
myRecSet.Delete
myRecSet.UpdateBatch
End If
myRecSet.AddNew
myRecSet!KeyTcyIdSubAcDate = rsLocal.Fields("KeyTcyIdSubAcDate")
myRecSet!KeyTcyId = rsLocal.Fields("KeyTcyId")
myRecSet!SubAc = rsLocal.Fields("SubAc")
myRecSet!PeriodEndDate = rsLocal.Fields("PeriodEndDate")
myRecSet!Amount = rsLocal.Fields("Amount")
myRecSet!RentAmount = rsLocal.Fields("RentAmount")
myRecSet!ChargesAmount = rsLocal.Fields("ChargesAmount")
myRecSet!AdjustmentAmount = rsLocal.Fields("AdjustmentAmount")
myRecSet!BenefitAmount = rsLocal.Fields("BenefitAmount")
myRecSet!BenefitBalance = rsLocal.Fields("BenefitBalance")
myRecSet!TenantBalance = rsLocal.Fields("TenantBalance")
myRecSet!PayAmount = rsLocal.Fields("PayAmount")
myRecSet!TimeStamp = rsLocal.Fields("TimeStamp")
myRecSet!UpdateFlag = rsLocal.Fields("UpdateFlag")
myRecSet.Update
myRecCount = myRecCount + 1
myRecSet.Close
【问题讨论】:
-
A) 不应连接字符串来构建 SQL 查询。 B) 为什么删除然后插入而不是更新?
-
这段代码中的sql注入风险让我很难过:(
-
A) 因为 SQL 注入 B) 因为是两个事务而不是一个
-
A) 没有机会 B) 我正在检查记录是否存在。可能不会。
-
A) 告诉我如何正确操作。 B) 如果我使用 Update 但记录不存在会怎样?