在Windows服务中使用OleDb从Excel中读取?
免责声明:我知道这是一个糟糕的做事方式。 这是我们与客户的唯一select。
问题:
我们需要每x次读取Excel文件中的数据。 数据通过第三方Excel插件不断变化。应用程序的环境是Windows XP,SP1和.Net 2.0。 不要将操作系统升级到SP2 / 3或升级.Net Framework。 再次,这是所有的客户参数。
以下是我们现有的代码:
String sConnectionString = @“Provider = Microsoft.Jet.OLEDB.4.0; Data Source =”+ Settings.ReutersFilePath +“; Extended Properties = \”Excel 8.0; HDR = No; IMEX = 1 \“”; 使用(OleDbConnection objConn =新的OleDbConnection(sConnectionString)) { 尝试 { objConn.Open(); _dataSet = new DataSet(); OleDbCommand objCmdSelect = new OleDbCommand(“SELECT * FROM [”+ ConfigurationManager.AppSettings [“Excel.WorksheetName”] +“$]”,objConn); OleDbDataAdapter objAdapter1 = new OleDbDataAdapter(); objAdapter1.SelectCommand = objCmdSelect; objAdapter1.Fill(_dataSet); _dataTable = _dataSet.Tables [0]; objConn.Close(); //将新数据保存到数据库中。 即updateSQL(); } catch(Exception ex){} 最后 { _isCurrentlyProcessing = false; if(objConn!= null &&(objConn.State!= ConnectionState.Broken || objConn.State!= ConnectionState.Closed)) { objConn.Close(); } } }
此代码在从控制台或Windows窗体运行时起作用,但是当我们从Windows服务运行它时,它无法访问Excel文件。 XP w / SP1有没有限制,不允许与Vista中的桌面应用程序交互? 这可以通过服务完成吗? 客户非常需要运行服务的可靠性。
编辑:
该服务以LocalSystem身份运行。
编辑#2:
从服务运行时得到的错误是:Microsoft Jet数据库引擎无法打开文件“”。 它已经由另一个用户专门打开,或者您需要查看其数据的权限。
Excel文件在桌面上打开,但必须打开才能从第三方应用程序获取更新。
除了@ sontek的回答。
[只适用于如果您是相关电子表格的拥有者/开发者…]
您可能会发现使用“数据推送”模式而不是“数据推送”模式更容易。 根据插件的某些事件,通过一个Excelmacros直接将数据推送到数据存储区通常是一个更简单的编程模型。 这通常比定时器上的服务轮询更好。
Excel不允许你同时打开一个文件。 您需要将其作为共享工作簿创build,或者创build该文件的副本并从副本中删除。
还有完整的excel API(Microsoft.Office.Interop.Excel),你可以尝试使用,这将允许你钩入当前打开的Excel /工作簿。
什么用户是运行的服务? 确保用户有权访问特定的文件。
这似乎很可能是一个权限问题。 Windows服务在与桌面应用程序不同的用户帐户下运行。
另外,你提到你每x次执行一次这个方法。 确保你使用正确的计时器。 http://www.aspfree.com/c/a/C-Sharp/Timer-Objects-in-Windows-Services-with-C-sharp-dot-NET/
而且您应该可以使用“附加到进程”并select您的主机进程,将debugging器附加到该服务。 这可能会给你更多关于你的问题的信息。 http://msdn.microsoft.com/en-us/library/7a50syb3(VS.80).aspx
SpreadsheetGear for .NET可以打开文件,即使Excel当前打开了文件,也非常适合从Windows服务中使用。
但是,磁盘上的文件不会反映Excel未保存的更改,而且Excel正处于保存过程中,SpreadsheetGear将无法打开工作簿,因此服务将不得不考虑这一点。
免责声明:我自己的SpreadsheetGear LLC
您可以尝试将其制作为共享工作簿(“工具”>“共享工作簿”)。 这可以让多个用户同时编辑同一个工作簿。 我不确定这是否适用于您,因为某些工作簿function在共享时被locking