2010-09-03 151 views
2

我在c#中编写代码。临时表如何在交易前创建,然后在交易中使用

我想在事务开始之前创建临时表,然后在事务中使用它,但是当我尝试这样做时,事务内部出现“表不存在”错误。做这件事的正确方法是什么?

SqlConnection sqlConnection = new SqlConnection("connstring"); 
sqlConnection.Open(); 

string temp = string.Format("CREATE TABLE dbo.#temp (id INT);"); 
DbCommand command = database.GetSqlStringCommand(temp); 
database.ExecuteNonQuery(command); //here is the problem when I add argument , transaction it works 
//fill data in temporary table 
//... 
// open transaction 
SqlTransaction transaction = sqlConnection.BeginTransaction(); 

//Here I try to read from temp table I have some DbCommand readCommand 
database.ExecuteNonQuery(readCommand, transaction); 

回答

2

如何只重新排序的语句,例如,使表创建需要的事务中的地方:

SqlConnection sqlConnection = new SqlConnection("connstring"); 
sqlConnection.Open(); 

// open transaction 
SqlTransaction transaction = sqlConnection.BeginTransaction(); 

string temp = string.Format("CREATE TABLE dbo.#temp (id INT);"); 
DbCommand command = database.GetSqlStringCommand(temp); 
database.ExecuteNonQuery(command, transaction ); //here is the problem when I add argument , transaction it works 

//Here I try to read from temp table I have some DbCommand readCommand 
database.ExecuteNonQuery(readCommand, transaction); 
+0

我听说,这可能对性能是有害的:如(http://www.sql-server-performance.com/tips/temp_table_tuning_p1.aspx)“如果你必须使用一个临时表,做如果你这样做,那么它会锁定一些系统表(syscolumns,sysindexes和syscomments),并阻止其他人执行相同的查询,极大地损害了并发性和性能。实际上,这会将你的应用程序变为一个单用户应用程序“。 – Darqer 2010-09-03 10:58:59

+0

@Darqer你可能能够创建一个内存临时表:'DECLARE TABLE @Temp(id INT);'不应该有任何这些副作用 – 2010-09-03 14:22:26

+0

我试过了,但然后我必须在一个浴室内做所有事情这是不可能的。 – Darqer 2010-09-03 19:23:09

2

下面的代码工作完美。

static void Main(string[] args) 
    { 
     string conStr = "Integrated Security=true;Initial Catalog=sushma;server=(local)"; 

     SqlConnection sqlConnection = new SqlConnection(conStr); 
     sqlConnection.Open(); 

     SqlCommand DbCommand = new SqlCommand("CREATE TABLE dbo.#temp (id INT);", sqlConnection); 
     DbCommand.ExecuteNonQuery(); 

     SqlTransaction transaction = sqlConnection.BeginTransaction(); 
     DbCommand.CommandText = "SELECT * FROM dbo.#temp"; 
     DbCommand.Transaction = transaction; 
     SqlDataReader dr = DbCommand.ExecuteReader(); 
     dr.Close();    

     transaction.Commit(); 
     Console.WriteLine("what is the issue"); 
     Console.ReadKey(); 
    }