无法访问 SQLite 数据库表单 windows 服务

Unable to access SQLite Database form windows services

我为 outlook 2010 开发了一个插件。在 outlook 启动时,插件将所有邮件主题存储在 SQLite 数据库中。

现在我必须创建一个 windows 服务,它也将访问相同的数据库,并且 post 它在基于休息的服务上。但是我收到一个错误。

Windows 服务无法访问该数据库。

 static void Main()
    {
        //try
        //{
            //=======Connection string=============
        string dbfile = @"D:\testdatabase.db";

        sql_con = new SQLiteConnection
            ("Data Source= " + dbfile + ";Version=3;New=False;Compress=True;");
            //=======Open Connection=============
            sql_con.Open();
            //=======Create dataset and store value in dataset===================
            sql_cmd = sql_con.CreateCommand();
            string CommandText = "select * from mailbackup";
            DB = new SQLiteDataAdapter(CommandText, sql_con);
            //DS.Reset();
            DB.Fill(DS);
            //=======Store dataset value in text file============
            StringBuilder str = new StringBuilder();
            int rows = DS.Tables[0].Rows.Count;
            for (int i = 0; i < rows;i++ )
            {
                str.AppendLine(DS.Tables[0].Rows[i].ItemArray[0].ToString());
                str.AppendLine(DS.Tables[0].Rows[i].ItemArray[1].ToString());
                str.AppendLine(DS.Tables[0].Rows[i].ItemArray[2].ToString());
                str.AppendLine(DS.Tables[0].Rows[i].ItemArray[3].ToString());
                str.AppendLine(DS.Tables[0].Rows[i].ItemArray[4].ToString());
                str.AppendLine(DS.Tables[0].Rows[i].ItemArray[5].ToString());
                str.AppendLine(DS.Tables[0].Rows[i].ItemArray[6].ToString());
                str.AppendLine(DS.Tables[0].Rows[i].ItemArray[7].ToString());
                str.AppendLine(DS.Tables[0].Rows[i].ItemArray[8].ToString());
                StreamWriter sw = null;
                sw = new StreamWriter(AppDomain.CurrentDomain.BaseDirectory + "\LogFile.txt", true);
                sw.WriteLine(DateTime.Now.ToString() + ": " + str.ToString());
                sw.Flush();
                sw.Close();
            }
                //=======Close Connection=============
                sql_con.Close();
            //storedata();
        //}
        //catch(System.Exception ex)
        //{

        //}
    }

我收到一个错误

An unhandled exception of type 'Finisar.SQLite.SQLiteException' occurred in SQLite.NET.dll

Additional information: unsupported file format

当我们更改连接字符串时它工作正常

 sql_con = new SQLiteConnection
        ("Data Source= " + dbfile + ";Version=3;New=True;Compress=True;");

创建新数据库并打开连接但是在使用 sqlite 浏览器或 SQLiteStudio 创建 table 之后,它开始抛出相同的错误。

在 windows 服务中 运行 安装哪种应用程序并不重要。问题来自 SQLite 组件。

An unhandled exception of type 'System.IO.FileLoadException' occurred in mscorlib.dll Additional information: Mixed mode assembly is built against version v2.0.50727 of the runtime and cannot be loaded in the 4.0 runtime without additional configuration information.

为了使用 CLR 2.0 混合模式程序集,您需要修改 App.Config 文件以包含:

<?xml version="1.0"?>
 <configuration>
  <startup useLegacyV2RuntimeActivationPolicy="true">
     <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.0"/>
  </startup>

关键是 useLegacyV2RuntimeActivationPolicy 标志。这会导致 CLR 使用最新版本 (4.0) 加载您的混合模式程序集。没有这个就不行。

请注意,这仅适用于混合模式 (C++/CLI) 程序集。您无需在 app.config.

中指定即可加载所有托管 CLR 2 程序集

无论如何,Considerations for server-side Automation of Office 文章指出如下:

Microsoft 目前不推荐也不支持从任何无人值守的非交互式客户端应用程序或组件(包括 ASP、ASP.NET 自动化 Microsoft Office 应用程序、DCOM 和 NT 服务),因为当 Office 在此环境中处于 运行 时,Office 可能会表现出不稳定的行为 and/or 死锁。

如果您要在服务器端上下文中构建 运行 的解决方案,您应该尝试使用已针对无人值守执行安全设置的组件。或者,您应该尝试找到至少允许 运行 客户端部分代码的替代方案。如果您从服务器端解决方案使用 Office 应用程序,该应用程序将缺少许多 运行 成功所必需的功能。此外,您将承担整体解决方案稳定性的风险。