[英]Error returning SQL Server result set using ODBC
我将现有的应用程序从Sybase转换为SQL Server2008。该应用程序使用ODBC连接到数据库。 只需更改连接字符串即可实现大多数应用程序功能,但是有一个让我感到困惑的错误。 我创建了一个显示错误的简单示例。
我有一个存储过程:
create procedure dbo.test_sel
as
begin
create table #cfg
(
Name varchar(100) NULL,
Dscr varchar(50) NULL
)
insert #cfg(Name, Dscr)
values('Config', 'Config description')
select COUNT(*) as [Count] from #cfg
return 0
end
和执行存储过程并将结果加载到DataTable中的代码:
{
OdbcCommand cmd = new OdbcCommand("test_sel", new OdbcConnection("Driver={SQL Server};Server=xxx;Database=xxx;Uid=xxx;Pwd=xxx"));
DataTable dt = new DataTable();
OdbcDataAdapter da = new OdbcDataAdapter(cmd);
using (cmd.Connection)
{
da.Fill(dt);
}
MessageBox.Show(dt.Rows.Count.ToString());
}
我希望消息显示值1,并且DataTable包含一行。 但是,DataTable为空(不返回任何结果集)。
现在,如果我注释掉存储过程中的insert
语句并重新运行代码,那么我确实得到了返回的结果集,其中包含一行,其中一列名为count,值为0。
我尝试使用永久表而不是临时表来尝试存储过程的许多变体,例如,但是每次发生相同的事情时-插入都会阻止存储过程返回结果集。
将ODBC驱动程序更改为SQL Server 2008没什么区别。 使用Sybase并在MS SQL Server Management Studio中运行时,代码可以按预期工作。
谷歌搜索后,我尝试了以下代码:
{
SqlCommand cmd = new SqlCommand("test_sel", new SqlConnection("Server=xxx,5100;Database=xxx;User ID=xxx;Password=xxx"));
DataTable dt = new DataTable();
SqlDataAdapter da = new SqlDataAdapter(cmd);
using (cmd.Connection)
{
da.Fill(dt);
}
MessageBox.Show(dt.Rows.Count.ToString());
}
现在可以正常工作,但是如果我可以帮助的话,我不想更改代码,因为该应用程序需要在两个数据库上都可以工作。
谁能说出原始代码为何无效? 看起来好像很简单的事情就可以了。
您可以使用2个选项来完成这项工作(对我来说,这似乎是个错误,因为对于OdbcDataAdapter
和SqlDataAdapter
Fill
均应正常工作):
1)在程序begin
后,在begin
关键字中添加
set nocount on
2)使用以DataSet
为参数的Fill
方法的重载,而不是使用DataTable
方法的重载。
MSDN指出: 以DataTable作为参数的Fill的重载仅获得第一个结果 。
当INSERT
并且关闭NOCOUNT
时,将返回有关该语句影响了多少行的信息。 因此,关闭此选项后,行数将报告两次(您可以在SSMS的“消息”窗口中检查),一次用于INSERT,第二次用于SELECT。 似乎第一行计数(来自INSERT)以某种方式被解释为第一个结果集,该行计数是指INSERT
语句而不是SELECT
因此没有要返回的行。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.