2009-06-18 2 views
2

Я пытаюсь написать службу в CBuilder 6 (целевая XP Pro). Часть работы этой службы - отслеживать и обновлять таблицу в базе данных. Мы используем прямой ODBC для подключения к базе данных, но проблема также происходит с ADO, поэтому мы будем использовать это для упрощения.Нет подключения к базе данных изнутри службы Windows

Вы можете увидеть мой код ниже. Это вызывается из функции, которая выполняется в событии ServiceStart.

Моя проблема в том, что я не могу установить соединение. В нашей базе данных MSSQL используется проверка подлинности домена, поэтому я попытался запустить службу, используя мою учетную запись домена. Я также попытался явно указать имя пользователя и пароль для домена, но это тоже не работает (в свойствах для службы, вход в систему).

Может ли кто-нибудь помочь мне в этом? Ничего вообще не оценено.

Другой вопрос, который у меня есть, - как отладить сервис? У меня установлен удаленный отладчик. Я создаю процесс, используя что-то вроде rundll32.exe или что-то в этом роде? Опять же, любая помощь ценит.

Много благодарностей заблаговременно

Stu.

Код сниппета:

TADOConnection* DB = new TADOConnection(this); 
    try 
    { 
    DB->ConnectionString = "Provider=MSDASQL.1;Password=password;Persist Security Info=True;User ID=usernamej;Data Source=datasource"; 
    DB->Connected = true; 

    returnValue = DB->Connected; 
    ShowMessage("Connected"); 
    } 
    catch (Exception &exception) 
    { 
    ShowMessage("Not COnnected"); 
    } 

Примечание: Свойство ConnectionString является ориентировочным и имеет имя пользователя, пароль и базу данных изменились. Использование этой строки в автономном приложении приводит к последовательно успешному соединению, и данные могут быть извлечены с помощью запроса.


В ответ на JP:

Привет JP.

Спасибо за ваш комментарий. На самом деле я не получаю исключение (это странно). Я изменил код (см. Ниже), чтобы включить еще несколько msgbox, и единственный, который я вижу, является первым - попыткой подключения.

ShowMessage("Attempting Login"); 
TADOConnection* DB = new TADOConnection(NULL); 
try { 
    ShowMessage("1"); 
    DB->ConnectionString = "<as before>"; 
    ShowMessage("2"); 
    DB->Connected = true; 
    ShowMessage("Connected"); 
} catch (Exception &exception) { 
    ShowMessage(exception.Message); 
    ShowMessage("Not COnnected"); 

} 

Любые идеи? Я не могу понять, почему компонент соединения даже не создается (обратите внимание, что я попытался изменить владельца с этого на NULL, а просто посмотреть, что произойдет).

Спасибо!

Stu.

+0

Можете ли вы, чтобы ваш блок исключений регистрировал детали исключения? Или, может быть, у вас есть эта информация. уже и может опубликовать его? Это поможет устранить неполадки. –

+0

Hi JP. Спасибо за ваш комментарий. На самом деле я не получаю исключение (это странно). Я изменил код (см. Ниже), чтобы включить еще несколько msgbox, и единственный, который я вижу, является первым - попыткой подключения. ShowMessage («Попытка входа»); TADOConnection * DB = новое TADOConnection (NULL); try { ShowMessage ("1"); DB-> ConnectionString = ""; ShowMessage ("2"); DB-> Connected = true; ShowMessage ("Connected"); } \t catch (Исключение и исключение) \t { ShowMessage (exception.Message); ShowMessage («Не подключен»); \t} Любые идеи? Спасибо! Stu. – 2009-06-19 00:22:09

+0

(Я буду вставлять это снова в свой исходный вопрос, поскольку reponses dont format very well: /) – 2009-06-19 00:22:48

ответ

0

У вас возникли проблемы с разрешениями службы Windows.

  • По существу, службы живут в условиях пониженных разрешений.

  • Предлагаю вам войти в журнал событий.

  • Сгенерированные окна будут отображаться только в том случае, если вы запустили его как локальную службу с включенным интерактивным рабочим столом.

+0

Спасибо за предложения. Я изучал, как использовать журнал событий, но до сих пор им не удавалось на самом деле писать. Теперь я просто экспериментирую с этим. Наличие базы данных локально решило эту проблему для меня. БД всегда была в сервисе в любом случае (в то время я не знал об этом). – 2009-06-22 11:00:03

1

При использовании аутентификации в домене, вы не должны иметь имя пользователя и пароль в строке подключения:

Server=myServerName\theInstanceName;Database=myDataBase;Trusted_Connection=True; 

или соответствующий вариант из http://www.connectionstrings.com/sql-server-2005

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

+0

Привет. Спасибо за комментарии. Это использование проверки подлинности домена, но я экспериментировал со строкой подключения, чтобы узнать, нужно ли мне сейчас указывать пользователя на уровне обслуживания. Ура! – 2009-06-22 11:01:06

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