Bde Баг или не Баг

  • Автор темы HardFlash
  • Дата начала
Статус
Закрыто для дальнейших ответов.
H

HardFlash

Доброго всем времени суток.

Давольно давно рабутаю с БД, но на такую засаду попал первый раз :) ...

Вопрос такой, при попытке через BDE добаить запись:

INSERT INTO Proba (Text) VALUES ('"ABC:')

Вылезает на ровном месте ошибка, точнее BDE исключение, именно при сочитании в заданной последовательности символов ' " ' и ' : '. Причем не имеет значения, что до, что между и что после...
Попытки экранирования символов не к чему не привели.
На машине стоит Delphi 7 + комплектный BDE.
Пробывал на нескольких машинах идентичной установки, результат такойже.

Как это можно обойти или это конкретный баг BDE моей версии?
 
B

Barmutik

Проверка на связке MS SQL Server 2000 + BDE + Delphi 7 ошибки не выявила
...
Код:
 Query1.SQL.Text := 'INSERT INTO Proba (CCName) VALUES (:CCName)';
Query1.ParamByName('CC_Name').AsString := '"ABC:';
Query1.ExecSQL;
 
G

Guest

попробуй так, мот дело в кавычке

INSERT INTO Proba (Text) VALUES ('''"''ABC:')
 
H

HardFlash

To Barmutik:
Дык все дело то в том, что на MS SQL 2000 и 2005 все уходит без проблем, а с локальной таблицей вот такая хрень.

To Руслан П:
Неа, не прошло.

Если перед ' : ' стоип нечетное число ' " ', вываливается.
Для INSERT INTO Proba (Text) VALUES ('''"''ABC:') не поленился, переписал все:

Project Proba.exe raised exception class EDBEngineError with message 'Unexpected end of command.
Tokken: """?
Line Number: 1'. Process stoped. Use Step or Run to continue.

Бл*, што за комманда :) ?

Я ради интереса вчера облазил делфевый хелп, в общем нашел там несколько разделов с какойто там на мой взгляд несуразностью:
Update SQL statements use a special form of parameter substitution that enables you to substitute old or new field values in record updates. When the Update SQL editor generates its statements, it determines which field values to use. When you write the update SQL, you specify the field values to use.

When the parameter name matches a column name in the table, the new value in the field in the cached update for the record is automatically used as the value for the parameter. When the parameter name matches a column name prefixed by the string "OLD_", then the old value for the field will be used. For example, in the update SQL statement below, the parameter :LastName is automatically filled with the new field value in the cached update for the inserted record.

INSERT INTO Names
(LastName, FirstName, Address, City, State, Zip)
VALUES :)LastName, :FirstName, :Address, :City, :State, :Zip)

New field values are typically used in the InsertSQL and ModifySQL statements. In an update for a modified record, the new field value from the update cache is used by the UPDATE statement to replace the old field value in the base table updated.

In the case of a deleted record, there are no new values, so the DeleteSQL property uses the ":OLD_FieldName" syntax. Old field values are also normally used in the WHERE clause of the SQL statement for a modified or deletion update to determine which record to update or delete.

In the WHERE clause of an UPDATE or DELETE update SQL statement, supply at least the minimal number of parameters to uniquely identify the record in the base table that is updated with the cached data. For instance, in a list of customers, using just a customer's last name may not be sufficient to uniquely identify the correct record in the base table; there may be a number of records with "Smith" as the last name. But by using parameters for last name, first name, and phone number could be a distinctive enough combination. Even better would be a unique field value like a customer number.

Note

If you create SQL statements that contain parameters that do not refer the edited or original field values, the update object does not know how to bind their values. You can, however, do this manually, using the update object's Query property.
Может я штото просто не допонял?
 
G

Guest

To Barmutik:
Дык все дело то в том, что на MS SQL 2000 и 2005 все уходит без проблем, а с локальной таблицей вот такая хрень.

To Руслан П:
Неа, не прошло.

Если перед ' : ' стоип нечетное число ' " ', вываливается.
Для INSERT INTO Proba (Text) VALUES ('''"''ABC:') не поленился, переписал все:
Бл*, што за комманда :) ?

Я ради интереса вчера облазил делфевый хелп, в общем нашел там несколько разделов с какойто там на мой взгляд несуразностью:

Может я штото просто не допонял?

там не 2 ковычки, а еще с обеих сторон добавь по паре апострофов, или скопируй то что я написал
 
G

Guest

а и вообще, какое исключение выдает если писать как ты пишешь?
 
H

HardFlash

там не 2 ковычки, а еще с обеих сторон добавь по паре апострофов, или скопируй то что я написал
ЭЭЭ, на счет апострофов, тоже пробывал, не пошло.

а и вообще, какое исключение выдает если писать как ты пишешь?

Для
INSERT INTO Proba (Text) VALUES ('''"''ABC:')
исключение Unknown, а точнее незнаю:
Bag.JPG

Чуть не оставил без внимания, но попробывал даже так:
Проверка на связке MS SQL Server 2000 + BDE + Delphi 7 ошибки не выявила
...
Код:
 Query1.SQL.Text := 'INSERT INTO Proba (CCName) VALUES (:CCName)';
Query1.ParamByName('CC_Name').AsString := '"ABC:';
Query1.ExecSQL;
По аналогии:
Код:
	 Str := '"ABC:';
Str := AddSlashes(Str);
Query2.Close;
Query2.SQL.Clear;
Query2.SQL.Add('INSERT INTO раroba (Text) VALUES (:Text)');
Query2.ParamByName('Text').AsString := Str;
Query2.ExecSQL;
Но в результате получил загадочное исключение :)
Bag3.JPG
Что такое, не знаю, щас пора домой, завтра посмотрю в чем может быть проблема.
 
S

sergushkin

Последнее исключение обозначает, что у Query2 не задано свойство DatabaseName. И объект Query2 пытается найти таблицу в текущей директории, но не находит.
 
H

HardFlash

Дык как раз задано, задавал напрямую и через Alieas.
Именно C:\5\proba.db и есть то,что надо, и главное доступен. <_<

Может в локальном BDE есть какие дерективы аля MS SQL, отключающие реакцию на подобные весчи?
 
H

HardFlash

ЗАРАБОТАЛО!!!!!!! <_< :( ;)

Я не знаю в чем был глюк, но как раз и пошел код:
Код:
	 Str := '"ABC:';
Query2.Close;
Query2.SQL.Clear;
Query2.SQL.Add('INSERT INTO раroba (Text) VALUES (:Text)');
Query2.ParamByName('Text').AsString := Str;
Query2.ExecSQL;
Пересоздал проект, и все поехало, не знаю в чем был клюк в предыдущем проекте с потерей Alieas'а. sergushkin, ты был прав.

Всем спасибо за помощь и участие...
Тема закрыта.
 
Статус
Закрыто для дальнейших ответов.
Мы в соцсетях:

Обучение наступательной кибербезопасности в игровой форме. Начать игру!