【问题标题】:"Error converting datatype varchar to int" when updating from Excel macro through SQL Server stored procedure通过 SQL Server 存储过程从 Excel 宏更新时“将数据类型 varchar 转换为 int 时出错”
【发布时间】:2017-12-28 06:55:18
【问题描述】:

我有一个 Excel 宏,用于通过存储过程更新 SQL Server 中的数据。

存储过程是:

ALTER PROCEDURE [dbo].[modkulfadquery] 
    @steuerID nvarchar(20) = null,
    @kulfirsz integer = null,
    @kulfvaros nvarchar(50) = null,
    @kulfutca nvarchar(50) = null,
    @lakcimbejdatum date = null,
    @kulfbankszlaszam nvarchar(50) = null,
    @nevID integer = 0
AS
BEGIN
    SET NOCOUNT ON;

    UPDATE nevlista 
    SET steuerID = @steuerID,
        kulfirsz = @kulfirsz,
        kulfvaros = @kulfvaros,
        kulfutca = @kulfutca,
        lakcimbejdatum = CONVERT(DATE, @lakcimbejdatum),
        kulfbankszlaszam = @kulfbankszlaszam
    WHERE nevID = @nevID
END

宏是:

With Munka3
    elsosor = 3
    Do Until .Cells(elsosor, 1) = ""
        nevID = .Cells(elsosor, 1).Value
        steuerID = .Cells(elsosor, 3).Value
        kulfirsz = .Cells(elsosor, 4).Value
        kulfvaros = .Cells(elsosor, 5).Value
        kulfutca = .Cells(elsosor, 6).Value
        lakcimbejdatum = .Cells(elsosor, 7).Value
        kulfbankszlaszam = .Cells(elsosor, 8).Value

        Set cmd = New ADODB.Command
        cmd.ActiveConnection = cnn
        cmd.CommandType = adCmdStoredProc
        cmd.CommandText = "modkulfadquery"
        cmd.Parameters.Append cmd.CreateParameter("@nevID", adInteger, adParamInput, , nevID)
        cmd.Parameters.Append cmd.CreateParameter("@steuerID", adVarChar, adParamInput, 20, steuerID)
        cmd.Parameters.Append cmd.CreateParameter("@kulfirsz", adInteger, adParamInput, , kulfirsz)
        cmd.Parameters.Append cmd.CreateParameter("@kulfvaros", adVarChar, adParamInput, 50, kulfvaros)
        cmd.Parameters.Append cmd.CreateParameter("@kulfutca", adVarChar, adParamInput, 50, kulfutca)
        cmd.Parameters.Append cmd.CreateParameter("@lakcimbejdatum", adDate, adParamInput, , lakcimbejdatum)
        cmd.Parameters.Append cmd.CreateParameter("@kulfbankszlaszam", adVarChar, adParamInput, 50, kulfbankszlaszam)
        cmd.Execute

        elsosor = elsosor + 1
    Loop
End With

运行宏,我收到错误消息:

将数据类型 varchar 转换为 int 时出错。

我检查了存储过程中的参数类型,在宏中,也检查了 Excel 表和 SQL Server 中的表。他们都是一样的。

对于另一个输入参数较少且只有nvarchar 类型(nevID 除外)的工作表,我有一个类似的存储过程(做同样的事情),它在那里工作。

【问题讨论】:

  • 哪一行出错了?
  • 行 cmd.execute
  • 尝试使用adVariant
  • 我的意思是要知道,哪个参数是错误的,你1)将所有类型设为adVariant,然后2)将类型一一更改为原始类型,即更改为adVarchar -> 运行过程;将下一个类型更改为adInteger -> 运行 proc 等。这样你会找到你的麻烦参数。
  • 好的,我将宏更改为 advariant,它是 advarchar。我从 excel 表中给出了两个输入(steuerID 和 kulfirsz)。现在错误消息是:“不允许从数据类型 sql_variant 到 int 的隐式转换。使用 CONVERT 函数运行此查询”...(同时我将所有类型更改为 advariant 并得到相同的错误)

标签: sql-server excel vba stored-procedures


【解决方案1】:

好的,我找到了解决方案。对于所有处理类似问题的人:

存储过程中的最后一个参数是宏中的第一个参数,所以我猜输入参数的类型顺序错误。我将存储过程中的@nevID 参数移到了第一位,从那以后它就可以工作了!

无论如何感谢您的帮助!

【讨论】:

  • 我不敢相信这是我的问题。使用 Microsoft 产品时请务必小心!请用绿色复选标记将您的答案标记为“正确答案”!
【解决方案2】:

错误在这里

 elsosor = elsosor + 1

elsosor声明为整数,然后初始化它的值

【讨论】:

  • elsosor 被声明为整数,我只是没有复制整个代码。它在此宏的子开始之前在模块顶部声明(暗淡 elsosor 为整数)。
猜你喜欢
  • 2016-06-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-04
  • 2021-12-19
  • 2012-05-17
  • 2014-10-04
相关资源
最近更新 更多