Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2003.04.21;
Скачать: CL | DM;

Вниз

Забавная ошибка   Найти похожие ветки 

 
Денис   (2003-04-03 11:54) [0]

Parameter object is improperly defined. Inconsistent or incomplete information was provided.

Вот именно так ругается на следующий код:

n := "(31H2NEU) E54 Black 15", 0.28, TCO-95, 800x600 85Hz, Warranty: 3 years";
TADOCommand1.CommandText := "update nom set " + "name = """ + DoubleQuotes(n) + """ where id = 34130";
TADOCommand1.Execute;

Функция DoubleQuotes возвращает строку, в которой каждое вхождение кавычки (") удвоено. Самое интересное! Если в значении переменной n убрать двоеточие после слова Warranty - все работает!!! Кто-нибудь может прояснить ситуацию? Спасибо.


 
Mike Kouzmine ©   (2003-04-03 11:56) [1]

: - параметр


 
Денис   (2003-04-03 11:58) [2]

Посмотрел - думаю, нужно уточнить. После "Black 15" идут кавычки, а не два апострофа, как может показаться, а DoubleQuotes удваивает апострофы, а не кавычки, как я написал. Извините за путаницу.


 
Mike Kouzmine ©   (2003-04-03 11:59) [3]

Это ничего не меняет : - параметр


 
Денис   (2003-04-03 12:01) [4]

Mike Kouzmine.

Но если сделать, например,
n := "АТС Siemens euroset line 308 <DSS:GUS-308R> (3x8)";
то все ок...


 
Stas ©   (2003-04-03 12:03) [5]

Утверждать не буду, но видимо прога принимает двоеточие как объявление параметра.


 
Johnmen ©   (2003-04-03 12:06) [6]

Надо просто более четко разобраться с кавычками...:)

>Но если сделать, например,
>n := "АТС Siemens euroset line 308 <DSS:GUS-308R> (3x8)";
>то все ок...

Здесь то их нет...


 
Денис   (2003-04-03 12:12) [7]

Хм... если
n := "АТС Siemens" euroset line 308 <DSS:GUS-308R> (3x8)";
т.е. после Siemens кавычки - ругается, кавычки убрать - все ок. Что за бред?


 
Денис   (2003-04-03 12:18) [8]

А если
n := "АТС Siemens"" euroset line 308 <DSS:GUS-308R> (3x8)";
т.е. удвоенные кавычки - тогда не ругается, но и в базе появляются удвоенные кавычки, а это неправильно.

Еще один эксперимент:
n := "АТС Siemens: euroset line 308 <DSS"GUS-308R> (3x8)";
т.е. кавычки и двоеточие поменял местами - все ок!

И лишь удвоение двоеточия
n := "АТС Siemens" euroset line 308 <DSS::GUS-308R> (3x8)";
не проругалось и дало нормальный результат - в базе есть и кавычки, и двоеточие (одно).

Скажите, кто-нибудь сталкивался с таким, удваивал двоеточия? Что за бред вообще? :-)


 
Johnmen ©   (2003-04-03 12:25) [9]

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


 
Денис   (2003-04-03 12:30) [10]

Johnmen-у.
А мне кажется, что в процедуре синтаксического разбора ошибка. Я задаю sql-команду, в которой нужно обновить строковое поле таблицы. Я задаю значение этого поля, строка идет в апострофах, внутренние апострофы удвоены. Кавычки считаются обычными символами. НО! Если после кавычек в строке встречается двоеточие, то оно интерпретируется как предваряющее имя параметра. Но это же просто строка! Поэтому я и считаю, что в разборе ошибка.


 
sniknik ©   (2003-04-03 12:38) [11]

отключи проверку параметра (ParamCheck) и проверь свой запрос как есть, наверняка чтото другое вылезет если напутал с кавычками.
(прежде чем говорить что "в процедуре синтаксического разбора ошибка")


 
Денис   (2003-04-03 12:45) [12]

sniknik.
Конечно я погорячился, говоря про ошибку, хотя нигде еще не встречал необходимость удвоения двоеточия, поэтому странным все это показалось. ParamCheck убрал и все стало хорошо. Однако опытным путем установлено, что если ParamCheck = true, то между нечетным и четным вхождением кавычек двоеточия нужно удваивать, и тогда все ок независимо от значения ParamCheck.

Всем спасибо за обсуждение и помощь.


 
sniknik ©   (2003-04-03 13:16) [13]

> то между нечетным и четным вхождением кавычек двоеточия нужно удваивать

может путаница оттого, что именно так кавычка в строке и задается (удвоение, один из способов)
ShowMessage("D""Artanian");
а когда задаеш запрос то внутри него строка задается тоже в кавычках, и зависит от этого а не четным/нечетным.
(когда правильно задаеш ограничения строки, то неважно какое значение ParamCheck)
TADOCommand1.CommandText :=
"update nom set name = ""<неважно что здесь будет : это : строка : в : самом : запросе>""";
(вот это пройдет уверен хотя и не пробовал)



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

Текущий архив: 2003.04.21;
Скачать: CL | DM;

Наверх




Память: 0.5 MB
Время: 0.016 c
14-67491
Punk_poet2
2003-04-03 12:25
2003.04.21
Передача данных


8-67403
bkv
2003-01-20 15:08
2003.04.21
Линейный вход звуковой карты.


7-67575
aWoron
2003-01-23 11:17
2003.04.21
Infra Red


1-67234
Вася
2003-04-10 10:29
2003.04.21
Консольное приложение и timer


3-67093
Andrio
2003-04-02 14:25
2003.04.21
Экспорт таблицы из InterBase в Paradox