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;


Anatoly Podgoretsky   (2011-12-15 14:45:00) [41]

> stas  (15.12.2011 14:44:15)  [15]

> LMD  это что?

Это не хорошо


stas   (2011-12-15 14:44:00) [42]

LMD  это что?


Медвежонок Пятачок   (2011-12-15 14:43:00) [43]

Подключаюсь через OLEDB.

бат уай?!

найтив клиент же нативнее.


Ega23   (2011-12-15 14:34:00) [44]


> Зачем? если кто-то сомневается - его проблемы.


LMD


Palladin   (2011-12-15 14:24:00) [45]


> stas ©   (15.12.11 14:10) [10]

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


Anatoly Podgoretsky   (2011-12-15 14:22:00) [46]

Что так и будешь гадать или все таки посмотришь профайлером.


stas   (2011-12-15 14:10:00) [47]

>Ega23 ©   (15.12.11 13:35) [5]
Зачем? если кто-то сомневается - его проблемы.


sniknik   (2011-12-15 14:02:00) [48]

> В итоге, получается, нужно все запросы начинать с точки с запятой?
начинать? нет. заканчивать.


И. Павел   (2011-12-15 13:51:00) [49]

В итоге, получается, нужно все запросы начинать с точки с запятой?
Или только запросы ADOCommand, а запросы ADODataSet просто так отправлять?
Это же получается недоработка ADO или OLEDB? Или так и предполагалось, что нужно всегда ставить точку с запятой? Или предполагалось, что парсер всегда разберет начало новой команды, но не расчитывали на предложение «With»?


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

> [1] OW ©   (15.12.11 11:52)

Тоже спасибо за интерес к проблеме. Ответы на вопросы в [6].


И. Павел   (2011-12-15 13:46:00) [51]

> знайка, Anatoly Podgoretsky ©

Большое спасибо. Дело действительно было в этом. Что-то внутреннее, видимо, посылается вместе с запросом самим драйвером. «;» помогла.


> [4] stas ©   (15.12.11 13:25)

Спасибо за интерес к проблеме.

Пользователь и сервер — одинаковые. Явных модификаторов сессии нет. Подключаюсь через OLEDB. Connection в том же потоке. MS SQL SERVER стоит на отдельном сервере. А мои клиенты — на клиенте и на другом сервере, т.е. MS SQL SERVER общий для всех.


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


> 4. Connection лучше создать в том же потоке из которого
> вы к нему обращаетесь как и command


Докажи.


stas   (2011-12-15 13:25:00) [53]

1.какой релиз MSSQL? на серверную винду и на обычную одинаковый релиз может не стать.
2. какая строка подключения? используйте Native client.
3. протокол tcp, namepipes?
4. Connection лучше создать в том же потоке из которого вы к нему обращаетесь как и command
5. покажите тот большой запрос


Anatoly Podgoretsky   (2011-12-15 12:08:00) [54]

> И. Павел  (15.12.2011 10:51:00)  [0]

С MS SQL идет профилировщик, посмотри какие запросы поступают с каждой
машины.


OW   (2011-12-15 11:52:00) [55]

сам запрос, текст?
пользователь, сервер -  тот же?
в пределах сессии нет явных модификаторов этой сессии? (SET ЧТО-ТО ON|OFF)


знайка   (2011-12-15 11:52:00) [56]

Перед with поставте ;.


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

Наверх

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