2013-07-07 4 views
0

Мне нужна помощь в решении этой ошибки.

Это ошибка {"The type initializer for 'System.Transactions.Diagnostics.DiagnosticTrace' threw an exception."}Инициализатор типа для «System.Transactions.Diagnostics.DiagnosticTrace» сделал исключение


Я использую базу данных Access и платформы для конфигурации сборки является любой CPU.

Иногда код работает хорошо, и иногда он неожиданно выбрасывает это исключение. Здесь есть много подобных вопросов, но ни одна из них не решает мою ошибку.

Это моя строка соединения

DbPath = @"d:\Ek.mdb"; 
ConnectionString [email protected]"Provider=Microsoft.Jet.OLEDB.4.0;Data Source="+DbPath+";User Id=admin;Password=;"; 

Это моя функция, чтобы открыть соединение
Я получаю ошибку на Con.Open()

public bool OpenConnection() 
     { 
      if (Con == null) 
      { 
       Con = new OleDbConnection(ConnectionString); 
      } 
      else if ((Con.State == ConnectionState.Broken || Con.State == ConnectionState.Closed) && (Con.State!=ConnectionState.Open)) 
      { 
       Con.Open(); 
       Tx = Con.BeginTransaction(IsolationLevel.ReadCommitted); 
       return true; 
      } 
      else if (IsConnectionBusy()) 
      { 
       throw new DataException("Connection Busy"); 
      } 
      return false; 
     } 

это, как я закрываю соединение после выполнения запросы

public Boolean CloseConnection() 
     { 
      if(IsConnectionBusy()) 
       throw new DataException("Connection Busy"); 
      if (Con.State==ConnectionState.Open) 
      { 
       Tx.Commit(); 
       Con.Close(); 
       return true; 
      } 
      return false; 
     } 
public bool IsConnectionBusy() 
    { 
     switch (Con.State) 
     { 
      case ConnectionState.Connecting: 
      case ConnectionState.Executing: 
      case ConnectionState.Fetching: 
       return true; 
     } 
     return false; 
    } 

Я не могу найти, почему он работает иногда отлично, а затем иногда выбрасывает это исключение.
Любая помощь будет принята с благодарностью. Я слишком много пытался решить эту ошибку, но не смог.

То, что я заметил, находится на этой линии.

else if ((Con.State == ConnectionState.Broken || Con.State == ConnectionState.Closed) && (Con.State!=ConnectionState.Open)) 


Соединение в closed state. Когда он выполняет оператор Con.Open(), состояние Connection изменяется на Open, после чего эта ошибка возникает.
Также при отладке ошибка не вызвана. Это происходит только тогда, когда я не ставил breakpoint в этом месте.
В Con.Open(), когда я поставил точку останова и остановился на несколько секунд только в первый раз, тогда нет ошибки. После этого, если я отключу точку останова, и ошибка не будет ... !!!

+0

какой офис MS/версия доступа вы используете? – Rezoan

+0

Я использую 2007, и я создал базу данных для совместимости с 2000-2003 гг. – coding

+0

Также я не получаю ошибку, если поставил точку останова. Это происходит только тогда, когда нет точки останова, и эта ошибка не всегда возникает. – coding

ответ

2

Изменил базу данных на sqlite и все работает очень плавно ...
Я думаю, что в Access db есть некоторые проблемы с транзакциями.
Он был устранен путем изменения базы данных. Тем не менее я не уверен, что вызывало эту странную ошибку.

1

Не могли бы вы, пожалуйста, используйте ниже два метода, чтобы открыть и закрыть соединение с базой данных Access и попытаться построить программу в режиме x86 и посмотреть, если возникает проблема:

OleDbConnection _oleCon; 
     public Form1() 
     { 
      InitializeComponent(); 
      _oleCon = new OleDbConnection(); 
     } 

     bool OpenConnection() 
     { 
      try 
      { 
       string DbPath = @"D:\Ek.mdb"; 
       _oleCon.ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;Persist Security Info=False;Data Source=" + DbPath + ";";//ConfigurationSettings.AppSettings["dbConnectionString"]; 
       _oleCon.Open(); 
       return true; 
      } 
      catch 
      { 
       return false; 
      } 
     } 

     bool CloseConnection() 
     { 
      try 
      { 
       _oleCon.Close(); 
       return true; 
      } 
      catch 
      { 
       return false; 
      } 
     } 
+0

Во всех моих предыдущих проектах, в которых я использовал Access Db, я не нашел таких проблем. Это был первый раз, когда я видел такое поведение. Код работает отлично, если я сохраняю точку останова, иначе она получит ошибку. – coding

+0

Я не могу попробовать этот код сейчас, потому что я изменил все переменные oledb на переменные sqlite. Btw Спасибо за код. Я очень благодарен за вашу помощь .. :-) – coding

0

Существовал что-то не так с моей App. Файл конфигурации.

Я удалил его и добавил новый из нового проекта, и он исправил его для меня.

0

удалите пустое место из app.config ..... его работа отлично подходит для меня ...

1

Я рекомендую проверить это свойство InnerException этого исключения.

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

Контекст: простое консольное приложение необходимости подключения к MySql через стандартный разъем .NET (MySql.Data)

Контекст: connectionStrings в моем app.config указывал на внешний файл с помощью атрибута configSource. Теперь в .NET вы можете указать внешний файл конфигурации только в том случае, если этот файл находится в том же каталоге или ниже в иерархии, но не выше. Дело в том, что мой внешний файл, конечно, был в каталоге выше в иерархии, поэтому я выбрал альтернативный способ прочитать строку подключения, в которой меня интересовали, и после того, как я возобновил работу над этим приложением через несколько дней, я не сделал помните, что мой app.config был сломан.

В этом была проблема, очевидно, что соединитель (или какой-либо другой аппарат ADO) анализирует app.config, даже если вы не получаете доступ к нему программно, следовательно, эта ошибка. Я смог понять это, потому что я посмотрел на InnerException, поэтому я предложил проверить его.

+0

Благодаря вашему ответу я обнаружил, что моя проблема также в файле конфигурации (играла днем ​​раньше с log4net и как ее настроить, не работала на 100% и перешел к другой задаче и не смог просто подключиться к mysql db в консольном приложении). – Veverke

0

Я обновил свои пакеты NuGet, которые, похоже, решили проблему для подключения к локальной базе данных SQLite.

Смежные вопросы