我正在將現有的應用程序從Sybase轉換爲SQL Server 2008.該應用程序使用ODBC連接到數據庫。簡單地更改連接字符串已適用於大多數應用程序功能,但有一個問題令我感到困惑。我創建了一個顯示錯誤的簡單示例。使用ODBC返回SQL Server結果集時出錯
我有一個存儲過程:
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());
}
現在這個工作,但我寧願不使這個代碼更改,如果因爲應用程序需要在兩個數據庫上工作,我能幫助它。
任何人都可以提出爲什麼原始代碼不起作用?它看起來真的很簡單,應該可以正常工作。
非常感謝,集固定它nocount。 – 2013-02-22 09:19:19
不客氣:) – 2013-02-22 09:40:52
只需從ODBC的角度添加到Ivan G的答案。在ODBC中,當nocount關閉時,程序中的每個插入/更新/刪除/選擇都被視爲一個單獨的結果集。按照ODBC術語,您可以調用SQLMoreResults來遍歷這些結果集,以便找出受影響的行數。 – bohica 2013-02-22 09:59:51