无法访问SQLite数据库窗体Windows服务

时间:2015-02-04 06:39:43

标签: c# sqlite windows-services

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

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

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)
        //{

        //}
    }

我收到错误

  

SQLite.NET.dll中出现未处理的“Finisar.SQLite.SQLiteException”类型异常

     

其他信息:不支持的文件格式

我们更改连接字符串

时工作正常
 sql_con = new SQLiteConnection
        ("Data Source= " + dbfile + ";Version=3;New=True;Compress=True;");

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

1 个答案:

答案 0 :(得分:0)

在Windows服务中运行的应用程序类型无关紧要。问题来自SQLite组件。

  

mscorlib.dll中出现未处理的“System.IO.FileLoadException”类型异常附加信息:混合模式程序集是针对运行时版本v2.0.50727构建的,如果没有其他配置信息,则无法在4.0运行时加载。< / p>

要使用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)程序集。您可以加载所有托管的CLR 2程序集,而无需在app.config中指定它。

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

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

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