C# Can';t使用c将大型数据从oracle导出到excel文件#
我在将大型数据从oracle表提取到C#时遇到问题,我 我自己找不到解决办法 对于这个任务,我编写了一个C#代码,它第一次从oracle过程加载数据,返回excel文件中的游标。 但当我试图加载更大的表(大约20列和90000行)时,它就是不起作用。 脚本不会出错,但数据不会插入excel文件 我尝试加载10000行,然后保存结果,但还是只插入了30000行。 我监视了循环中的计数器,它运行正常,达到了所需的90 000,并且C# Can';t使用c将大型数据从oracle导出到excel文件#,c#,oracle,C#,Oracle,我在将大型数据从oracle表提取到C#时遇到问题,我 我自己找不到解决办法 对于这个任务,我编写了一个C#代码,它第一次从oracle过程加载数据,返回excel文件中的游标。 但当我试图加载更大的表(大约20列和90000行)时,它就是不起作用。 脚本不会出错,但数据不会插入excel文件 我尝试加载10000行,然后保存结果,但还是只插入了30000行。 我监视了循环中的计数器,它运行正常,达到了所需的90 000,并且ExecuteNonQuery()始终返回值10 000。但当我打开e
ExecuteNonQuery()
始终返回值10 000。但当我打开excel文件时,只有30000行
你能不能帮我抓住错误,或者可能有人遇到了同样的问题,并可以建议我做什么或读什么
谢谢你的帮助
我没有编写连接字符串,但我认为它是正确的,因为脚本可以正确地处理小数据表
public static void Main()
{
string datetime = DateTime.Now.ToString("yyyy-MM-dd HH-mm-ss");
System.Threading.Thread.CurrentThread.CurrentUICulture = new System.Globalization.CultureInfo("en-US");
try
{
OleDbConnection Excel_OLE_Con = new OleDbConnection();
OleDbCommand Excel_OLE_Cmd = new OleDbCommand();
string qwe_constr = "connection string";
OracleConnection myADONETConnection = new OracleConnection(qwe_constr);
string connstring = "Provider=Microsoft.ACE.OLEDB.12.0;" + "Data Source=" + "E:\\qaz\\15.07.2016\\qwe" +
";" + "Extended Properties=\"Excel 12.0 Xml;HDR=YES;\"";
File.Delete("E:\\qaz\\15.07.2016\\qwe.xlsx");
//fill datatable with data for insert
myADONETConnection.Open();
OracleCommand cmd_proc = new OracleCommand();
cmd_proc.Connection = myADONETConnection;
cmd_proc.CommandType = System.Data.CommandType.StoredProcedure;
cmd_proc.CommandText = "procedure_name";
cmd_proc.Parameters.Add("p_show_del", OracleDbType.Int16).Value = 0;
cmd_proc.Parameters.Add("p_type", OracleDbType.Varchar2, 3).Value = "INV";
cmd_proc.Parameters.Add("p_errno", OracleDbType.Int16).Value = 157;
cmd_proc.Parameters.Add("outcur", OracleDbType.RefCursor).Direction = ParameterDirection.Output;
DataTable dt_with_data = new DataTable();
dt_with_data.Load(cmd_proc.ExecuteReader());
myADONETConnection.Close();
//string with column headers
string TableColumns = "";
foreach (DataColumn column in dt_with_data.Columns)
{
TableColumns += column + "],[";
}
// Replace most right comma from Columnlist
TableColumns = ("[" + TableColumns.Replace(",", " Text,").TrimEnd(','));
TableColumns = TableColumns.Remove(TableColumns.Length - 2);
//Use OLE DB Connection and Create Excel Sheet
Excel_OLE_Con.ConnectionString = connstring;
Excel_OLE_Con.Open();
Excel_OLE_Cmd.Connection = Excel_OLE_Con;
Excel_OLE_Cmd.CommandText = "Create table [sheet1] (" + TableColumns + ")";
Excel_OLE_Cmd.ExecuteNonQuery();
Excel_OLE_Con.Close();
//Write Data to Excel Sheet from DataTable dynamically
//string with command
Excel_OLE_Con.Open();
String sqlCommandInsert = "";
String sqlCommandValue = "";
foreach (DataColumn dataColumn in dt_with_data.Columns)
{
sqlCommandValue += dataColumn + "],[";
}
sqlCommandValue = "[" + sqlCommandValue.TrimEnd(',');
sqlCommandValue = sqlCommandValue.Remove(sqlCommandValue.Length - 2);
sqlCommandInsert = "INSERT into [sheet1] (" + sqlCommandValue + ") VALUES(";
int columnCount = dt_with_data.Columns.Count;
int i_qaz = 0;
foreach (DataRow row in dt_with_data.Rows)
{
i_qaz++;
Console.WriteLine(i_qaz.ToString());
string columnvalues = "";
for (int i = 0; i < columnCount; i++)
{
int index = dt_with_data.Rows.IndexOf(row);
columnvalues += "'" + dt_with_data.Rows[index].ItemArray[i].ToString().Replace("'", "''") + "',";
}
columnvalues = columnvalues.TrimEnd(',');
var command = sqlCommandInsert + columnvalues + ")";
Excel_OLE_Cmd.CommandText = command;
Excel_OLE_Cmd.ExecuteNonQuery();
}
}
catch (Exception exception)
{
// Create Log File for Errors
using (StreamWriter sw = File.CreateText("E:\\qaz\\15.07.2016\\qwe_" + datetime + ".log"))
{
sw.WriteLine(exception.ToString());
}
}
}
publicstaticvoidmain()
{
字符串datetime=datetime.Now.ToString(“yyyy-MM-dd-HH-MM-ss”);
System.Threading.Thread.CurrentThread.CurrentUICulture=新系统.Globalization.CultureInfo(“en-US”);
尝试
{
OleDbConnection Excel_OLE_Con=新的OleDbConnection();
OleDbCommand Excel_OLE_Cmd=新的OleDbCommand();
字符串qwe_constr=“连接字符串”;
OracleConnection myADONETConnection=新的OracleConnection(qwe_constr);
string connstring=“Provider=Microsoft.ACE.OLEDB.12.0;”“+”数据源=“+”E:\\qaz\\15.07.2016\\qwe”+
“;”+“扩展属性=\”Excel 12.0 Xml;HDR=是;\“”;
文件。删除(“E:\\qaz\\15.07.2016\\qwe.xlsx”);
//用插入数据填充datatable
myADONETConnection.Open();
OracleCommand cmd_proc=新的OracleCommand();
cmd_proc.Connection=myADONETConnection;
cmd_proc.CommandType=System.Data.CommandType.StoredProcess;
cmd_proc.CommandText=“过程名称”;
cmd_proc.Parameters.Add(“p_show_del”,OracleDbType.Int16).Value=0;
cmd_proc.Parameters.Add(“p_type”,OracleDbType.Varchar2,3).Value=“INV”;
cmd_proc.Parameters.Add(“p_errno”,OracleDbType.Int16).Value=157;
cmd_proc.Parameters.Add(“outcur”,OracleDbType.RefCursor).Direction=ParameterDirection.Output;
DataTable dt_with_data=新DataTable();
dt_with_data.Load(cmd_proc.ExecuteReader());
myADONETConnection.Close();
//带列标题的字符串
字符串TableColumns=“”;
foreach(dt_中的DataColumn列与_data.Columns)
{
TableColumns+=列+“],[”;
}
//替换列列表中最右边的逗号
TableColumns=(“[”+TableColumns.Replace(“,”,“Text)”).TrimEnd(“,”);
TableColumns=TableColumns.Remove(TableColumns.Length-2);
//使用OLE DB连接并创建Excel工作表
Excel\u OLE\u Con.ConnectionString=connstring;
Excel_OLE_Con.Open();
Excel\u OLE\u Cmd.Connection=Excel\u OLE\u Con;
Excel_OLE_Cmd.CommandText=“创建表[sheet1](“+TableColumns+”);
Excel_OLE_Cmd.ExecuteNonQuery();
Excel_OLE_Con.Close();
//将数据从DataTable动态写入Excel工作表
//带命令的字符串
Excel_OLE_Con.Open();
字符串sqlCommandInsert=“”;
字符串sqlCommandValue=“”;
foreach(dt_中的DataColumn DataColumn与_data.Columns)
{
sqlCommandValue+=dataColumn+“],[”;
}
sqlCommandValue=“[”+sqlCommandValue.TrimEnd(',');
sqlCommandValue=sqlCommandValue.Remove(sqlCommandValue.Length-2);
sqlCommandInsert=“插入到[sheet1](“+sqlCommandValue+”)值(”;
int columnCount=dt_和_data.Columns.Count;
int i_qaz=0;
foreach(dt_中的DataRow行与_data.Rows)
{
i_qaz++;
Console.WriteLine(i_qaz.ToString());
字符串columnvalues=“”;
对于(int i=0;i
PS:问题显然是Excel provider的问题。请检查此链接,它可以为您提供解决方案。首先构建一个中间容器,以消除任何“贡献”从Excel提供程序中查看您的数组或映射是否正确填充。感谢您提供的一些想法,我今天将尝试将数据导出到txt文件,以确保100%解决Excel的问题。我没有在上面的链接中找到解决方案,但我今天将再次尝试详细查看。另一个注意事项。我更改了代码并尝试使用更新每个单元格的值,而不是使用insert into sheet命令,该命令将数据表中的行插入excel文件。通过这种方式,我甚至可以加载10万行,并且没有出现任何错误,但当然,当以前的版本在2分钟内插入3万行时,需要花费更多的时间,大约70分钟使用“插入到工作表值”命令。感谢您的帮助!for(int i=0;i