Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/oracle/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# Can';t使用c将大型数据从oracle导出到excel文件#_C#_Oracle - Fatal编程技术网

C# Can';t使用c将大型数据从oracle导出到excel文件#

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

我在将大型数据从oracle表提取到C#时遇到问题,我 我自己找不到解决办法

对于这个任务,我编写了一个C#代码,它第一次从oracle过程加载数据,返回excel文件中的游标。 但当我试图加载更大的表(大约20列和90000行)时,它就是不起作用。 脚本不会出错,但数据不会插入excel文件

我尝试加载10000行,然后保存结果,但还是只插入了30000行。 我监视了循环中的计数器,它运行正常,达到了所需的90 000,并且
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