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

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

Почему может выскакивать Syntax error or access violation? [D7, MSSQL]


Bless ©   (2003-11-21 15:33:00) 

Люди, может кто-то сталкивался в ошибкой
Syntax error or access violation?
Что сие означает? Меня интересует не перевод на русский,
а какие могут быть причины ее появления, а то у меня уже
догодки кончились

Выскакивает после сбедующих строк
(q - это TADOQuery)

SQl.Text:=" DECLARE @nzsme int SET @nzsme=:nzsme"+
" UPDATE fakt_mes_mat"+
" SET ob=:ob6, st=:st6 WHERE nzs=@nzsme AND nzm=""6"""+
" UPDATE fakt_mes_mat"+
" SET ob=:ob7, st=Null WHERE nzs=@nzsme AND nzm=""7""";
Parameters.ParamByName("nzsme").Value:=nzsme;
Parameters.ParamByName("ob6").Value:=ob6;
Parameters.ParamByName("st6").Value:=st6;
Parameters.ParamByName("ob7").Value:=ob7;
execSQL;

Причем, если вместо параметров явно подтавить числа в запрос,
ошибка пропадает.

Также ошибка исчезает, если в этом месте использовать другой TADOQuery
(q активно используется в предыдущих строках программы
для самых разных запросов. Может в этом дело?)


Bless   (2003-11-24 15:42:00) [1]

Все работает с изначальным текстом запроса,
если убрать перед предыдущим q.open
(я говорил, что q активно использовался до вышеприведенных строк)
строку q.prepared:=true;
А так как я толком не понимаю, какой в этой строке смысл, то буду признателен за любые объяснения по этому поводу.

То есть, я читал хелп и из него понял, что prepared:=true "подготавливает" запрос к выполнению и что вроде как "подготовленный" запрос выполняется быстрее. Но что значит "подготовить запрос", я не понимаю.


Bless   (2003-11-24 12:54:00) [2]

Проблема локализована. Следующий код работает:

SQl.Text:=" UPDATE fakt_mes_mat"+
" SET ob=:ob6, st=:st6 WHERE nzs=:nzsme AND nzm=""6"""+
" UPDATE fakt_mes_mat"+
" SET ob=:ob7, st=Null WHERE nzs=:nzsme1 AND nzm=""7""";
Parameters.ParamByName("nzsme").Value:=nzsme;
Parameters.ParamByName("nzsme1").Value:=nzsme;
Parameters.ParamByName("ob6").Value:=ob6;
Parameters.ParamByName("st6").Value:=st6;
Parameters.ParamByName("ob7").Value:=ob7;
execSQL;

То есть, что-то с локальной переменной связано. Но что?
Есть у кого-нибудь какие-то идеи?


Bless   (2003-11-24 11:41:00) [3]

И еще 2 вопроса:
если потом сделать
q1.recordset:=q.recordset;
q2.recordset:=q.nextRecordset;

то q1, q2 тоже становятся ltBatchOptimistic. Почему?

И что происходит, когда делаешь q1.recordset:=q.recordset?
Зависит ли q1 после этого как-то от q?
Могут ли какое-то манипуляции с q после такого присваивания
каким-либо образом повлиять на q1?


Bless   (2003-11-24 11:24:00) [4]

Кстати, вопросик.
Почему код

with q do begin
SQL.Text:=
" INSERT INTO t1(kod) VALUES (123)"+
" SELECT * from t1"+
" SELECT * FROM t2";
active:=true;
end;

сам переводит q из ltOptimistic в ltBatchOptimistic.
То есть, до его выполнения q.LockType было ltOptimistic, а после
выполнения - ltBatchOptimistic


Bless   (2003-11-24 09:38:00) [5]

>а зачем так писать, нельзя все это сделать в хранимой процедуре?

Можно, конечно. Но сейчас, когда я морально созрел для хранимых процедур, написана уже добрая половина проекта без них. То бишь, чтобы получить "тонкого" клиента, желательно все переписать, а не очень хочется. И даже если я воспользуюсь хранимой процедурой лишь в этом конкретном случае, с ошибкой все-равно надо разобраться.


Shirson   (2003-11-23 19:14:00) [6]

С ADO параметры задавать лучше так:

q.Parameters.ParamValues["nzsme"]:=nzsme;


sniknik   (2003-11-21 22:28:00) [7]

me (21.11.03 19:19) [7]
с чего бы это? если можеш поясни причины.

вроде бы все работает, и у Bless говорит тоже если другой квери подставить. т.е. виноват не метод а конкретный компонент/настройки/остатки предыдуших запросов/изменений.


me   (2003-11-21 19:19:00) [8]

Если хочется запускать на выполнение целый batch - про параметры нужно забыть


Sandman25   (2003-11-21 17:55:00) [9]

Там между командами Declare, Update и еще Update разве никаких разделителей не надо? Типа точки с запятой? Если вообще несколько команд в одном SQL.Text поддерживаются...


Anatoly Podgoretsky   (2003-11-21 17:53:00) [10]

И что можно сразу два UPDATE сделать в адо, в одном предложении?


Silver Alex   (2003-11-21 17:49:00) [11]

а зачем так писать, нельзя все это сделать в хранимой процедуре?


Bless   (2003-11-21 17:45:00) [12]

Попробовал указывать явно тип. Результат тот же.


Bless   (2003-11-21 17:38:00) [13]

>1. Сперва q.Close

Делал я так. Делал даже
q.connection:=nil;
Не помогает.

>2. Перед каждым определением параметра ParamByName надо
> Parameters.ParamByName("...").DataType:=...; // ftInteger,
>ftString etc

Гм... Попробую сейчас. Но вообще-то насколько я понимаю datatype выставляется сам, соответственно типу значения справа от ":=", если его тип можно определить. Я проверял на нескольких примерах. Да и в окне Watch на месте перед ошибкой dataType стоял ftInteger, как и должно.


Johnmen   (2003-11-21 17:00:00) [14]

1. Сперва q.Close
2. Перед каждым определением параметра ParamByName надо
Parameters.ParamByName("...").DataType:=...; // ftInteger, ftString etc
3. Другая причина.


Наверх

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