【问题标题】:Temporary tables how to create before transaction and then use inside transaction临时表如何在事务之前创建然后在事务内部使用
【发布时间】:2011-04-07 18:53:08
【问题描述】:

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

【问题讨论】:

    标签: c# sql temp-tables


    【解决方案1】:

    以下代码完美运行。

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

    【讨论】:

      【解决方案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 ); 
      

      【讨论】:

      • 我听说它可能对性能有害:如 (sql-server-performance.com/tips/temp_table_tuning_p1.aspx) “如果您必须使用临时表,请不要在事务中创建它。如果您这样做,那么它会锁定一些系统表(syscolumns、sysindexes 和 syscmets)并阻止其他人执行相同的查询,从而极大地损害并发性和性能。实际上,这会将您的应用程序变成单用户应用程序。”
      • @Darqer 你可以创建一个内存临时表:DECLARE TABLE @Temp (id INT);,它不应该有任何副作用
      • 我试过了,但是我必须在一个浴室内完成所有事情,这是不可能的。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-08-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-01-08
      • 2013-03-24
      相关资源
      最近更新 更多