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

VB6 RecordsAffected在.Execute方法之后返回-1值,vb6,ado,Vb6,Ado,我正在尝试修复旧的VB6应用程序错误。当我尝试将数据保存/插入数据库时,RecordsAffected返回值-1。我尝试在.Execute方法之前和之后插入消息框。在.Execute方法之前,值为+1;在.Execute命令之后,值返回-1。你们知道为什么它会返回-1吗?我不知道是RecordsAffected还是Options参数返回负值 Private Function jsSave() As Boolean Dim Cmd(0 To 1) As New ADODB.Command Dim

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

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

我也有同样的想法,发现将NOCOUNT设置为ON是导致问题的原因,因此将set NOCOUNT OFF添加到SQL的开头可以返回正确的记录计数

如果您将-1的返回值视为ADO告诉调用者它无法返回受影响的记录计数,那么它是有意义的,但这只是我的一个假设


下面是一个相关的讨论,讨论了设置NOCOUNT对各个方面的影响,但主要集中在性能上。

两个建议:1。尝试插入SETNOCOUNT ON;在sql语句的开头。2.检查@C-PoundGuru:我测试了添加adExecuteNoRecords,但仍然没有成功,关于设置nocount,我会将其插入到我的insert-into查询中还是生成一个存储过程?