![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Incorrect Syntax на одной машине, а на другой — все работает...
И. Павел © (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]тьфу ты..
у тебя просто две команды не разделились, а я было прочитал, что внутри одного запроса непонятка..