Нет связи с базой данных из службы Windows - PullRequest
2 голосов
/ 19 июня 2009

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

Вы можете увидеть мой код ниже. Это вызывается из функции, которая выполняется в событии 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.

Ответы [ 2 ]

1 голос
/ 21 июня 2009

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

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

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

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

0 голосов
/ 20 июня 2009

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

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

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

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

...