Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Базы";
Текущий архив: 2003.12.16;
Скачать: [xml.tar.bz2];

Вниз

Почему может выскакивать Syntax error or access violation?   Найти похожие ветки 

 
Bless   (2003-11-21 15:33) [0]

Люди, может кто-то сталкивался в ошибкой
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 активно используется в предыдущих строках программы
для самых разных запросов. Может в этом дело?)


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

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


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

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

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

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

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


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

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


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

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


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

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


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

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


 
me   (2003-11-21 19:19) [7]

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


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

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

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


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

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

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


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

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

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


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

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

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 11:41) [12]

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

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

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


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

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

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 15:42) [14]

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

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



Страницы: 1 вся ветка

Форум: "Базы";
Текущий архив: 2003.12.16;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.48 MB
Время: 0.008 c
1-52138
oens
2003-12-03 15:34
2003.12.16
Поиск в HTML


1-52250
Alex(orel)
2003-12-04 15:13
2003.12.16
работа с ОС


1-52203
Piero
2003-12-04 23:35
2003.12.16
Как получить путь к exe-нику, из него. Спасибо.


4-52431
Igit
2003-10-23 17:13
2003.12.16
ReadFile


3-52080
SlavaSH
2003-11-24 19:02
2003.12.16
Double





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский