Bob*_*ser 6 c# excel oledbdataadapter ms-jet-ace
我遇到了将数据从数据集写入Excel电子表格的超时问题.这是我目前的连接字符串:
<add key="ExcelConnectionStringHeader" value="Provider=Microsoft.ACE.OLEDB.12.0;Connect Timeout=30;Extended Properties="Excel 12.0;HDR=YES";Data Source="/>
Run Code Online (Sandbox Code Playgroud)
提供程序似乎不支持"连接超时"属性.连接超时,超时,ConnectionTimeout,ConnectTimeout等都没有.我的代码创建了数据适配器和插入命令,以及数据集的更新.除非Update命令本身花费超过15秒,这是默认的OleDb超时,否则这很有效.这就是为什么我试图在连接字符串中设置它.我已将CommandTimeout从默认值30增加,但这确实无关紧要.以下是我的代码:
OleDbDataAdapter da = new OleDbDataAdapter(szHeaderSelect, oCnn); // Ratings_Test -- Loan_Test$A1:F1]",
DataSet dsTest = new DataSet();
da.InsertCommand = new OleDbCommand(szNewSQL + "(" + szColumns + ") " + "VALUES ( " + szParams + ")", oCnn);
da.InsertCommand.CommandTimeout = 300;
foreach (DataRow oDr in dtTable.Rows)
{
drNew = dsTest.Tables[0].NewRow();
dsTest.Tables[0].Rows.Add(drNew);
}
var timer = new System.Diagnostics.Stopwatch();
timer.Start();
var recs = da.Update(dsTest, szExcelTab); // Ratings_Test }
timer.Stop();
Run Code Online (Sandbox Code Playgroud)
我省略了循环,实际上构建了insert命令的内容和参数.相信我,一切正常.2200+记录工作正常.
在我添加计时器之后,我发现问题是超时.处理2221记录时,需要14.95秒,并在电子表格中显示正常.处理2260条记录时,需要15.21秒才会显示任何内容.没有任何错误.我检查了所有行更新后的行状态,它们都没有显示失败.
最重要的是,由于ConnectionTimeout属性是ReadOnly,并且提供程序似乎不支持连接字符串中的Timeout,该怎么做....
谢谢.
这是我的想法:
您确定这是超时而不是“电子表格已满”错误吗?这是我的代码,大约 1:50 后完成,如果您将其增加到 4,000,000 行,您会得到“电子表格已满”。~4:50 之后出现错误:
static void Main(string[] args)
{
var timer = new System.Diagnostics.Stopwatch();
try
{
string connectionString = "Provider=Microsoft.ACE.OLEDB.12.0;Extended Properties=\"Excel 12.0;HDR=YES;\";Data Source=Book1.xlsx";
using (OleDbConnection oleDbConnection = new OleDbConnection(connectionString))
{
oleDbConnection.Open();
string szHeaderSelect = "SELECT [A1] FROM from [Sheet1$]";
using (OleDbDataAdapter da = new OleDbDataAdapter(szHeaderSelect, oleDbConnection))
{
using (da.InsertCommand = new OleDbCommand("INSERT INTO [Sheet1$] ( [A1] ) VALUES (?)",
oleDbConnection))
{
da.InsertCommand.Parameters.Add("A1", OleDbType.Integer, 20, "[A1]");
List<int> testData = new List<int>();
for (int i = 1; i < 400000; i++)
{
testData.Add(i);
}
DataSet dsTest = new DataSet();
dsTest.Tables.Add("[Sheet1$]");
dsTest.Tables[0].Columns.Add("[A1]");
foreach (int number in testData)
{
DataRow drNew = dsTest.Tables[0].NewRow();
drNew["[A1]"] = number;
dsTest.Tables[0].Rows.Add(drNew);
}
timer.Start();
var recs = da.Update(dsTest, "[Sheet1$]");
}
}
}
}
catch (Exception ex)
{
Console.Out.WriteLine(ex.Message);
}
finally
{
timer.Stop();
Console.WriteLine(timer.Elapsed);
}
// Don't close before I get to read the results
Console.WriteLine();
Console.WriteLine("Press Enter to quit.");
Console.ReadLine();
}
Run Code Online (Sandbox Code Playgroud)