Vb.net 对存储过程进行轻微修改后返回空表
更新见操作结束 这个让我们抓狂 我们在VB.NET中编写了一个填充数据表的方法 它执行以下操作(简化-实例化或设置项的代码以及删除的错误处理) “。。。所有上述内容将在干预代码中设置。然后Vb.net 对存储过程进行轻微修改后返回空表,vb.net,stored-procedures,datatable,oledb,Vb.net,Stored Procedures,Datatable,Oledb,更新见操作结束 这个让我们抓狂 我们在VB.NET中编写了一个填充数据表的方法 它执行以下操作(简化-实例化或设置项的代码以及删除的错误处理) “。。。所有上述内容将在干预代码中设置。然后 Dim dataTable As System.Data.DataTable = Nothing Dim oCommand As System.Data.OleDb.OleDbCommand = Nothing oCommand = New System.Data.OleDb.OleDbCommand(pro
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进行任何重大更改。我没有直接选择,而是插入表变量,然后从中选择。我还没有引入任何我需要的额外复杂性;当我通过SQL Server Management Studio运行旧SP和新SP时,仍然会得到相同的输出
但不是通过VB.NET中的上述代码
使用旧SP,我得到一个System.Data.DataTable,其中包含SP返回的所有行
使用新SP,我得到一个System.Data.DataTable,其中包含0列和0行
没有出现错误代码运行非常愉快。它只返回一个空表
情况变得更糟了。我们有另一种方法来填充数据集。它与原始程序之间的唯一区别在于我们定义了
Dim dataSet As System.Data.DataSet = Nothing
dataSet = New System.Data.DataSet()
及
这是疯狂的一点。完全不可理解的疯狂的位
当我通过dataset方法运行修改后的SP时,它将返回一个dataset。数据集包含一个datatable,猜猜看,datatable包含我的SP返回的所有数据
我很困惑。到底发生了什么事?有人有线索吗?我怀疑这与我使用一个表变量有关,但是什么,如何
我知道你要说什么:我们为什么不使用DataSet方法呢?当然但我们承诺向后兼容。可能存在使用旧方法调用my SP的旧版本代码。我设计了我的SP,因此它仍然返回旧版本代码所期望的所有数据。但是我不能改变旧版本的代码。他们仍然使用使用DataTable的方法。所以我不能给他们一个对他们不起作用的SP
当然还有另一个解决办法。保持旧SP不变。编写一个新版本的SP,originalnamev2或类似的东西,它将被新软件使用。但我宁愿避免这样。当然,这让我毛骨悚然。我需要了解什么不再有效,这样我就可以评估我们的代码库中是否还有其他需要引起注意的地方
更新开始
好的,这是我试过的
现在我需要做什么才能让它工作?为什么当我使用适配器填充数据表时它不起作用,但如果我使用同一适配器填充数据集,它会起作用?此行为是由于我的SP顶部缺少SET NOCOUNT ON语句造成的。一旦我添加了这个,它又起作用了。如果删除标签别名会有什么不同吗?谢谢@JP。。。。恐怕没有:(除此之外,我对其进行了修改,使其使用了一个实际的表,而不是一个表变量。不走运。我对其进行了简化,将其硬编码插入到表变量中,然后选择了。不走运。@JP我向OP添加了一个更新。也许这将有助于解释发生了什么事?可能是因为您使用了SelectCommand,但它有insert?可以改用SQLCommand吗。
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]
Dim dataSet As System.Data.DataSet = Nothing
dataSet = New System.Data.DataSet()
oAdapter.Fill(dataSet)