我们有一个包含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();
}
}
答案 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值浮动来杀死你的进程。