这两天研究一个东西,利用C#做一个Oracle导出工具,利用到Process类,具体代码如下:
try
{
OracleHelper oracle = new OracleHelper(this.ConString);
oracle.RunSQLToNonQuery(string.Format(@"CREATE OR REPLACE DIRECTORY DMPFILE AS 'D:\OracleData\OracleBack'"));
DataTable dt = oracle.RunSQLToDataTable("select * from dba_directories WHERE DIRECTORY_NAME = 'DMPFILE'");
if (dt == null || dt.Rows.Count <= 0)
{
MessageBox.Show("未查询到虚拟目录数据,请检查;虚拟目录名称:DMPFILE");
return;
}
string users = this.GetUsers();
if (users.IsNullOrEmptyOrZero())
{
MessageBox.Show("请选择需要导出的用户。");
return;
}
Process p = new Process();
p.StartInfo.FileName = "C:\\Windows\\system32\\cmd.exe";
p.StartInfo.UseShellExecute = false;
p.StartInfo.RedirectStandardInput = true;
p.StartInfo.RedirectStandardOutput = true;
p.StartInfo.RedirectStandardError = true;
//p.StartInfo.WindowStyle = ProcessWindowStyle.Normal;
p.StartInfo.CreateNoWindow = false;
p.Start();
p.StandardInput.WriteLine("md D:\\OracleData\\OracleBack;");
string fileName = string.Format("GDBDC{0}", DateTime.Now.ToString("yyyyMMddHHss"));
p.StandardInput.WriteLine(string.Format("expdp {0}/{1}@{2} schemas={3} dumpfile={4}.dmp DIRECTORY=DMPFILE logfile={4}.log&exit", this.txtUserName.Text, this.txtUserPwd.Text, this.txtOracleName.Text, users, fileName));
string resultInfo = p.StandardOutput.ReadToEnd();
string errorInfo = p.StandardError.ReadToEnd();
LogOperation.WriteInfo("", resultInfo);
LogOperation.WriteInfo("", errorInfo);
p.WaitForExit();
p.Close();
MessageBox.Show("保存结果:D:\\OracleData\\OracleBack\\" + fileName);
}
catch (Exception e)
{
Console.WriteLine(e);
}
当执行到p.StandardOutput.ReadToEnd();时,一直处于卡死状态,整了一天都没找到原因,包括网上查找资料,利用多线程等等,一切都是徒劳的,最后无意间发现,实际不是卡死,而是操作为执行完,需要等待;真是整死人了;
总结:细心、耐心、要有创造想象力,问题不是那么复杂,只是你没有用心而已