【问题标题】:Is there a method other than using ssis to get data from sql server to oracle?除了使用 ssis 将数据从 sql server 获取到 oracle 之外,还有其他方法吗?
【发布时间】:2019-02-14 14:46:10
【问题描述】:

问题是,使用 ssis,我做了一个 ado 源到 ado 目标。这种方法每秒只写入超过 88 行,速度很慢。

using Oracle.ManagedDataAccess.Client;
using System;
using System.Data;
using System.Data.SqlClient;

namespace SQLconnection
{
internal static class Program
{
    private static void Main(string[] args)
    {
        SqlConnection conn = new SqlConnection("Data Source=;Database=;Integrated Security=yes");
        conn.Open();
        SqlCommand cmd = new SqlCommand("SELECT * FROM TABLE", conn);
        SqlDataReader reader = cmd.ExecuteReader();
        while (reader.Read())
        {
            Console.WriteLine(reader.GetString(0) + ", " + reader.GetString(19));
        }

        conn.Close();
        conn.Dispose();

        Console.ReadLine();

        OracleConnection con = new OracleConnection("User Id=;Password=;Data Source=;");
        con.Open();
        OracleCommand cmd2 = con.CreateCommand();
        cmd2
            .CommandText = "SELECT \'Hello World!\' FROM dual";

        OracleDataReader reader2 = cmd2.ExecuteReader();
        reader2.Read();
        Console.WriteLine(reader2.GetString(0));

        Console.WriteLine(con.ServiceName);
        Console.WriteLine(con.ServerVersion);
        Console.WriteLine(con.HostName);

        con.Close();

        Console.ReadLine();

    }
}
}

有什么方法可以通过控制台应用程序建立连接并传递数据?我觉得这会比每秒 88 行快。

【问题讨论】:

  • 这不是 SSIS 代码。那是普通的 ADO.NET。在 SSIS 中,您可以简单地将 SQL Server 源连接到 Oracle 目标并每秒获得数千行。 88/sec 表示源或目标有问题。使用原始 ADO.NET 无法解决该问题
  • 好的,谢谢。我会继续寻找解决方案。
  • 我会避免在您的代码示例中使用select * from ...,因为您只使用了 2 列(0 和 19),所以只需选择您需要的内容,否则您会要求 Oracle 向您发送大量不必要的数据。

标签: c# sql-server oracle


【解决方案1】:

是的,您可以编写一个控制台应用程序,使用本机 Oracle 提供程序将数据传递给 Oracle。

https://www.oracle.com/webfolder/technetwork/tutorials/obe/db/dotnet/GettingStartedNETVersion/GettingStartedNETVersion.htm

【讨论】:

  • 谢谢。现在正在调查它。这没有提到从 sql server 到 oracle 获取数据。我已经可以连接到 oracle。也许我可以使用 DataSet 类型?
  • @PanagiotisKanavos 抱歉。从标签中删除了 ssis。
  • 是的,您可以将 Sql Server 数据存储在 DataTable 对象中。
【解决方案2】:

我发现在进行批量数据传输时,基于文件的操作要快得多。

我将研究使用 BCP out 实用程序从 SQL Server 生成分隔文本文件。阅读:https://docs.microsoft.com/en-us/sql/tools/bcp-utility?view=sql-server-2017

进入 Oracle 可能会有点困难(我的 Oracle 经验非常有限)。根据以下问题,您可以使用 SQL Loader 脚本进行调查:

Oracle: Import CSV file

不过,使用 BCP 时有几个问题:

  • 根据数据的构成(数据的文本字段中是否有逗号和回车符?),请考虑对字段和记录使用自定义分隔符。这可以通过使用 -t 和 -r 选项在 BCP 命令中轻松指定
  • 显然,请确保格式之间的字段和数据匹配(或至少可比较)。您可以使用 BCP 中的 QUERYOUT 选项来创建自定义查询,这应该使您能够在需要时进行转换并按照您想要的方式对列进行排序。

它可能不是最性感的解决方案,但它可以工作,可以非常可重复,并且可以看到高吞吐量的数据。我们一直在为 Sybase ASE 到 SQL Server ETL 流程执行此操作,发现处理时间下降到他们使用其他数据库到数据库方法的 10%。

不过,显然是 YMMV,所以先测试一下。

【讨论】:

  • 感谢您的回答。经过一番思考,我开始认为基于文件的方法将是在系统之间处理这些数据的最有效方法。我也明白我是 ETL 流程的新手,这需要时间。我会深思熟虑并开发可靠的可测试解决方案。我已经铸造了第一张桌子。无论如何,非常感谢!
  • 完全没有问题。在我看来,最大的障碍是将数据导入 Oracle,但那是因为我对可用的工具并不太熟悉。但是,我确信这可以解决。干杯。
猜你喜欢
  • 2015-12-08
  • 1970-01-01
  • 1970-01-01
  • 2021-09-19
  • 2019-09-14
  • 2018-04-21
  • 1970-01-01
  • 2018-03-01
  • 1970-01-01
相关资源
最近更新 更多