【问题标题】:I am not able to insert more than 5120 records in Oracle table using .net application我无法使用 .net 应用程序在 Oracle 表中插入超过 5120 条记录
【发布时间】:2018-01-17 11:50:07
【问题描述】:

我正在使用以下代码批量插入超过 100 000 条记录

C#函数:

public void ExcelUpload(DataTable dt)
    {

    try
    {
        objBus.ClearMDPreprocessed();
        lblError1.Visible = true;
        lblError1.Text = "Preparing Sheet for Validations. Please Wait...";
        using (StreamWriter wr = new StreamWriter(MapPath(ConfigurationManager.AppSettings["MASTER_DATA_FOLDER"].ToString()) + "\\RawMasterData_PREPROCESSED.txt"))//(@"e:\WorkingFolder\output.txt"))
        {
            foreach (DataRow row in dt.Rows)
            {
                wr.WriteLine(row["EMPNO"] + "," + row["MODEL"] + "," + row["PRIMARY_SUPERVISOR"] + "," + row["PROJECT_MANAGER"] + "," + row["ISBPS"] + "," + row["BU"]);
            }
        }
        System.Diagnostics.Process sysprocess = new Process();
        string myCommand = @"/c SQLLDR " + ConfigurationManager.AppSettings["ORA_CONN_MASTER_" + ConfigurationManager.AppSettings["CONN"].ToString().Trim()].ToString().Trim() + " LOG=" + MapPath(ConfigurationManager.AppSettings["MASTER_DATA_FOLDER"].ToString()) + "\\MasterDataUpd_PP.Log" + " CONTROL=" + MapPath(ConfigurationManager.AppSettings["MASTER_DATA_FOLDER"].ToString()) + "\\Ctrl_PreProcessed_Raw.txt";
        ProcessStartInfo startInfo = new ProcessStartInfo("cmd.exe", myCommand);
        startInfo.RedirectStandardOutput = true;
        startInfo.UseShellExecute = false;
        startInfo.WorkingDirectory = MapPath(ConfigurationManager.AppSettings["MASTER_DATA_FOLDER"].ToString());
        startInfo.RedirectStandardError = true;
        startInfo.RedirectStandardInput = true;
        sysprocess = System.Diagnostics.Process.Start(startInfo);
        sysprocess.WaitForExit();
        if ((sysprocess.ExitCode == 4))
        {
            lblError1.Visible = true;
            lblError1.Text = "Sheet ready for Validations.Click on Validate";
            btnValidate.Visible = true;
            btnDirectUpload.Visible = true;

        }
        else
            HttpContext.Current.Response.Write("NOT DONE");
    }
    catch (Exception ex)
    {
        throw ex;
    }
}

Ctrl_Preprocessed_Raw.txt 内容:

LOAD DATA
    INFILE RawMasterData_PREPROCESSED.txt
    BADFILE dataFile.bad
    APPEND INTO TABLE MSI_MASTER_DATA_RAW
    FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '"'
    TRAILING NULLCOLS
    (EMPNO,MODEL,PRIMARY_SUPERVISOR,PROJECT_MANAGER,ISBPS,BU)

【问题讨论】:

  • 你为什么要调用 sqlldr?为什么不直接在代码中解析和加载文件呢?更容易控制和调试(你不会发布到 SO 想知道 wtf 有 5120 行等)。从 C# 进行系统调用还有其他问题。并且有几个很好的 csv 解析器库可以为您完成许多繁琐的工作。
  • 很奇怪,您手动解析 csv 文件以调用 sqlldr。查看 nuget.org/packages/LumenWorksCsvReader 并熟悉 Oracle 插入语句。
  • 如果直接针对 SQL*Loader 运行它会发生什么?

标签: c# oracle insert sql-loader


【解决方案1】:

我不懂 C#,但 LOAD DATA INFILE ... 看起来 非常 像 SQL*Loader。它有一个控制文件。在其中,您可以设置 error limit,一旦达到该限制就会终止执行。所以,也许它被设置为 5120。也许你可以检查一下。

[编辑]

天哪,当然它没有设置为 5120 ...您设法加载了那么多行。默认情况下,限制设置为 50。如果您查看 SQL*Loader 日志文件(以及 BAD 文件,如果您将它们设置为使用 - 是的,您应该设置它),您可能会找到这些信息在那里。

【讨论】:

  • 如果您通读代码,您会注意到它在大约第 17 行调用 SQLLDR。我添加了 [sql-loader] 标记。
  • 谢谢你,@Bob。没注意到。一定是选择性失明,C#代码+长行对我来说就像丛林——一堆彩色字母:)
  • 我发誓(这给我带来了麻烦 :-) - 过去 30 年来设计语言的人似乎都在使用同一个剧本。 “我们想要一些新的东西!令人兴奋的!原创的!看起来就像 C ......”。 WTF?!?!?
  • @Bob,有时我们无法决定应用程序中使用的语言。这个世界上有一些遗留应用程序必须遵循旧的传统步骤。改变概念对更大的系统意义重大。
【解决方案2】:

我已经使用以下步骤解决了它:

1) startInfo.RedirectStandardOutput = false; //这是我做的假

2) startInfo.RedirectStandardInput = true; //我已经注释了这一行。

这解决了我的问题,并且我能够通过 SQL 加载器在 oracle 中插入批量记录,而上述代码没有任何问题。感谢大家的投入。 :)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-04-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多