При экспорте таблицы данных в Excel с использованием OLEDB возникает ошибка, связанная с слишком большим количеством полей - PullRequest
1 голос
/ 08 февраля 2012

У нас есть таблица данных с 2500 столбцами и 2000 строками.Когда мы пытаемся экспортировать с использованием OLEDB, я получаю сообщение об ошибке «слишком много полей».Я не могу использовать Excel Inter op, так как он занимает больше времени.Есть ли другой способ исправить эту проблему

using (OleDbConnection con = new OleDbConnection("Provider=Microsoft.ACE.OLEDB.12.0;" + "Data Source=" + fileName + ";" + "Extended Properties=" + "\"" + "Excel 8.0;HDR=NO;" + "\""))
                {
                    con.Open();
                    OleDbCommand cmdInsert;
                    if (createTable || !File.Exists(fileName))
                    {
                        sql = "CREATE TABLE " + tableName + " (";
                        for (int i = 0; i < tbl.Columns.Count; i++)
                        {
                            sql += "[" + tbl.Columns[i].ColumnName + "]";
                            if (i + 1 == tbl.Columns.Count) //Here we decide should we close insert command or appebd another create column command
                                sql += " " + GetColumnType(tbl.Columns[i]) + ")"; //Close insert
                            else
                                sql += " " + GetColumnType(tbl.Columns[i]) + ","; //there is more columns to add
                        }
                    }
                    if (!String.IsNullOrEmpty(sql))
                    {
                        cmdInsert = new OleDbCommand(sql, con);
                        cmdInsert.ExecuteNonQuery();
                    }
                    foreach (DataRow row in tbl.Rows)
                    {
                        //Dodati parametre na comandu
                        string values = "(";
                        for (int i = 0; i < tbl.Columns.Count; i++)
                        {
                            if (i + 1 == tbl.Columns.Count)
                            {
                                 if (tbl.Columns[i].DataType == System.Type.GetType("System.Decimal") ||
                                     tbl.Columns[i].DataType == System.Type.GetType("System.Int64") ||
                                     tbl.Columns[i].DataType == System.Type.GetType("System.Double"))
                                    values += String.IsNullOrEmpty(row[i].ToString()) ? "0)" : Convert.ToDecimal(row[i]).ToString("#0.00", _infoEn) + ")";
                                else
                                    values += "'" + System.Security.SecurityElement.Escape(row[i].ToString()) + "')";

                                //values += "'" + "test" + "')";
                            }
                            else
                            {
                                if (tbl.Columns[i].DataType == System.Type.GetType("System.Decimal") ||
                                     tbl.Columns[i].DataType == System.Type.GetType("System.Int64") ||
                                     tbl.Columns[i].DataType == System.Type.GetType("System.Double"))
                                    values += String.IsNullOrEmpty(row[i].ToString()) ? "0," : Convert.ToDecimal(row[i]).ToString("#0.00", _infoEn) + ",";
                                else
                                    values += "'" + System.Security.SecurityElement.Escape(row[i].ToString()) + "',";

                                //values += "'" + "test" + "',";
                            }
                        }
                        string sqlInsert = String.Format("Insert into [{0}$] VALUES {1}", tableName, values);
                        cmdInsert = new OleDbCommand(sqlInsert, con);

                        cmdInsert.ExecuteNonQuery();
                    }
                }

Ответы [ 2 ]

1 голос
/ 09 февраля 2012

Я обнаружил, что ограничение использования oledb составляет 255 столбцов.Поэтому я преобразовываю данные в CSV, используя приведенный ниже код, и записываю его в ответ на http-странице

public void CreateCSVFile(System.Data.DataTable dt, out StringWriter stw)
        {
            stw = new StringWriter();
            int iColCount = dt.Columns.Count;
            for (int i = 0; i < iColCount; i++)
            {
                stw.Write(dt.Columns[i]);
                if (i < iColCount - 1)
                {
                    stw.Write(",");
                }
            }
            stw.Write(stw.NewLine);
            foreach (DataRow dr in dt.Rows)
            {
                for (int i = 0; i < iColCount; i++)
                {
                    if (!Convert.IsDBNull(dr[i]))
                    {
                        stw.Write(dr[i].ToString());
                    }
                    if (i < iColCount - 1)
                    {
                        stw.Write(",");
                    }
                }
                stw.Write(stw.NewLine);
            }
        }

. Теперь я могу решить проблему экспорта огромных данных

0 голосов
/ 08 февраля 2012

Имеет ли Excel (который вы тоже подключаетесь) ограничение на количество столбцов, которые он поддерживает с помощью определения таблицы?это может быть вашим узким местом.

Я бы сказал, что при создании таблицы вы делаете это для всех столбцов.Я бы предложил запустить его в пакетных циклах.Вызовите функцию и сделайте 100 столбцов одновременно и экспортируйте только 2 или 3 строки.Таким образом, для построения всех 2000 столбцов может потребоваться 20 циклов цикла, но вы можете найти там свой разрыв.Если вы ДЕЙСТВИТЕЛЬНО доберетесь до полных 2000 столбцов, то разверните экспортируемые строки и выясните, с какой строкой вставлено, произойдет сбой.Это может быть несколько значений NULL, которые убивают ваш процесс.

...