我无法使用 .net 应用程序在 Oracle table 中插入超过 5120 条记录
I am not able to insert more than 5120 records in Oracle table using .net application
我正在使用以下代码批量插入超过 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)
我不懂 C#,但是 LOAD DATA INFILE ...
看起来非常 像 SQL*Loader。它有一个控制文件。在其中,您可以设置 error limit 一旦达到该限制就会终止执行。所以,也许它设置为 5120。也许你可以检查一下。
[编辑]
天哪,当然它没有设置为 5120 ...您设法加载了那么多行。默认情况下,限制设置为 50。如果您查看 SQL*Loader 日志文件(以及 BAD 文件,如果您将它们设置为使用 - 是的,您应该设置它),您可能会在那里找到这些信息。
我已经通过以下步骤解决了这个问题:
1) startInfo.RedirectStandardOutput = false; //这是我做的 false
2) startInfo.RedirectStandardInput = 真; //我已经评论了这一行。
这解决了我的问题,并且我能够通过 SQL 加载程序在 oracle 中插入批量记录,上面的代码没有任何问题。感谢大家的投入。 :)
我正在使用以下代码批量插入超过 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)
我不懂 C#,但是 LOAD DATA INFILE ...
看起来非常 像 SQL*Loader。它有一个控制文件。在其中,您可以设置 error limit 一旦达到该限制就会终止执行。所以,也许它设置为 5120。也许你可以检查一下。
[编辑]
天哪,当然它没有设置为 5120 ...您设法加载了那么多行。默认情况下,限制设置为 50。如果您查看 SQL*Loader 日志文件(以及 BAD 文件,如果您将它们设置为使用 - 是的,您应该设置它),您可能会在那里找到这些信息。
我已经通过以下步骤解决了这个问题:
1) startInfo.RedirectStandardOutput = false; //这是我做的 false
2) startInfo.RedirectStandardInput = 真; //我已经评论了这一行。
这解决了我的问题,并且我能够通过 SQL 加载程序在 oracle 中插入批量记录,上面的代码没有任何问题。感谢大家的投入。 :)