如何将Dapper与Elastic Scale MultiShardConnection和MultiShardDataR



我正在尝试分析从Azure弹性规模多共享连接返回的查询结果。它看起来不像是从SqlConnection或DbConnection继承的,所以Dapper方法不可用。当您考虑到它正在执行一个统一的扇出查询时,这是有意义的。我希望做的是使用现有的Dapper功能来将读取器结果的解析器处理为一种类型。

如果我不使用Dapper进行原始连接,这些映射功能可用吗?

以下是我正在使用的类型:

MultiShardConnection : IDisposable
MultiShardCommand : DbCommand
MultiShardDataReader : DbDataReader, IDataReader, IDisposable, IDataRecord

下面是一个示例查询,我正在尝试使用Dapper映射器。

Customer customer = null;
using (MultiShardConnection conn = GetMultiShardConnection())
using (MultiShardCommand cmd = conn.CreateCommand())
{
    cmd.CommandText = "SELECT * FROM [Customer] WHERE ...";
    cmd.CommandTimeout = 120;
    cmd.CommandTimeoutPerShard = 120;
    using (MultiShardDataReader reader = await cmd.ExecuteReaderAsync())
    {
        while (reader.Read())
        {
            // Replace this with mapper...
            customer = new Customer()
            {
                CustomerId = reader.GetInt32(0)
                //etc...
            };
        }
    }
}
return customer;

更新

我最终需要使用sp_execute_filout

using (var con = GetConnection())
{
    await con.OpenAsync();
    return (await con.QueryAsync<Customer>("sp_execute_fanout ", new
    {
        shard_map_manager_server = "my_server.database.windows.net",
        shard_map_manager_database = "my_shardmapmananger",
        user_id = "my_username",
        password = "my_password",
        shard_map_name = "my_shardmap",
        statement = "SELECT * FROM Customer"
    }, commandTimeout: 120, commandType: CommandType.StoredProcedure)).FirstOrDefault();
}

目前,MultiShardConnection尚未与Dapper集成。原因正如您所指出的,它没有实现DbConnection。作为另一种解决方案,我建议尝试弹性数据库查询(EDQ):https://azure.microsoft.com/en-us/documentation/articles/sql-database-elastic-query-overview/.使用EDQ,您可以简单地连接到Azure DB中的单个数据库,并在EDQ外部表上使用常规Dapper来跨碎片进行查询。EDQ现在可用于Azure SQL DB中的所有服务层。

让我们知道这对你来说是如何运作的。

谢谢,Torsten

我今天尝试了OP的解决方案,因为我也想使用Dapper映射多个碎片的查询结果,但我注意到sp_execute_filout已被弃用,取而代之的是sp_execute_remore。

在使用此sp之前,需要创建一个外部源作为对碎片映射管理器的引用。然后,您可以使用此外部源的名称作为数据源名称(在我的示例中为"TestExtScr"),并在代码中执行类似操作:

using (var con = new SqlConnection(connString))
{
    return await con.QueryAsync<Customer>("sp_execute_remote", new
        {
            data_source_name = "TestExtSrc",
            statement = "SELECT foo FROM bar"
         }, commandTimeout: 120, commandType: CommandType.StoredProcedure);
}

通过这种方式,您可以在查询多个碎片时使用Dapper。

我知道我碰到了一个旧帖子,但当我在寻找解决问题的方法时,这个帖子不断出现。所以我添加了这一点,以防将来有人在寻找同样的东西:)。

相关内容

  • 没有找到相关文章

最新更新