【问题标题】:C# application to access data from PostgreSQL and SQL Server用于从 PostgreSQL 和 SQL Server 访问数据的 C# 应用程序
【发布时间】:2020-05-07 01:33:51
【问题描述】:

在单个 ASP.NET Web 应用程序中访问 SQL Server 和 PostgreSQL 数据库中的数据的最佳方法是什么?我有一个gridview,我想拥有来自两个数据库的数据列。有什么建议吗?

我尝试在 SQL 服务器上创建一个 ODBC 驱动程序,并将服务器链接到 PostgreSQL,然后创建一个从两个数据库中选择的视图。我遇到了许多我不知道如何解决的转换错误以及性能问题。

【问题讨论】:

  • “最佳”只能由您定义。我猜你有 2 个选项,链接服务器,正如你所尝试的,并从你的应用程序中的 2 个数据库中提取数据。您需要确定哪个适合您的情况,然后询问您遇到的任何问题,例如,如果您决定采用链接服务器方式,您可能会询问有关如何解决转换错误的问题。
  • 我有点放弃了链接服务器,想知道是否还有其他想法。我真的认为这对我的情况来说是最好的主意。尝试从链接服务器中进行选择时遇到的错误是链接服务器“linkedServer”的 OLE DB 提供程序“MSDASQL”为列提供了不一致的元数据。据报道,对象“Database”.“schema”.“tablename”的列“Column”(编译时序号 2)在编译时的“DBCOLUMNFLAGS_ISLONG”为 128,在运行时为 0。
  • 您需要提出一个新的、完整的问题。
  • 是的,正如@Dale K 所解释的,您应该选择最佳选项。每种方法都有其优点和缺点。例如,您已经尝试过的方法有其自身的问题,例如数据类型不匹配、速度慢等。我想如果您使用该方法从您的应用程序访问两个数据库并将数据加载到您自己的对象中,您可以避免类型不匹配的问题在合并它们之前。
  • 我认为我遇到的主要问题是 postgres 中的 citext 列。当我尝试在 SQL 中选择时,我得到了那个错误。

标签: c# asp.net sql-server postgresql linked-server


【解决方案1】:

您需要创建两个上下文(工作单元),一个用于 Sql Server,另一个用于 PostgreSql。

之后,您需要创建一个存储库以使用 Sql Server 的工作单元从 sql server 获取数据,对于 PostgreSql 也是如此。

创建一个服务来调用两个存储库

然后调用两个存储库并检索您需要创建一个类的数据,该类将填充来自存储库的两个返回

类似的东西

SqlServer 存储库

public class SqlRepository: ISqlRepository
{
    private readonly ISqlUoW _uow;

    public SqlRepository(ISqlUoW uow)
    {
        _uow = uow;
    }

    public async Task<EntityA> GetDataAsync()
    {
        return await _uow.Connection.QueryAsync<EntityA>("select field1,field2 FROM EntityA");
    }
}

PostgreSql 存储库

public class PGRepository: IPGRepository
{
    private readonly IUoWPG  _uow;

    public PGRepository(IUoWPG uow)
    {
        _uow = uow;
    }

    public async Task<Entityb> GetDataAsync()
    {
        return await _uow.Connection.QueryAsync<EntityB>("select field1,field3 FROM EntityB");
    }
}

网格数据类

public class GridData
{
    public string Field1 { get; set; }
    public string Field2 { get; set; }
    public string Field3 { get; set; }
}

服务

public class GridService : IGridService
{
    private readonly ISqlRepository _sqlRepository;
    private readonly IPGRepository _pgRepository;

    public GridService(ISqlRepository sqlRepository, IPGRepository pgRepository)
    {
        _sqlRepository = sqlRepository;
        _pgRepository = pgRepository;
    }

    public async Task<IList<GridData>> GetGridData()
    {
        var sqlData = await _sqlRepository.GetDataAsync();
        var pgData = await _pgRepository.GetDataAsync();

        var gridData = from sql in sqlData
                       join pg in pgData on sql.Field1 equals pg.Field1
                       select new GridData()
                       {
                           Field1 = sql.Field1,
                           Field2 = sql.Field2,
                           Field3 = pg.Field3
                       };

        return gridData;
    }
}

在这种情况下,表之间的共享键是属性 Field1

希望对你有帮助

【讨论】:

  • 非常感谢您的详细回复。如果我在 postgres 中处理 34,000 行以与 sql 数据合并,那么您的方法会成为性能问题吗?在没有可用连接的情况下,如何在 c# 中合并它们?
  • 为什么不将所有这些数据发送到数据湖?
  • 嗯,我还不够先进
猜你喜欢
  • 2011-12-25
  • 2014-06-12
  • 2013-08-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-01-03
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多