dapper:#tempDB已创建,但在下一个查询

时间:2016-06-09 06:55:39

标签: c# sql .net sql-server dapper

在我的程序中,我想在tempDB中选择一些bookID,以便稍后查询(使用Dapper扩展名):

using (var conn = new SqlConnection(connStr)) {
    conn.Execute("SELECT bookID INTO #tempdb WHERE ... FROM Books");
    int count = conn.ExecuteScalar<int>("SELECT COUNT(*) FROM #tempdb");
    var authors = conn.Query("SELECT * FROM #tempdb LEFT JOIN BookAuthors ON ...");
}

然而,当我执行页面时,我得到以下异常:

  

无效的对象名称&#39;#tempdb&#39;。

#tempdb的生命周期似乎只在第一次查询中有效?

2 个答案:

答案 0 :(得分:3)

看起来你正在使用隐式连接打开/关闭。这确实会导致瞬态对象出现问题。如果在查询之间需要临时表,则需要在执行任何此类查询之前手动打开连接。这应该可以正常工作,测试套件中的许多示例都会使用临时表。

但是,从实际的角度来看,利用临时表在查询之间传递状态是......尴尬。除了脆弱之外,它对计划缓存也不利,因为#foo在不同连接上的所有使用之间具有不同的含义(包括重置但重用的连接)。

答案 1 :(得分:0)

我找到了一张前一张海报,他遇到了同样的问题和他的解决方案。

Using dapper, why is a temp table created in one use of a connection not available in a second use of the same connection

帖子表明你必须首先在SQL中显式地“创建表#tempdb”,一切都很顺利。即使是海报自己也不知道为什么这种编码风格有效。