页面A上有一个查询按钮,点击后,连接数据库,创建本地临时表#temp,从#temp中查询,再断开连接
-----------
直接运行页面A,完全正常,现在我加了一个登录页面,登录成功后跳转到页面A,再查询,就会出现“对象名 '#temp' 无效”。不明白为什么?应该怎么处理

解决方案 »

  1.   

    查完后断开,临时表#temp结束生命周期。
      

  2.   

    #temp
    只对当前连接
    调用的批有效
    连接一旦断开 就消失了
      

  3.   

    临时表临时表有两种类型:本地表和全局表。在与首次创建或引用表时相同的 SQL Server 实例连接期间,本地临时表只对于创建者是可见的。当用户与 SQL Server 实例断开连接后,将删除本地临时表。全局临时表在创建后对任何用户和任何连接都是可见的,当引用该表的所有用户都与 SQL Server 实例断开连接后,将删除全局临时表。临时表与永久表相似,但临时表存储在 tempdb 中,当不再使用时会自动删除。临时表有两种类型:本地和全局。它们在名称、可见性以及可用性上有区别。本地临时表的名称以单个数字符号 (#) 打头;它们仅对当前的用户连接是可见的;当用户从 SQL Server 实例断开连接时被删除。全局临时表的名称以两个数字符号 (##) 打头,创建后对任何用户都是可见的,当所有引用该表的用户从 SQL Server 断开连接时被删除。例如,如果创建了 employees 表,则任何在数据库中有使用该表的安全权限的用户都可以使用该表,除非已将其删除。如果数据库会话创建了本地临时表 #employees,则仅会话可以使用该表,会话断开连接后就将该表删除。如果创建了 ##employees 全局临时表,则数据库中的任何用户均可使用该表。如果该表在您创建后没有其他用户使用,则当您断开连接时该表删除。如果您创建该表后另一个用户在使用该表,则 SQL Server 将在您断开连接并且所有其他会话不再使用该表时将其删除。临时表的许多用途可由具有 table 数据类型的变量替换。
      

  4.   

    我是在断开之前进行查询的啊,而且查询的代码我都没有改变,直接运行页面A时是可以查询到的,只是加了登录控制,跳转到页面A再查询就是提示对象名 '#temp' 无效各位再帮我看看
      

  5.   

    临时表用完了就需要释放的。
    不过在create之后,是不会在sqlserver里有保存的。不使用后,它会自己释放的。
      

  6.   

    #temp这种 就是不断开,一个批处理完成都应该结速吧。
      

  7.   

    两种方式执行代码的路线没什么不一样的啊,都是顺序执行以下几句代码(中间那4句是连在一起的,中间没有其它代码) db.openconnection();//db是自己封装的类
     ……
     strSql="select xx into #temp from xx where xx";
     db.ExecuteSql(strSql);//无论哪种方式,这句都执行成功
     strSql = "select xx from #temp where xx";
     DataTable dt = db.GetDataTable(strSql);//直接运行,是OK的,跳转,不ok
     ……
     db.closeconnection();//最后才关闭连接的 
      

  8.   

    #temp 临时表随着sql进程的消失而消失,你的代码分别创建了两个sql进程,第2个进程的sql是没法访问第1个进程的#temp的,你可以把两个sql语句合并,只访问数据库一次,或者写成一个存储过程,然后调用存储过程
      

  9.   

    但是直接运行页面A是可以访问到#temp的啊,不明白啊不明白
      

  10.   

    自己用DbTransaction的实例来管理就不会有问题
      

  11.   

    页面与页面之间不属于同一个数据库连接啦,HTTP协议是无状态协议来着
      

  12.   

    你可以用物理表,使用完以后drop调,或者把操作写在sp里面
      

  13.   


    页面,与数据库访问进程不是一回事.
    数据库访问是由WEB服务器进行的,完事后,把得到的数据经转换成HTML,发给WEB客户端,这时,WEB服务器与数据库之间的连接已经断开了.
    你想想,如果这个连接不断开,如果有一千万个人在访问同一个页面,而WEB服务器又得把这一千万个用户连接到数据库服务器,那数据库能受得了嘛!
    其实,当页面下载到客户端以后,客户端与WEB服务器的连接也是断开的.因此,如果你要访问原来生成的那个#temp,就必须将访问语句写在生成#temp的同一段语句中,这样才能访问到.
      

  14.   

    谢谢各位的回复,但好像还是没有说到我的问题上直接运行页面A是可以访问到#temp的,这说明我那几句代码是没有问题的吧
    通过登录页面转到页面A(这里还是运行页面A,同样是运行那几句代码,怎么就会突然断开连接,访问不到#temp呢?)
      

  15.   

    刚才代码试了下,单独一个页面和从另一个页面跳转,以下代码都可以运行,没有出现楼主说的问题        SqlConnection conn = new SqlConnection(connectstring);
            SqlCommand cmd1 = new SqlCommand("select * into #temp from tb", conn);
            SqlCommand cmd2 = new SqlCommand("select * from #temp", conn);
            conn.Open();
            int x = cmd1.ExecuteNonQuery();
            SqlDataReader reader = cmd2.ExecuteReader();
        
            DataTable dt = new DataTable();
            SqlDataAdapter da = new SqlDataAdapter(cmd2); 
            da.Fill(dt);
            conn.Close();是不是你的ExecuteSql或者GetDataTable里面有问题?
      

  16.   


    1、跟踪程序运行到什么地方报错。
    2、再仔细查看下 db.openconnection(),db.ExecuteSql()这两函数。
    #temp临时表创建后,之后有没断开连接(即:db.closeconnection();)
      

  17.   

    你这样吧,在前端C#时停住,后端用SQL的查询分析器去到TEMPDB里去看究竟发生了什么事,可能的原因有二:
    你的登录页面造成了影响,如创建了同名的临时表而没清理掉;第二就是你对数据库的封装里有问题,第一次运行能过而第二次就不行了。
      

  18.   

    这样的场景,不要用临时表来做,不需要时则drop.
      

  19.   

     db.openconnection();//db是自己封装的类
     ……
     strSql="select xx into #temp from xx where xx;select xx from #temp where xx";
     DataTable dt = db.GetDataTable(strSql);//直接运行,是OK的,跳转,不ok
     ……
     db.closeconnection();//最后才关闭连接的改成这样,试试
    另外全局临时表(带##)慎用,不好管理,建议不用。