2013-02-22 37 views
1

我正在將現有的應用程序從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()); 
} 

現在這個工作,但我寧願不使這個代碼更改,如果因爲應用程序需要在兩個數據庫上工作,我能幫助它。

任何人都可以提出爲什麼原始代碼不起作用?它看起來真的很簡單,應該可以正常工作。

回答

0

有2個選項,你可以用它來使這項工作(對我來說,這似乎是錯誤,因爲Fill兩個OdbcDataAdapterSqlDataAdapter應該平等地工作):

1)在程序開始時begin關鍵字後添加

set nocount on 

2)使用Fill方法,它接受作爲DataSet參數,而然後將一個取DataTable的過載。

MSDN狀態:填充的那需要的DataTable作爲參數僅獲取第一結果過載。

INSERT被執行且NOCOUNT關閉時,返回有多少行受到該語句影響的信息。所以當你關閉這個選項時,行數將被報告2次(你可以在SSMS中檢查'Messages'窗口),一次是INSERT,第二次是SELECT。看起來,第一行數(來自INSERT)以某種方式被解釋爲第一結果集,此行計數指的是INSERT語句不是SELECT,因此沒有行要返回。

+0

非常感謝,集固定它nocount。 – 2013-02-22 09:19:19

+0

不客氣:) – 2013-02-22 09:40:52

+0

只需從ODBC的角度添加到Ivan G的答案。在ODBC中,當nocount關閉時,程序中的每個插入/更新/刪除/選擇都被視爲一個單獨的結果集。按照ODBC術語,您可以調用SQLMoreResults來遍歷這些結果集,以便找出受影響的行數。 – bohica 2013-02-22 09:59:51