2010-09-03 5 views
2

J'écris du code en C#.Tables temporaires comment créer avant la transaction, puis utiliser la transaction interne

Je souhaite créer une table temporaire avant que la transaction ne commence, puis l'utiliser dans la transaction. Cependant, lorsque j'essaie de le faire, j'obtiens une erreur dans la transaction: "La table n'existe pas". Quelle est la bonne façon de le faire?

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); 

Répondre

2

Que diriez-vous simplement ré-ordonner les déclarations en tant que tel, de sorte que la création de la table a lieu dans la transaction:

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

J'ai entendu dire qu'il pourrait être néfaste pour la performance: comme dans (http://www.sql-server-performance.com/tips/temp_table_tuning_p1.aspx) « Si vous devez utiliser une table temporaire, faire Si vous le faites, il verrouillera certaines tables système (syscolumns, sysindexes et syscomments) et empêchera d'autres personnes d'exécuter la même requête, ce qui nuira grandement à la simultanéité et aux performances. une application mono-utilisateur. " – Darqer

+0

@Darqer Vous pouvez créer une table temporaire en mémoire: 'DECLARE TABLE @Temp (id INT);' qui ne devrait avoir aucun de ces effets secondaires –

+0

J'ai essayé, mais je dois tout faire dans un bain et ce n'est pas possible. – Darqer

2

Le travail de code suivant parfaitement.

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(); 
    } 
Questions connexes