我目前有一个每日进程,使用调用sql_loader的shell脚本将大量数据从TXT文件加载到ORACLE数据库中。我想将它迁移到.NET服务,但不想依赖从我的服务执行sql_loader。
实现这一目标的最佳(也是最快)方式是什么?
答案 0 :(得分:5)
我认为你不喜欢SQL Loader,因为它的命令行界面和(有些)笨重的控制文件。但这不是使用“SQL Loader”的唯一方法
Oracle现在有一种称为外部表的东西。您可以看到示例here。
简单地说,您将文件放入Directory(定义文件系统目录的数据库对象),定义表参数等...只需查看示例。现在突然间你的flatfile看起来像是Oracle的一个表。
执行“INSERT INTO perm_Table SELECT * FROM external_table”。
所以现在你的.net应用程序只是将文件重命名为外部表指向的文件,然后执行INSERT,然后重新命名文件。
瞧。
您已加载数据。这一切都使用SQL完成,比ADO或任何其他可以访问的库快得多。没有更笨重的命令行界面。
答案 1 :(得分:4)
将数据加载到DataTable中,并使用OracleBulkCopy类(来自Oracle Data Provider for .NET)将其一次性加载到数据库中。这仅在您将数据插入数据库时才有效,您无法使用OracleBulkCopy进行更新。
答案 2 :(得分:1)
SQL Server的ADO.Net提供程序支持模仿SQL Server BCP的SqlBulkCopy函数。
我对Oracle提供程序一无所知,但我会开始查看该提供程序是否支持与sql_loader类似的功能。
答案 3 :(得分:0)
我会看3rd party dotConnect libraries from DevArt(以前的CoreLab)。虽然我没有专门使用他们的OracleLoader组件,但我每天都使用他们的连接,命令,datareader和dataadapter对象,并且发现它们确实非常快。
希望有所帮助:o)
答案 4 :(得分:0)
如果您有SSIS,那将是一个很好的工具。在.NET方面,我建议使用上面提到的Oracle类,但SSIS或任何ETL工具都是更好的选择。
答案 5 :(得分:0)
我实际上使用另一种方法解决了我自己的问题:我编写了一个存储过程来加载数据并使用UTL_FILE包。我不知道这是否是最快的方法,但它非常快且非常灵活(我可以在加载时按照我的意愿操作文本数据)。
感谢所有的回复,我刚刚发布了这个,以便为遇到同样问题的人提供另一种选择。