【发布时间】:2021-09-01 09:09:59
【问题描述】:
背景
我正在维护一个将记录导出到平面文件的 VB.Net(以前称为 VB6)实用程序。我们的一位客户报告说新版本需要很长时间才能运行,并且挖掘跟踪很容易看出原因:(我稍微混淆了这一点)
exec [sys].sp_describe_first_result_set
N'Update [MAIN].[dbo].[Inventory] Set ExportId = @P1 Where Comp = @P2 and Osite = @P3 and Key = @P4',
N'@P1 numeric(10),@P2 varchar(6),@P3 varchar(6),@P4 int',1
这个和类似的语句每个都需要半秒钟。该实用程序必须使用有关导出的一些信息更新主库存表,并且该表被严重触发,因此sp_describe_first_result_set 必须模拟所有触发器以确定结果 - 我可以稍后在跟踪中验证这一点。
问题
我无法弄清楚为什么我的代码会调用 sp_describe_first_result_set 来获取更新语句,而这个语句甚至没有结果集。命令设置看起来并没有做任何奇怪的事情:
Dim connection = New ADODB.Connection
connection.ConnectionString = config.AdoConnectionString
connection.CursorLocation = CursorLocationEnum.adUseClient
connection.Open()
cmd = New ADODB.Command
With cmd
.ActiveConnection = connection
.CommandType = CommandTypeEnum.adCmdText
.CommandText = "Update [MAIN].[dbo].[Inventory] " &
"Set ExportId = ? " &
"Where Comp = ? and Osite = ? and Key = ?"
.Parameters.Append(NumericParameter(cmd.CreateParameter("ExportId", DataTypeEnum.adNumeric, ParameterDirectionEnum.adParamInput), 10, 0))
.Parameters.Append(cmd.CreateParameter("Comp", DataTypeEnum.adVarChar, ParameterDirectionEnum.adParamInput, 6))
.Parameters.Append(cmd.CreateParameter("Osite", DataTypeEnum.adVarChar, ParameterDirectionEnum.adParamInput, 6))
.Parameters.Append(cmd.CreateParameter("Key", DataTypeEnum.adInteger, ParameterDirectionEnum.adParamInput))
End With
cmd.Parameters("ExportID").Value = lExportId
cmd.Parameters("Comp").Value = sComp
cmd.Parameters("Osite").Value = sOsite
cmd.Parameters("Key").Value = iKey
cmd.Execute()
是否有一些我只是想念的设置让它一直运行sp_describe_first_result_set?有没有办法阻止它这样做?
【问题讨论】:
-
哇,ADODB,现在有一个“来自过去的爆炸”!自从我上次看到类似的东西以来,一定已经快 20 年了。
-
@CaiusJard 是的,这其中有一些棘手的逻辑,他们希望尽可能接近原始代码,尽管对于数据库访问,我认为这并不重要。年龄至少可以解释为什么我很难找到有关这方面的实际文档。