本人最近在做一个基于Access数据库的Web应用程序,为了实现一个定时更新数据库的需求,我在Global.asax中的Application_Start函数里写了个计时器,
void Application_Start(object sender, EventArgs e) { // 在应用程序启动时运行的代码 System.Timers.Timer atimer = new System.Timers.Timer(60000); atimer.Elapsed += timer_execute; atimer.AutoReset = true; atimer.Enabled = true; }
并在计时器的间隔事件处理函数中加入了一些操作数据库的代码(略),于是在本地IIS上测试通过。上传到服务器上(Windows 2003+IIS6)以后,奇怪的事情发生了,计时器间隔事件处理函数中的操作数据库代码死活不运行,也看不到报错。然后我在网上找啊找,有人说要把Global.asax.cs的代码放到Global.asax中,还有人说要什么整站编译等等,经本人测试均无效。经过N多的尝试和测试(此处省略千百字),终于让我想到了一个揪出异常信息的办法,我将操作数据库的代码直接放到Application_Start中,
void Application_Start(object sender, EventArgs e) { // 在应用程序启动时运行的代码 System.Timers.Timer atimer = new System.Timers.Timer(60000); atimer.Elapsed += timer_execute; atimer.AutoReset = true; atimer.Enabled = true; //执行数据库写入方法 try { TimerLogBLL tlbll = new TimerLogBLL(); tlbll.UpdateTimerLog(true); } catch (Exception) { throw; } }
更新服务器上的代码后立马见到了报错信息:
操作必须使用一个可更新的查询
顿时我就茅塞顿开,很显然这是IIS没有权限更新数据库文件,那么计时器间隔事件处理函数中操作数据库的代码显然也是因为这个原因而操作失败,只是它无法抛出异常而已。于是我果断把IUSR的写入权限加到了数据库文件所在的目录,经测试仍然失败,再加修改权限,测试通过,问题解决。
总结:对于使用Access数据库的网站而言,如果使用的是IIS6及以下版本(目前我在IIS7及以上版本没发现有这问题),Global.asax中的代码执行时必须确保IIS的相应用户拥有足够的权限来操作数据库,尤其是“修改”权限,这是比“写入”更高的权限。另外,计时器间隔事件处理函数中出现的异常无法抛出。