【发布时间】: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,我会将它插入到我的插入查询中还是创建一个存储过程?