Dapperはパラメータを持っているときにsp_executesqlを呼び出しますが、そこには方法がありますか?

dapper

質問

私が電話するとき

connection.Execute(sql);

Dapperは実行され、すべて正常です。私が電話するとき

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

sp_executesqlを使用して実行されます。

問題は、sp_executesqlを使用するときに、それがそれ自身のスコープ内にあることです。一時テーブルを作成する場合、同じ接続を使用する後続のクエリにはアクセスできません。私はグローバル一時テーブルを使用して回避することができますが、2つのプロセスが互いに干渉してしまう危険を冒すつもりはありません。

誰かがそれを回避する方法を知っていますか?

更新: 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);
        }
    }
}

人気のある回答

一時テーブルのスコープの問題の1つの方法は、外部スコープに1つのダミーカラムを持つtempテーブルを作成し、次にalter tableステートメントを使用してすべてのカラムを追加して使用することです。

また、Erland Sommarskogが手続き間でデータを共有する方法は、あなたや他の人がデータを共有するためのさまざまなオプションを探しているときに役立ちます。



ライセンスを受けた: CC-BY-SA with attribution
所属していない Stack Overflow
ライセンスを受けた: CC-BY-SA with attribution
所属していない Stack Overflow