对存储过程进行少量修改后返回空表

问题描述 投票:0回答:1

UPDATE参见操作结束

这个让我们挠头。

我们已经在VB.NET中编写了一个填充DataTable的方法

它执行以下操作(简化-实例化或设置项目的代码,并删除错误处理)

Dim procedureName As String
Dim mnCommandTimeOut As Integer
Dim parameters As System.Data.OleDb.OleDbParameter()
Dim oConnection As System.Data.OleDb.OleDbConnection

'...以上所有内容都将在中间代码中设置。然后

Dim dataTable As System.Data.DataTable = Nothing
Dim oCommand As System.Data.OleDb.OleDbCommand = Nothing
oCommand = New System.Data.OleDb.OleDbCommand(procedureName, oConnection)
oCommand.CommandType = CommandType.StoredProcedure
oCommand.CommandTimeout = mnCommandTimeout

If parameters IsNot Nothing Then
    oCommand.Parameters.AddRange(parameters)
End If

Dim oAdapter As System.Data.OleDb.OleDbDataAdapter = Nothing
oAdapter = New System.Data.OleDb.OleDbDataAdapter()
oAdapter.SelectCommand = oCommand    

oAdapter.SelectCommand.CommandTimeout = 120
oAdapter.MissingSchemaAction = MissingSchemaAction.AddWithKey
oAdapter.MissingMappingAction = MissingMappingAction.Passthrough
dataTable = New System.Data.DataTable()

oAdapter.Fill(dataTable)

[请注意,我还遗漏了代码来清理自己,处理掉不再需要的东西,依此类推。我们的real代码比这更干净!

这里是问题

我有一个使用上述方法调用的SP。同样,我不会涉及任何复杂性,但SP中的代码基本上由类似

的内容组成
SELECT Column1,
       Column2
  FROM <somequery>

现在我需要对该SP进行修改,并为其添加一些复杂性

DECLARE @Table TABLE
       (Column1 <some type here>  PRIMARY KEY NOT NULL,
        Column2 <some type here>              NOT NULL)

列类型与原始类型匹配

INSERT
  INTO @Table
      (Column1,
       Column2)
SELECT <modified query>

其后

SELECT [TAB].[Column1],
       [TAB].[Column2]
  FROM @Table [TAB]

总结除了使用表变量之外,我还没有对SP进行任何重大更改。我不直接执行SELECT,而是我INSERT INTO表变量,然后从中进行SELECT。我还没有介绍我需要的任何其他复杂性。当我通过SQL Server Management Studio运行旧的SP和新的SP时,我仍然得到相同的输出there

但不通过VB.NET中的以上代码

使用旧的SP,我得到一个System.Data.DataTable,其中包含SP返回的所有行。使用新的SP,我得到一个包含0列和0行的System.Data.DataTable。

不会引发错误代码可以完美地愉快地运行。它只是返回一个空表。

变得更糟。我们还有另一种填充数据集的方法。它和原始过程之间的唯一区别是我们定义

Dim dataSet As System.Data.DataSet = Nothing
dataSet = New System.Data.DataSet()

oAdapter.Fill(dataSet)

这是疯狂的一面。完全不可理解的insane位。

当我通过dataset方法运行修改后的SP时,它将返回一个数据集。数据集包含一个数据表,然后猜测是什么,该数据表包含我的SP返回的所有数据。

我很困惑。 earth上发生了什么?有人知道吗?我怀疑使用表变量与我有关,但是怎么办?

我知道您要说的是:为什么我们不只使用DataSet方法?当然。但是我们对向后兼容性有承诺。使用旧方法,可能存在旧版本的代码,称为我的SP。我对SP进行了设计,以使其仍返回旧版本代码期望的所有相同数据。但是我不能更改旧版本的代码。他们仍然使用使用DataTable的方法。因此,我不能给他们提供无法使用的SP 对他们来说

当然还有另一种解决方案。保留旧的SP不变。编写SP的新版本,originalnamev2或类似名称,供新软件使用。但我宁愿避免这种情况。另外,当然,这使我感到毛骨悚然。我需要了解what不再有效,因此我可以评估代码库中是否还有其他需要引起注意的地方。

UPDATE开始

确定-这是我尝试过的

  1. 使用表变量@Table,在其中插入行,SELECT行。 结果:空的数据表
  2. 使用固定表[dbo]。[TestTable]。显然这不是生产解决方案,但我现在正在尝试。 SP现在执行DELETE [dbo]。[TestTable],INSERT INTO [dbo]。[TestTable],最后是SELECT行。 结果:空的数据表
  3. 最后,我从SP中删除了所有插入和删除操作,仅删除了SELECT行。 结果:数据表包含行

可能的结论:正是DELETE和/或INSERT语句的存在才导致这种行为。

现在我需要怎么做才能使其正常工作?为什么当我使用适配器填充数据表时,它不起作用,但是如果我使用相同的适配器填充数据集,则它可以工作?

vb.net stored-procedures datatable oledb
1个回答
0
投票

此行为是由于我的SP在顶部缺少SET NOCOUNT ON语句引起的。添加完后,它又可以正常工作。

© www.soinside.com 2019 - 2024. All rights reserved.