Dapper는 매개 변수를 가질 때 sp_executesql을 호출합니다.

dapper

문제

전화 할 때

connection.Execute(sql);

Dapper가 실행되고 모든 것이 정상입니다. 전화 할 때

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

sp_executesql을 사용하여 실행됩니다.

문제는 sp_executesql을 사용하여 자체 범위에있는 경우입니다. 임시 테이블을 만들면 동일한 연결을 사용하는 후속 쿼리에 액세스 할 수 없습니다. 전역 임시 테이블을 사용하여이 문제를 해결할 수는 있지만 두 프로세스가 서로 간섭하는 위험을 감수하고 싶지는 않습니다.

아무도 그 문제를 해결할 방법을 알고 있습니까?

업데이트 : Dapper없이 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);
        }
    }
}

인기 답변

임시 테이블 범위 문제를 해결하는 한 가지 방법은 외부 범위에 하나의 더미 열이있는 임시 테이블을 만든 다음 alter table 문을 사용하여 원하는 모든 열을 추가하고 사용하는 것입니다.

또한, Erland Sommarskog가 절차간에 데이터를 공유하는 방법은 귀하 또는 다른 사람이 데이터 공유 옵션을 찾고있는 경우 유용 할 수 있습니다.



아래 라이선스: CC-BY-SA with attribution
와 제휴하지 않음 Stack Overflow
아래 라이선스: CC-BY-SA with attribution
와 제휴하지 않음 Stack Overflow