Я знаю, что прошло много времени с тех пор, как этот был опубликован, но я думаю, что ответ довольно прост.
Я предполагаю, что вы используете MS Enterprise Library для доступа к базе данных, это объясняет, почему временная таблица не существует между командами. Enterprise Library EXPLICITLY закрывает соединение с БД (помещает его обратно в пул) после завершения команды. То есть, ЕСЛИ вы не поместите команды в транзакцию.
Если вы используете ADO.NET напрямую (открыв соединение, собрав и выполнив команды, затем закрыв соединение), вы не столкнетесь с этой проблемой (вам решать, когда соединение закрывается - что более рискованно).
Вот некоторый код, написанный с использованием MS Enterprise Library и транзакции (извините, VB.NET):
' Get a reference to the database
Dim sqlNET As New Sql.SqlDatabase("*Your Connection String Here...*")
' Specify the transaction options
Dim oTranOpt As TransactionOptions = New TransactionOptions
' What type of isolation the transaction should have (V. Important):
oTranOpt.IsolationLevel = IsolationLevel.ReadUncommitted ' This one doesn't place locks on DB but allows dirty reads
' How long the transaction has to complete before implicitly failing (h,m,s):
oTranOpt.Timeout = New TimeSpan(0, 0, 30)
' Start the scope of the transation
Using oTranScope As TransactionScope = New TransactionScope(TransactionScopeOption.Required, oTranOpt)
' Create the connection to the DB. Not abs. necessary. EL will create one but best to do so.
Using Conn As Common.DbConnection = sqlNET.CreateConnection
' Create a Temp Table
sqlNET.ExecuteNonQuery(CommandType.Text, "SELECT * INTO #MyTemp FROM FooTable")
' Get results from table, e.g.
Dim intCount As Integer = sqlNET.ExecuteScalar(CommandType.Text, "Select Count(*) from #MyTemp")
MsgBox(intCount)
' Flag transaction as successful (causes a commit when scope is disposed)
oTranScope.Complete()
End Using ' Disposes the connection
End Using ' If this point is reached without hitting the oTranScope.Complete - the transaction is rolled back and locks, if any, are released.
Если вы удалите область транзакции, код не будет выполнен на счетчике выбора (*), поскольку таблица больше не существует. При указании области действия соединение между вызовами команд остается открытым.
Надеюсь, это кому-нибудь поможет.
Нил.