【问题标题】:VB6 RecordsAffected returns -1 value after .Execute methodVB6 RecordsAffected 在 .Execute 方法后返回 -1 值
【发布时间】:2015-05-08 03:05:47
【问题描述】:

我正在尝试修复旧的 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

【问题讨论】:

  • 两个建议:1.尝试在你的sql语句开头插入SET NOCOUNT ON;。 2.查看How to tell if a db update was successful?
  • @C-PoundGuru :我测试了添加 adExecuteNoRecords 但仍然没有运气并且关于设置 nocount,我会将它插入到我的插入查询中还是创建一个存储过程?

标签: vb6 ado


【解决方案1】:

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

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

这里有一个相关的post 讨论设置 NOCOUNT ON 可能对各个方面产生的影响,但主要集中在性能上。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-02-03
    • 2017-06-14
    • 1970-01-01
    • 1970-01-01
    • 2014-04-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多