无法使用c#将大数据从oracle导出到excel文件

时间:2016-09-09 11:53:17

标签: c# oracle

我在将大数据从oracle表提取到C#时遇到问题,而我  我自己找不到解决方案。

对于这个任务,我写了一个C#代码,它首次在excel文件中加载来自oracle过程的数据,该过程返回游标。 但是当我试图加载更大的表(大约20列和90 000行)时,它只是没有用。 脚本不会出错,但数据不会插入excel文件中。

我尝试加载10 000行然后保存结果,但同样,只插入了30 000行。 我循环监视计数器,它是正确的,达到所需的90 000,ExecuteNonQuery()总是返回值10 000.但是当我打开excel文件时,那里只有30 000行。

你能帮助我抓住这个错误,或者可能有人遇到同样的问题,并且可以建议我做什么或者读什么。

感谢您的帮助!

我没有写连接字符串,但我认为,这是正确的,因为脚本可以正常使用小数据表。

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());
        }

    }
}

PS:Same question in Russian.

0 个答案:

没有答案