当前位置: 首页 > 面试题库 >

使用dapper,为什么在一次使用连接时创建的临时表在第二次使用同一连接时不可用

有权
2023-03-14
问题内容

我正在尝试使用C#中的dapper执行一系列SQL * Server步骤。第一步将创建一个临时表并将其填充。以下步骤从临时表中查询数据。创建/填充似乎已成功运行,但是来自临时表的第一个查询失败说:

“无效的对象名称’#GetPageOfGlobalUsers’。”

        using (SqlConnection connection = DBConnectionProvider.CreateConnection())
        {
            ... misc setup stuff...

            connection.Execute(@"
                create table #GetPageOfGlobalUsers(row int, EmailAddress nvarchar(max), LastName nvarchar(max), FirstName nvarchar(max), Id uniqueidentifier)
                insert into #GetPageOfGlobalUsers
                SELECT ROW_NUMBER() OVER (order by LastName, FirstName, EmailAddress) row,
                    EmailAddress, LastName, FirstName, Id 
                    FROM Users 
                    WHERE LastName like @search or FirstName like @search or EmailAddress like @search
            ", new { search = search }
            );

            int count = connection.Query<int>(@"
                SELECT count(*) from tempdb..#GetPageOfGlobalUsers
            ").Single<int>();

... more queries from the temp table follow

上面,执行有效,但是查询失败,并出现了我上面提到的错误。(请注意,无论是否使用“ tempdb
..”前缀,我都会遇到相同的错误。)如果我改为创建一个永久表(即,如果删除前导散列),或者使它成为全局临时表(即,前缀)带有两个哈希的名称),一切正常。

我的理解是,用单个哈希命名的临时表受连接持续时间的限制,所以我不知道发生了什么。但是我敢肯定有人可以告诉我!

(顺便说一句,如果没有人告诉我“不要那样做”,除非根本做不到,我将不胜感激。)


问题答案:

我不完全了解发生了什么,但是我可以通过在自己的Execute中创建临时表来解决此问题,而不是像在代码中同时创建表和填充表的Execute中那样显示在我的问题中。

即,以下工作:

            connection.Execute(@"
                create table #PagesOfUsers(row int, 
                                           EmailAddress nvarchar(max), 
                                           LastName nvarchar(max), 
                                           FirstName nvarchar(max), 
                                           Id uniqueidentifier)"
                );

            connection.Execute(@"
                insert into #PagesOfUsers
                SELECT ROW_NUMBER() OVER (order by LastName, FirstName, EmailAddress) row,
                    EmailAddress, LastName, FirstName, Id 
                    FROM Users 
                    WHERE LastName like @search or FirstName like @search or EmailAddress like @search
            ", new { search = search }
            );

            int count = connection.Query<int>(@"
                SELECT count(*) from #PagesOfUsers
            ").Single<int>();

这并不可怕,但是很不方便。值得注意的是,我宁愿根本不必 _显式_创建临时表。确实,我最初将create / populate操作编码为SELECT
INTO,因此不必逐项列出临时表的列。但这在随后的查询中也遇到了“无效对象”错误,因此我尝试使用显式的CREATETABLE来查看它是否有所作为,并在发现问题后在此处张贴了我的问题。

我看到的行为是,当在同一Execute中创建并填充临时表时,表面看来成功后,实际上并没有在tempdb中。这让我想知道原始代码中的Execute是否在做任何事情!据我所知,这相当于没有采取任何行动。



 类似资料:
  • 问题内容: 下面的代码通过SSH在一台计算机上运行grep并打印结果: 我如何一次将5台机器全部置入grep(这样就不会造成重大延迟),而不是将所有这些都放入5个变量中并全部打印出来。 问题答案: 您需要将调用放在单独的线程(或进程中,但这可能会过大),这反过来又要求代码位于函数中(无论如何,这是一个好主意:模块的顶部没有大量代码水平)。 例如: If you had many more than

  • 我必须使用带有spring jdbc和tomcat mysql连接池的临时表。我有4条声明: 如果存在临时表(可能不需要),请删除该表 我对每一个都使用以下代码: 我有一个问题,因为第二条语句中不存在该表: 表“tmp\u Table”不存在 我认为问题可能是连接池,因为临时表只能由一个连接访问,并且在连接关闭时会被删除。 这是我的数据源和txManager配置: 如何解决这个问题?我需要创建一个

  • 在日志屏幕中,我得到一个错误:

  • 问题内容: 与 那两个工作正常。 使用连接池背后的想法是什么?什么时候使用? 问题答案: 从redis-py docs: 在后台,redis- py使用连接池来管理与Redis服务器的连接。默认情况下,您创建的每个Redis实例将依次创建自己的连接池。通过将已创建的连接池实例传递给Redis类的connection_pool参数,可以覆盖此行为并使用现有的连接池。您可以选择执行此操作,以实现客户端

  • 我正在尝试按照本教程实现nodejs mysql数据库。我知道 查询()是Pool.GetConnection()+Connection.Query()+Connection.Release()的快捷方式。 在本文中,数据库配置为: 这是可以用作: 但是,我真的不明白 如果使用pool会自动释放连接,为什么我们需要这样做呢?

  • 我有一个列为col1-col10的表tablename。并非每一行都填充了col4,但每一行都填充了col1、col2、col3。我想在col4满足条件时获取所有{col1,col2,col3}元组,然后从tablename中获取与元组{col1,col2,col3}匹配的所有行。 我不确定是否应该使用内部联接、左联接或其他方式?(我认为内部连接和左连接都应该给我相同的结果)下面的查询给了我一个语