VB6 RecordsAffected在.Execute方法之后返回-1值

时间:2015-05-08 03:05:48

标签: vb6 ado

我正在尝试修复旧的VB6应用程序错误。当我尝试将数据保存/插入数据库时​​, RecordsAffected 会返回 -1 的值。
我尝试在 .Execute 方法之前和之后插入消息框。在 .Execute 方法之前,该值为+1,在 .Execute 命令之后,该值返回-1。你们知道它为什么会返回-1?我不知道 RecordsAffected 选项参数是否返回负值。

Private Function jsSave() As Boolean
Dim Cmd(0 To 1) As New ADODB.Command
Dim Prm(0 To 1, 0 To 14) As New ADODB.Parameter
Dim RetVal As Long
Dim Succeeded As Long
Dim i As Integer

On Error GoTo R
Screen.MousePointer = vbHourglass
If Me.Toolbar.Buttons("secure").Image = "lock" Then
Err.Raise 1000, , "This record is currently in lock state. You cannot alter anything in this record unless you first unlock it. For more details how to unlock this record, please refer to IT."
End If
RetVal = 1
Succeeded = 0
No = Me.txtSONo.Text    'SONo
DtlId = GetLastNo(35)    'SODtlId
'------Start Saving Main-------------------------------------------------------
Select Case CurrentStatus
Case adInsert
    Id = GetLastNo(33) + 1       'PO Id
    With Cmd(0)
        .ActiveConnection = Conn
        .CommandType = adCmdText
        .CommandText = "INSERT INTO tb_SO (" _
                        & "SONo," _
                        & "SId," _
                        & "PId," _
                        & "totAmt," _
                        & "advAmt," _
                        & "Prepared," _
                        & "Recommended," _
                        & "Approved," _
                        & "Noted," _
                        & "Remarks," _
                        & "TRDate," _
                        & "UpdatedBy," _
                        & "UpdatedDate," _
                        & "SOId) VALUES (?,?,?,?,?,?,?,?,?,?,?,SYSTEM_USER,getdate(),?)"
    '--------------------------------------------------------------------
    Set Prm(0, 1) = .CreateParameter(, adInteger, adParamInput, , Me.txtSONo.Text)
    .Parameters.Append Prm(0, 1) 'SONo
    '--------------------------------------------------------------------
    Set Prm(0, 2) = .CreateParameter(, adInteger, adParamInput, , Me.cmbSupplier.Value)
    .Parameters.Append Prm(0, 2) 'SId
    '--------------------------------------------------------------------
    Set Prm(0, 3) = .CreateParameter(, adSmallInt, adParamInput, , Me.cmbPayTerm.Value)
    .Parameters.Append Prm(0, 3) 'PId
    '--------------------------------------------------------------------
    Set Prm(0, 4) = .CreateParameter(, adCurrency, adParamInput, , Me.StatusBar.Panels(3))
    .Parameters.Append Prm(0, 4) 'totAmt
    '--------------------------------------------------------------------
    Set Prm(0, 5) = .CreateParameter(, adCurrency, adParamInput, , 0)
    .Parameters.Append Prm(0, 5) 'advAmt
    '--------------------------------------------------------------------
    Set Prm(0, 6) = .CreateParameter(, adVarChar, adParamInput, 30, Me.txtPreparedBy)
    .Parameters.Append Prm(0, 6) 'Prepared
    '--------------------------------------------------------------------
    Set Prm(0, 7) = .CreateParameter(, adVarChar, adParamInput, 30, pubVPres)
    .Parameters.Append Prm(0, 7) 'Recommended
    '--------------------------------------------------------------------
    Set Prm(0, 8) = .CreateParameter(, adVarChar, adParamInput, 30, Me.txtApprovedBy)
    .Parameters.Append Prm(0, 8) 'Approved
    '--------------------------------------------------------------------
    Set Prm(0, 9) = .CreateParameter(, adVarChar, adParamInput, 30, Me.txtNotedBy)
    .Parameters.Append Prm(0, 9) 'Noted
    '--------------------------------------------------------------------
    Set Prm(0, 10) = .CreateParameter(, adVarChar, adParamInput, 50, IIf(Trim(Me.txtRemarks) = "", Null, Me.txtRemarks))
    .Parameters.Append Prm(0, 10) 'Remarks
    '--------------------------------------------------------------------
    Set Prm(0, 11) = .CreateParameter(, adDBTimeStamp, adParamInput, , Me.mskDate.Text)
    .Parameters.Append Prm(0, 11) 'TRDate
    '--------------------------------------------------------------------
    Set Prm(0, 0) = .CreateParameter(, adInteger, adParamInput, , Id)
    .Parameters.Append Prm(0, 0) 'SOId
    '--------------------------------------------------------------------
    MsgBox "Retval Before execute: " & RetVal      
    .Execute RetVal    
    MsgBox "Retval After execute: " & RetVal

    Call SetLastNo(33, Id)
    Call SetLastNo(34, No)
End With

1 个答案:

答案 0 :(得分:0)

我在同一条船上,发现将NOCOUNT设置为ON会导致问题,因此在SQL开头添加SET NOCOUNT OFF可以返回正确的记录数。

如果您看到ADO告诉调用者它无法返回受影响的记录数,则返回值-1确实有意义,但这只是我的一个假设。

这里有一个相关的post,其中讨论了将NOCOUNT设置为ON可能产生的影响,但主要集中在性能上。

相关问题