使用OLEDB将数据表导出到Excel会抛出太多字段定义错误

时间:2012-02-08 07:17:08

标签: c# .net oledb

我们有一个包含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 个答案:

答案 0 :(得分:1)

我发现使用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);
            }
        }

现在我能够解决导出大量数据的问题

答案 1 :(得分:0)

Excel(您正在连接)是否通过“表”定义限制了它支持的列?这可能是你的瓶颈。

我建议的是,在构建表格时,您可以为所有列执行此操作。我建议在批量循环中运行它。调用该函数并一次执行100列,并仅导出2或3行。因此,构建所有2000列可能需要20个循环周期,但您可能会在那里找到它。如果你要获得完整的2000列,那么展开正在导出的行并找出插入的ROW失败的行。可能会有一些NULL值浮动来杀死你的进程。