2015-02-04 4 views
2

Я разработал ADD-in для Outlook 2010. При запуске Outlook ADD-in сохранил все почтовые объекты в базе данных SQLite.Невозможно получить доступ к службам форм базы данных 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) 
     //{ 

     //} 
    } 

Я получаю сообщение об ошибке

Необработанное исключение типа 'Finisar.SQLite.SQLiteException' произошло в SQLite.NET.dll

Дополнительная информация: неподдерживаемый формат файла

работает нормально, когда мы меняем соединительную строку

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

Создайте новую базу данных и откройте соединение, но после создания таблицы с использованием SQL-браузера или SQLiteStudio, она начнет бросать ту же ошибку.

+0

Пожалуйста, прочтите следующую статью из SO: http://stackoverflow.com/a/1865662/2630261 – BendEg

+0

@BendEg после установки SourceForge и делать необходимые изменения теперь я получаю эту ошибку ** Необработанное исключение типа «System.IO.FileLoadException» произошел в mscorlib.dll ** ** Дополнительная информация: сборка смешанного режима построена по сравнению с версией v2.0.50727 среды исполнения и не может быть загружена в версии 4.0 без дополнительной информации о конфигурации. ** –

+0

Хорошо, не используете ли вы новейшие сборки из http://system.data.sqlite.org/index.html/doc/trunk/www/downloads.wiki? – BendEg

ответ

0

Не имеет значения, какое приложение вы используете в службе Windows. Проблема исходит от компонента SQLite.

Необработанное исключение типа «System.IO.FileLoadException» произошло в mscorlib.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.

Во всяком случае, Considerations for server-side Automation of Office статья гласит следующее:

Microsoft в настоящее время не рекомендуется, и не поддерживает, автоматизации приложений Microsoft Office из любого без присмотра, не интерактивного клиентского приложения или компоненты (включая ASP, ASP .NET, DCOM и NT Services), поскольку при работе Office в этой среде Office может проявлять нестабильное поведение и/или тупик.

Если вы создаете решение, которое выполняется в контексте на стороне сервера, вы должны попытаться использовать компоненты, которые были безопасны для автоматического выполнения. Или вы должны попытаться найти альтернативы, которые позволяют хотя бы часть кода запускать клиентскую сторону. Если вы используете приложение Office из серверного решения, для успешного выполнения приложения не будет достаточного количества необходимых возможностей.Кроме того, вы рискуете стабильностью своего общего решения.

+0

Спасибо @Eugene Astafiev. Еще одна вещь. Проблема блокировки при одновременном использовании базы данных процесса (чтение служб Windows и запись ADD в базе данных. есть любое решение, чтобы избежать проблемы с блокировкой ??????? –