我为Outlook 2010开发了一个加载项。 在 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中发生了类型为"Finisar.SQLite.SQLiteException"的未处理异常.dll
其他信息:不支持的文件格式
当我们更改连接字符串时,它工作正常
sql_con = new SQLiteConnection
("Data Source= " + dbfile + ";Version=3;New=True;Compress=True;");
创建新数据库并打开连接,但在使用 sqlite 浏览器或 SQLiteStudio 创建表后,它开始抛出相同的错误。
在 Windows 服务中运行哪种类型的应用程序并不重要。问题来自SQLite组件。
mscorlib 中发生了类型为"System.IO.FileLoadException"的未处理异常.dll 其他信息:混合模式程序集是针对运行时版本 v2.0.50727 构建的,如果没有其他配置信息,则无法在 4.0 运行时中加载。
为了使用 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 中指定此项。
无论如何,Office 服务器端自动化的注意事项一文指出了以下内容:
Microsoft 目前不建议也不支持从任何无人参与、非交互式客户端应用程序或组件(包括 ASP、ASP.NET、DCOM 和 NT 服务)自动化Microsoft Office 应用程序,因为在此环境中运行 Office 时 Office 可能会表现出不稳定的行为和/或死锁。
如果要生成在服务器端上下文中运行的解决方案,则应尝试使用已安全执行无人参与的组件。或者,您应该尝试找到至少允许部分代码在客户端运行的替代方法。如果使用服务器端解决方案中的 Office 应用程序,则该应用程序将缺少成功运行所需的许多功能。此外,您将承担整体解决方案稳定性的风险。