2011-11-09 109 views
0

我以前用過臨時表沒有任何問題,但今天,他們不適合我。這返回SQL Server中臨時表的問題

。 #MyTemp找不到

從最後一行開始。

scBld.CommandText = "select top 10 * into #MyTemp from elig_feeds"; 
scBld.ExecuteNonQuery(); 
scBld.CommandText = "select count(*) from #MyTemp"; 
int p = (int) scBld.ExecuteScalar(); 

如果我刪除「#」,它工作正常。

最近唯一改變的就是數據庫的版本兼容性,但我沒有看到這是一個因素。 db是2005開發者版本。

Thx。

+0

臨時表只對創建它的會話(spid)可見。如果連接改變,spid將會改變,你將無法訪問它。查詢完成後,會話被刪除,臨時表也被刪除。另一方面,全局臨時表對於所有會話都是可見的,所以一個會話可以創建它,而另一個可以訪問它。 – brian

+0

這些都是真實的,布萊恩,但是上面的四行按照使用相同的SqlCommand和相同的開放SqlConnection的順序執行。還有另一個開放的SqlConnection。當我改變了操作順序時,我得到了這些測試語句來執行,但是具有更復雜SQL的所需程序代碼仍然沒有執行。 – SeaDrive

回答

1

檢查連接是否自動關閉。您正在執行兩個不同的命令,具體取決於連接設置,它可能在您調用ExecuteNonQuery()後重置。

[當連接關閉臨時表被破壞。]

+0

搜索連接釋放模式。您可能積極釋放連接。 – ImplexOne

+0

我認爲它與連接池有關,但我不明白如何控制它。我能夠將所有相關的語句放在一個CommandText中,並使其以這種方式工作。 – SeaDrive

2

我今天也有類似的問題,與2005年快遞都使用ODBC和OLE DB。 如this article中所述,此行爲可能是由於使用了準備好的語句,因此在準備時將其包裝到臨時存儲過程中。

在SQL Server 2005,SQL Server 2000和SQL Server 7.0,該準備 語句不能用於創建臨時對象,不能 引用創建臨時對象,例如 臨時表系統存儲過程。這些程序必須直接執行。

直接使用SQLExecDirect提供語句有助於修復應用程序。不知道如何應用於ADO.NET。