日期:2014-05-17  浏览次数:20509 次

请问Windows服务何如操作Access数据库??急。。。
公司项目需求  要做一个监听服务,做了一个windows服务,之前用SQL SERVER测试代码正确运行, 现在数据库换成Access,就改了数据库连接字符串,服务运行就报错,数据库连接字符串如下:
在web中正确运行,服务就报错
public abstract class DbHelperOleDb
    {
        public static string connectionString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + HttpContext.Current.Server.MapPath("/MarketingTemplate.mdb");

        public DbHelperOleDb()
        {
        }
        ....
}


错误记录
2013-11-23 12:07:14 授权许可监听程序服务启动
2013-11-23 12:07:14 “HubeiQiwang.DBUtility.DbHelperOleDb”的类型初始值设定项引发异常。

项目结构

HubeiQiwang.MarketingTemplate  为WEB项目
HubeiQiwang.AuthorizeKeyService  为服务

只有21分了,各位大大帮帮忙~~

------解决方案--------------------
如果你觉得这类“类型初始值设定项引发异常”非常恶心(我一直觉得vs调试环境中最大的瑕疵就在于这个,看来只有等微软把vs版本升级到30版才能解决这个调试问题了),你完全可以把所有的内容都挪出类型初始化方法,而放到其它普通的方法里。

由于对象其它方法运行时对于对象初始化的需求、不过都是要获取之前设置的变量值,那么你可以把许多变量变为“延迟初始化”的。例如对于 DbConnetion,可以这样写
private DbConnection _conn;

private DbConnection Conn
{
    get
    {
        if(_conn == null)
        {
            _conn = .........创建 connection 对象
        }
        return _conn;
    }
}


而不需要在对象初始化方法中去创建 connection 对象。

这样做的目的是,vs调试器可以给出具体而正确的异常报告,并且支持你在vs调试器上即时调试程序,而不会报告一个垃圾地消息“类型初始值设定项引发异常”。
------解决方案--------------------
许多时候,灵活改为使用更为正确的开发方法,要比你凑巧拼凑出暂时的一两个结果更重要。

引用:
Windows服务怎么会调用HttpContext.Current.Server.MapPath呢。


是这样的。

如果vs正常调试器抛出异常,它一定会在 Current.Server 这里告诉你“未将对象应用为对象的实例”之类的明确的异常报告。而你的这种写法,vs的调试器就搞不定了。