2014-01-21 13 views
0

當我打電話當我有參數時,Dapper調用sp_executesql,有沒有辦法解決這個問題?

connection.Execute(sql); 

小巧玲瓏的執行,一切都很好。當我致電

connection.Execute(sql, new { UserId = _userId }); 

它使用sp_executesql執行。

問題是當它使用sp_executesql它在它自己的範圍內。如果它創建一個臨時表,那麼後續使用相同連接的查詢將無法訪問它。我可以通過使用全局臨時表來避開它,但我不想冒兩個進程互相干擾的風險。

有沒有人知道解決方法?

更新:我有同樣的問題,當我使用的SqlCommand對象,而小巧精緻。我寫了一個單元測試來說明我遇到的問題。 WorksWithParameters因System.Data.SqlClient.SqlException失敗:無效的對象名稱「#TEMP_OBJECTLIST」。周圍的臨時表範圍問題

[TestFixture] 
public class DapperTest 
{ 
    private const string TestObjectType = "S"; 
    private const string ConnectionString = "XXXXXXXXX"; 

    private static void CreateTempTableWithoutParameters(SqlConnection connection) 
    { 
     const string sql = "SELECT TOP 10 * INTO #TEMP_OBJECTLIST FROM sys.objects WHERE TYPE = 'S'"; 
     connection.Execute(sql); 
    } 

    private static void UseTempTableWithoutParameters(SqlConnection connection) 
    { 
     const int expectedCount = 10; 

     const string sql = "SELECT COUNT(*) FROM #TEMP_OBJECTLIST WHERE TYPE = 'S'"; 
     var count = connection.Query<int>(sql).First(); 

     Assert.AreEqual(expectedCount, count); 
    } 

    private static void CreateTempTableWithParameters(SqlConnection connection) 
    { 
     const string sql = "SELECT TOP 10 * INTO #TEMP_OBJECTLIST FROM sys.objects WHERE TYPE = @OBJECT_TYPE"; 
     connection.Execute(sql, new {OBJECT_TYPE = TestObjectType}); 
    } 

    private static void UseTempTableWithParameters(SqlConnection connection) 
    { 
     const int expectedCount = 10; 

     const string sql = "SELECT COUNT(*) FROM #TEMP_OBJECTLIST WHERE TYPE = @OBJECT_TYPE"; 
     var param = new {OBJECT_TYPE = TestObjectType}; 

     var count = connection.Query<int>(sql, param).First(); 

     Assert.AreEqual(expectedCount, count); 
    } 

    [Test] 
    public void WorksWithParameters() 
    { 
     using (var connection = new SqlConnection(ConnectionString)) 
     { 
      connection.Open(); 

      CreateTempTableWithParameters(connection); 
      UseTempTableWithParameters(connection); 
     } 
    } 

    [Test] 
    public void WorksWithoutParameters() 
    { 
     using (var connection = new SqlConnection(ConnectionString)) 
     { 
      connection.Open(); 

      CreateTempTableWithoutParameters(connection); 
      UseTempTableWithoutParameters(connection); 
     } 
    } 
} 
+0

看起來這不是Dapper的錯。我只能用SqlCommand對象重現同樣的問題。猜測也許這是做參數的唯一方法? – Steve

+1

這只是ado.net和像sqltrace這樣的工具報告事情。 Dapper不會這樣做。盡我所知,臨時表應該可以正常工作 –

回答

0

一種方法是創建臨時表與外部範圍一個僞列,然後使用alter table語句添加所有所需的列,並使用它。

此外,Erland Sommarskog的How to share data between procedures可能對您或其他尋找共享數據的不同選項的人有用。

相關問題