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开始
确定-这是我尝试过的
可能的结论:正是DELETE和/或INSERT语句的存在才导致这种行为。
现在我需要怎么做才能使其正常工作?为什么当我使用适配器填充数据表时,它不起作用,但是如果我使用相同的适配器填充数据集,则它可以工作?
此行为是由于我的SP在顶部缺少SET NOCOUNT ON语句引起的。添加完后,它又可以正常工作。