【问题标题】:INSERT INTO with multiple parameters via VB6 & ADO通过 VB6 和 ADO 插入多个参数
【发布时间】:2024-01-12 20:17:01
【问题描述】:

我正在尝试通过添加一个简单的错误记录子例程来更新一些旧版 VB6 代码,该子例程使用 ADO 将一行插入到 SQL Server 表中,其中包含错误的基本详细信息。子例程接收标识错误类型的整数参数值 (errorCode)。解析 XML 文件时会发生错误。 XML 文件名(通过objFile.Name 获得)将与日期、用户名和errorCode 参数值一起记录。

下面的代码显示了我到目前为止的位置。我试图 INSERT INTO 的表如下所示:

[dbo].[tblXMLerrorLog](
[errorLogID] [int] IDENTITY(1,1) NOT NULL,
[runDate] [datetime2](0) NULL,
[runBy] [nvarchar](255) NULL,
[xmlFileWithError] [nvarchar](255) NULL,
[errorCode] [int] NULL)

 

Sub writeErrorLog(errorCode As Integer)

  strSQL = "INSERT INTO dbo.tblXMLerrorLog (runDate, runBy, xmlFileWithError, errorCode) 
            VALUES(GetDate(), Current_User,?,?);"

  With cmd

    .CommandType = adCmdText
    .CommandText = strSQL

    Set par1 = .CreateParameter("@xmlFileWithError", adChar, adParamInput, 50, objFile.Name)
    .Parameters.Append par1

    Set par2 = .CreateParameter("@errorCode", adInteger, adParamInput, , errorCode)
    .Parameters.Append par2

    .ActiveConnection = Cnxn
    .Execute                        ' update error log

    .Parameters.Delete ("@xmlFileWithError")
    .Parameters.Delete ("@errorCode")

  End With

End Sub

当我运行代码时,.Execute 语句会抛出此错误:

"多步OLE DB操作产生错误。检查每个OLE DB 状态值(如果可用)。没有完成任何工作。”

我对该错误消息的研究表明字段大小不匹配,但我不明白这一点。我会很感激任何方向。

【问题讨论】:

  • 欢迎来到 SO。用VB6已经很多年了,如果我错了,请原谅我,但我认为你应该尝试将adVarChar作为你的第一个参数的数据类型。
  • 乔纳森:谢谢你的建议。我试过了,但我仍然得到同样的错误。
  • 改用 adVarWChar。您的 SQL 表具有 nvarchar。另外,当表字段有 255 时,为什么要将长度限制为 50?后者不会是问题,我只是好奇。
  • 我想到的另外两件事,可能会导致问题。首先,传递的实际文件名是什么?请检查它是否没有奇怪的字符。其次,您可以尝试更改表定义以使 runDate 默认为 GETDATE() 和 runBy 默认为 CURRENT_USER。这样你的 sql 只需要插入两个值。这可能会简化问题。
  • 开始工作后,我有机会在旧机器上运行您的代码。我不能重复你的错误,这让我强烈怀疑问题出在 objFile.Name 上。请发布这个值是多少。

标签: sql-server parameters vb6 sql-insert ado


【解决方案1】:

已经解决了。正如 cmets 中所解释的,我的主(调用)程序使用了一个参数。所以,当我的子例程的 .Execute 语句到达时,有 3 个参数,而不是我天真的预期的只有 2 个。正如一条评论所建议的那样,首选的解决方案是使用命名参数,但我认为 VB6 不支持这一点;我必须用问号占位符引用参数,所以它们的顺序很重要。我的子例程不起作用,因为当 INSERT INTO 语句尝试将“错误”值插入具有不同数据类型的列时,意外的第一个参数(来自调用程序)导致数据类型不匹配。所以我看到的错误信息是有道理的。该修复与子例程无关。相反,我重新设计了调用程序,以便在调用子程序之前删除第一个参数。感谢所有帮助我的人。

【讨论】: