Служба Windows зависает при открытии OLEDB-соединения с Excel-файлом

У меня есть служба Windows, которая зависает при открытии OLEDB-соединения с файлом Excel, например:

using (var connection = new OleDbConnection(
    "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" 
    + fileName + ";Extended Properties=\"Excel 8.0\""))
{
  connection.Open();
  // start using the connection
}

Этот код отлично работает при запуске в качестве консольного приложения. Когда я отлаживаю службу Windows с помощью Visual Studio, я могу входить в код до тех пор, пока не нажму вызов connection.Open(). В этот момент нить зависает. Никаких исключений не выбрасывается. Visual Studio остается отзывчивой, пока я не нажму кнопку «Сломать все» или «Остановить отладку». В этот момент Visual Studio также зависает. Когда я убиваю процесс, Visual Studio снова становится отзывчивой.

Кто-нибудь знает, почему это происходит и как это решить?

РЕДАКТИРОВАТЬ: имя_файла — абсолютный путь; файл был написан самой службой.


person Tommy Carlier    schedule 08.01.2010    source источник
comment
имя файла абсолютное или относительное? Потому что службы технически не имеют работающего каталога. Хотя на практике они обычно запускаются из C:\Windows\system32\.   -  person FallenAvatar    schedule 08.01.2010
comment
Имя файла является абсолютным, и служба может получить доступ к файлу. На самом деле файл пишет сам сервис.   -  person Tommy Carlier    schedule 08.01.2010
comment
Файл находится в формате Excel 2007 (.xlsx или .xlsm) или в более раннем формате .xls? Я считаю, что для формата Excel 2007 потребуется другая строка подключения.   -  person barrowc    schedule 09.01.2010
comment
Файл находится в XLS-формате. Код работает нормально, если я запускаю его как консольное приложение. Только когда он работает как служба Windows, он зависает. P.S.: Служба Windows использует учетные данные обычной учетной записи.   -  person Tommy Carlier    schedule 09.01.2010


Ответы (2)


После безуспешной попытки сделать это внутри службы Windows я извлек бизнес-логику в отдельное консольное приложение и просто вызвал это приложение из службы Windows. Кажется, работает нормально.

person Tommy Carlier    schedule 11.01.2010
comment
Возможно, вы захотите рассмотреть возможность переноса его в dll вместо консольного приложения. Служба Windows, вызывающая консольное приложение, имеет забавный запах... - person Walter; 11.01.2010
comment
Если я скомпилирую его в DLL, а затем свяжу с этой DLL из службы, код снова запустится внутри процесса службы и зависнет. Причина, по которой я извлек его в отдельное консольное приложение, заключается в том, что он будет работать в отдельном процессе. - person Tommy Carlier; 11.01.2010

Я не знаю, почему это происходит, но пытались ли вы сузить круг, пытаясь открыть файл и просто загрузить его в массив байтов, чтобы определить, связана ли проблема с файловой системой/разрешениями/и т. д.... а не ОЛЕ БД? Если вы можете открыть и загрузить файл в массив байтов, но OLE DB все еще зависает, привязан ли ЦП, что указывает на то, что в файле может быть что-то, что OLE DB не может обработать?

Если вы не можете заставить это работать с OLE DB, рассматривали ли вы стороннюю библиотеку xls/xlsx, например SpreadsheetGear для .NET< /а>? Вы можете увидеть живые образцы здесь и загрузить бесплатную пробную версию здесь.

Отказ от ответственности: я владею SpreadsheetGear LLC

person Joe Erickson    schedule 08.01.2010
comment
Файл был написан самой службой. Загрузка содержимого в массив байтов не проблема. Когда поток зависает, процессор простаивает, поэтому это похоже на блокировку. В файле нет ничего плохого, потому что код работает, если я запускаю его как консольное приложение. - person Tommy Carlier; 08.01.2010