Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Incorrect Syntax на одной машине, а на другой — все работает...


Страницы:   1 2 3

И. Павел ©   (2011-12-15 10:51:00) 

Здравствуйте.

У меня есть сервис (код обработчика onExecute в конце этого сообщения).
На моем компьютере (Windows 7, 32 бита) сервис работает нормально. Но после запуска его на сервере (Windows 2003 server) выводится ошибка.
Запрос SELECT выполняется на обоих компьютерах. Но большой запрос with ... delete ... inner join ... inner join ... возвращеет ошибку: incorrect syntax near the keyword with (повторюсь — на моем компьютере все работает).
Сервер БД: MS SQL SERVER 2005.

Если бы ошибка была connection failure и т.п., то все было бы ясно.
Но ведь сначала мой сервис на компьютере-сервере запускается, коннектится к базе, делает SELECT, использует полученную информацию и уже потом, выполняя with ... delete ... выводит ошибку парсирования.

Подскажите, пожалуйста, из-за чего может произойти incorrect syntax, если на другой машине все было нормально. На всякий случай переустановил MDAC SDK (подозревал, что может-быть MDAC пытаестя делать опережающее парсирование, чтобы не отсылать данные серверу, сразу вылавливать синтаксические ошибки в запросах и что MDAC не понял, что такое «with», т.к. этой конструкции нет в 2000 сервере).

Может у кого-нибудь есть просто какие-нибудь предположения, из за чего может быть такая разница в поведении сервиса на двух компьютерах?

Если нужна более подробная информация — пишите что нужно сообщить — сообщу.

Заранее спасибо.

1. Вот код OnExecute (урезанный, т.к. дальше ShowPosDoc1 дело не доходит):

procedure TSEDDeloMonitoringYITService2.ServiceExecute(Sender: TService);
var SleepInterval: integer;
   d: TDateTime;
begin
 try
   PrepareReg; //регистрирую путь этой службы, чтобы из ее ресурсов доставался шаблон для строки в службе сообщений windows

   CoInitialize(nil);  
   DMQ.Connect('');

   ADODS.Active := false;
   ADODS.CommandText := 'SELECT interval, MailInterval FROM USERLIST.dbo.MonConfig;'; //прекрасно срабатывает
   DMQ.Open;

   MailThread := TMailThread.Create(false);

   while (not Terminated) do
   begin

     if MailThread.Finished then
       break;

     d := now;

     ShowPosDoc1;
     ServiceThread.ProcessRequests(false);
     if Terminated then break;

     //тут еще ряд таких же блоков, как и выше  (вызов функции, ProcessRequest, проверка остановки)

     //потом идет цикл с ожиданием, но до него выполнение не доходит  
   end;

   MailThread.Terminate;
   MailThread.WaitFor;

   CoUninitialize;
 except
   on e: Exception do
   begin
     ExceptHandler(e);
   end;
 end;
end;


Ega23   (2011-12-15 16:07:00) [21]


> Будет валится с разными ошибками. Может быть повезет пару раз...


Научи дурака Б-гу молиться - он и лоб себе разобьёт.


DiamondShark   (2011-12-15 16:05:00) [22]


> Ega23 ©   (15.12.11 13:35) [5]
> > 4. Connection лучше создать в том же потоке из которого
> > вы к нему обращаетесь как и command
> Докажи.

COM-Объекты ADO работают в STA модели.

1. Будет маршалинг
2. Будет сериализация вызовов
3. Будет новая ветка на ДМ: "Почему у меня всё работает в обычном приложении, но всё зависает в сервисе?".


Ega23   (2011-12-15 16:05:00) [23]


> Да и почитайте эту ветку, с этого же сайта


Там смысл несколько размазан. Речь о том, что каждый тред в момент исполнения запроса должен иметь некий коннект в монопольном доступе.


Anatoly Podgoretsky   (2011-12-15 16:03:00) [24]

> stas  (15.12.2011 15:59:31)  [31]

С чего бы, у меня 15 потоков напряженно трудятся и ничего не валится. Есть
другие ошибки, но не эти


stas   (2011-12-15 16:01:00) [25]

Например:

---------------------------
Debugger Exception Notification
---------------------------
Project Project1.exe raised exception class EOleException with message 'Операция не допускается, если объект открыт'. Process stopped. Use Step or Run to continue.
---------------------------
OK   Help  
---------------------------


stas   (2011-12-15 15:59:00) [26]

Ega23 ©   (15.12.11 15:30) [21]

> теперь создаем 5 экземпляров того же потока, запускаем..

И?

Будет валится с разными ошибками. Может быть повезет пару раз...


Anatoly Podgoretsky   (2011-12-15 15:55:00) [27]


> И. Павел ©   (15.12.11 15:50) [25]

Дураки неистрибимы, это про твоих администраторов. Убить основной инструмент отладки.


Anatoly Podgoretsky   (2011-12-15 15:55:00) [28]

> OW  (15.12.2011 15:44:24)  [24]

Откатится транзакция


И. Павел   (2011-12-15 15:53:00) [29]

> Нельзя. Почему что в последнее использование поток профайлера
> администраторам удалось сбить только перезагрузив всю систему.
> Так что мне сказали — если можно то лучше им не пользоваться...

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


stas   (2011-12-15 15:52:00) [30]

Ega23 ©   (15.12.11 15:32) [22]

> Не правильно.

С какого перепуга?

Ну хотя бы с того что если следовать вашей логике то их будет 6000 )

Да и почитайте эту ветку, с этого же сайта
http://delphimaster.net/view/3-1162214995


Ega23   (2011-12-15 15:50:00) [31]


> Усложним задачу,


Да зачем? Не, ну если товарищ не знает ничего про объекты синхронизации и обращается к одним данным, а также изменяет их, из разных тредов и не боится косяков, то...


И. Павел   (2011-12-15 15:50:00) [32]

> начинать? нет. заканчивать.

Но у меня в коде до «with...delete...» нет ни одного оператора вставки. Единственное, что я выполняю в явном виде — SELECT. Но он заканчивается на «;». Получается, это все-таки недоработка среды, которую приходится компенсировать? В запросах ADODataSet такое не встречается? Т.е. там «;» в начале поставить можно, но как-то боязно: не понятно, что будет возвращаться в DataSet.


> [11] Anatoly Podgoretsky ©   (15.12.11 14:22)
> Что так и будешь гадать или все таки посмотришь профайлером.

Нельзя. Почему что в последнее использование поток профайлера администраторам удалось сбить только перезагрузив всю систему. Так что мне сказали — если можно то лучше им не пользоваться...


OW   (2011-12-15 15:44:00) [33]


> Берем кладем на форму AdoConnection, AdoCommand.
> Создаем Thread в котором выполняем вставку в БД в цикле
> до 10000 используя тот же AdoCommand.
> По кнопке запускаем поток - все замечательно
> теперь создаем 5 экземпляров того же потока, запускаем..

Усложним задачу,
Первый поток вставляет 1 в поле INT_VAL, второй - 2, и т.п.
N-ый поток обнаружил ошибку и хочет откатить.

Что откатится?


Dennis I. Komarov   (2011-12-15 15:43:00) [34]

Сперва создадим проблемы, потом героически их будем решать...


Ega23   (2011-12-15 15:32:00) [35]


> Не правильно.


С какого перепуга?


Ega23   (2011-12-15 15:30:00) [36]


> теперь создаем 5 экземпляров того же потока, запускаем..


И?


stas   (2011-12-15 15:29:00) [37]

Anatoly Podgoretsky ©   (15.12.11 15:20) [19]
Не правильно.


Anatoly Podgoretsky   (2011-12-15 15:20:00) [38]

> stas  (15.12.2011 14:55:18)  [18]

О боже, в базе стало 50000


stas   (2011-12-15 14:55:00) [39]

Palladin ©   (15.12.11 14:24) [12]

Может быть так или не так, а как это далеко не так? )

Берем кладем на форму AdoConnection, AdoCommand.
Создаем Thread в котором выполняем вставку в БД в цикле до 10000 используя тот же AdoCommand.
По кнопке запускаем поток - все замечательно
теперь создаем 5 экземпляров того же потока, запускаем...


OW   (2011-12-15 14:51:00) [40]

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


Страницы:   1 2 3

Наверх

Титульная страница Поиск, карта сайта Написать письмо