我正在尝试将数据行从sql导出到excel,但我的Insert命令似乎每次都失败。我花了很多时间试图创造这个,但我终于遇到了困难。
excel文档是由IRS生成的文档,我们不会大声修改第16行以上的任何内容。第16行是标题行,下面的所有内容都需要是来自sql的数据。标题名称中都有空格,这似乎是我遇到麻烦的地方。
从第16行开始,列名为: 与会者名字,与会者姓氏,与会者PTIN,节目编号,CE小时奖励计划,完成日期
这就是我试图写入excel的方式
private void GenerateReport()
{
FileInfo xlsFileInfo = new FileInfo(Server.MapPath(CE_REPORTS_PATH + CE_PTIN_TEMPLATE + EXTENSION));
string connectionString = String.Format(@"Provider=Microsoft.ACE.OLEDB.12.0;Data Source={0};Extended Properties='Excel 8.0;HDR=Yes'", xlsFileInfo.FullName);
//create connection
OleDbConnection oleDBConnection = new OleDbConnection(connectionString);
oleDBConnection.Open();
//create the adapter with the select to get
OleDbDataAdapter adapter = new OleDbDataAdapter("SELECT * FROM [Sheet1$A16:F16]", oleDBConnection);
// Create the dataset and fill it by using the adapter.
DataTable dataTable = new DataTable();
adapter.FillSchema(dataTable, SchemaType.Source);
adapter.Fill(dataTable);
string[] colNames = new string[dataTable.Columns.Count];
string[] colParms = new string[dataTable.Columns.Count];
for (int i = 0; i < dataTable.Columns.Count; i++)
{
colNames[i] = String.Format("[{0}]", dataTable.Columns[i].ColumnName);
colParms[i] = "?";
}
// Create Insert Command
adapter.InsertCommand = new OleDbCommand(String.Format("INSERT INTO [Sheet1$] ({0}) values ({1})", string.Join(",", colNames), string.Join(",", colParms)), oleDBConnection);
// Create Paramaters
for (int i = 0; i < dataTable.Columns.Count; i++)
{
OleDbParameter param = new OleDbParameter(String.Format("@[{0}]", dataTable.Columns[i].ColumnName), OleDbType.Char, 255, dataTable.Columns[i].ColumnName);
adapter.InsertCommand.Parameters.Add(param);
}
// create a new row
DataRow newCERecord = dataTable.NewRow();
// populate row with test data
for (int i = 0; i < dataTable.Columns.Count; i++)
{
newCERecord[i] = "new Data";
}
dataTable.Rows.Add(newCERecord);
// Call update on the adapter to save all the changes to the dataset
adapter.Update(dataTable);
oleDBConnection.Close();
}
调用adapter.Update(dataTable)时会发生错误,如下所示
$exception {"The INSERT INTO statement contains the following unknown field name: 'Attendee First Name'. Make sure you have typed the name correctly, and try the operation again."} System.Exception {System.Data.OleDb.OleDbException}
这很令人沮丧,因为我直接从列名中拉出每个字段,这是由colNames [i] = String.Format(“[{0}]”,dataTable.Columns [i] .ColumnName)获得的。我发现我需要[]来考虑列名中的空格,但此时我不确定问题是什么。当我查看excel文件时,一切似乎都是正确的。
答案 0 :(得分:4)
我实际上为您找到了一篇完整代码完成的Microsoft文章 - 您可以复制&amp;粘贴你最喜欢的解决方案。这是链接:
http://support.microsoft.com/kb/306023
似乎CopyRecordset
的那个是最简单的方法,尽管他们确实解释了我提到的那个(使用制表符分隔文件)。
编辑:这是我原来的答案,为了完整起见。请参阅上面的链接,了解更多详细信息以及可能的更好解决方案。
这不是您的问题的答案,而是改变您的方法的建议(如果可以的话)。通过COM调用添加数据时Excel往往非常慢,我认为OleDB在内部使用COM。根据我的经验,将数据输出到Excel的最快(并且巧合最痛苦的方法)是生成包含所有数据的制表符分隔文本文件,然后将文件导入Excel并使用COM互操作在工作表上执行任何格式化。当我以这种方式生成Excel报告时,我生成的大多数报告的生成速度几乎比使用Excel COM对象模型快100倍。 (我不知道OleDB调用是否会相同,因为我从未在Excel中使用过OleDB,但我愿意打赌OleDB适配器在内部使用COM。)
这也会解决您的嵌入式空间问题,因为tab是列分隔符。
在您的特定情况下,我将文本文件导入Excel到新工作表中,然后复制&amp;将其粘贴到IRS表中,位于正确的位置。完成后,可以删除临时表。
答案 1 :(得分:0)
数据库表中的字段名称是什么?你能提到它们以及excel标题列名吗?