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);
}
}
}
看起來這不是Dapper的錯。我只能用SqlCommand對象重現同樣的問題。猜測也許這是做參數的唯一方法? – Steve
這只是ado.net和像sqltrace這樣的工具報告事情。 Dapper不會這樣做。盡我所知,臨時表應該可以正常工作 –