Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Ошибка при повторном присвоении параметра / 20 сообщений из 20, страница 1 из 1
24.07.2014, 11:58
    #38704696
sann-x
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ошибка при повторном присвоении параметра
Вот нижеследующий код выдает ошибку "Trying to store a string of length 2 into a field that can only contain 1". Код такой:
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
SQL_R.Close; // SQL_R is TIBSQL
SQL_R.SQL.Clear;
SQL_R.SQL.Add('select * from rdb$database where rdb$character_set_name=? ' +
  'or rdb$character_set_name=?');
SQL_R.Transaction.StartTransaction;
try
  SQL_R.ParamCheck := False;
  SQL_R.Params.Count := 2;
  SQL_R.Params.AddName('prmStr', 0);
  SQL_R.Params.AddName('prmStr2', 1);
  SQL_R.ParamByName('prmStr').AsString := 'bla bla';
  SQL_R.ParamByName('prmStr2').AsString := '1';
  SQL_R.ExecQuery;
  Memo1.Lines.Add(Format('"%s" - "%s"', [SQL_R.Fields[0].AsString,
    SQL_R.Fields[1].AsString]));
  SQL_R.Transaction.Commit;
finally
  if SQL_R.Transaction.InTransaction then
    SQL_R.Transaction.Rollback;
  SQL_R.Close;
end;

SQL_R.Close;
SQL_R.SQL.Clear;
SQL_R.SQL.Add('select * from rdb$database where rdb$character_set_name=?');
SQL_R.Transaction.StartTransaction;
try
  SQL_R.ParamCheck := False;
  SQL_R.Params.Count := 1;
  SQL_R.Params.AddName('prmStr', 0);
  SQL_R.ParamByName('prmStr').AsString := 'bla bla';
  SQL_R.ExecQuery;
  Memo1.Lines.Add(Format('"%s" - "%s"', [SQL_R.Fields[0].AsString,
    SQL_R.Fields[1].AsString]));
  SQL_R.Transaction.Commit;
finally
  if SQL_R.Transaction.InTransaction then
    SQL_R.Transaction.Rollback;
  SQL_R.Close;
end;

SQL_R.Close;
SQL_R.SQL.Clear;
SQL_R.SQL.Add('select * from rdb$database where rdb$character_set_name=? ' +
  'or rdb$character_set_name=?');
SQL_R.Transaction.StartTransaction;
try
  SQL_R.ParamCheck := False;
  SQL_R.Params.Count := 2;
  SQL_R.Params.AddName('prmStr', 0);
  SQL_R.Params.AddName('prmStr2', 1);
  SQL_R.ParamByName('prmStr').AsString := 'bla bla';
  SQL_R.ParamByName('prmStr2').AsString := '22';  // !!! ВОТ ЗДЕСЬ ВЫЛАЗИТ ОШИБКА !!!
  SQL_R.ExecQuery;
  Memo1.Lines.Add(Format('"%s" - "%s"', [SQL_R.Fields[0].AsString,
    SQL_R.Fields[1].AsString]));
  SQL_R.Transaction.Commit;
finally
  if SQL_R.Transaction.InTransaction then
    SQL_R.Transaction.Rollback;
  SQL_R.Close;
end;


Суть такая:
1) создаю в первом запросе 2 параметра вручную, присваиваю им строковые значения;
2) создаю во втором запросе 1 параметр вручную, присваиваю ему строковое значение;
3) создаю в третьем запросе 2 параметра вручную, присваиваю им строковые значения; но во втором параметре длина значения больше, чем было указано в первом запросе.
При таких условиях вылезает ошибка. Если же п.2 нет, то без проблем, либо п.2 есть, но длина второго параметра в п.3 не более длины из п.1, то тоже все ОК. Как лечить?
...
Рейтинг: 0 / 0
24.07.2014, 12:23
    #38704737
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ошибка при повторном присвоении параметра
sann-xКак лечить?
Не создавать параметры вручную. Вызвать Prepare.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
24.07.2014, 12:27
    #38704741
sann-x
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ошибка при повторном присвоении параметра
Dimitry Sibiryakov,

Я использую execute block и там параметры как "?". Поэтому не вручную параметры создавать не могу.
...
Рейтинг: 0 / 0
24.07.2014, 12:31
    #38704754
kdv
kdv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ошибка при повторном присвоении параметра
sann-x,

по порядку номеров заполняй, что за проблема?
...
Рейтинг: 0 / 0
24.07.2014, 12:33
    #38704759
Симонов Денис
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ошибка при повторном присвоении параметра
sann-x,

задавай параметрам тип и размер самостоятельно.
...
Рейтинг: 0 / 0
24.07.2014, 12:34
    #38704761
sann-x
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ошибка при повторном присвоении параметра
kdv,

не понял идею, подробнее можно?
...
Рейтинг: 0 / 0
24.07.2014, 12:48
    #38704796
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ошибка при повторном присвоении параметра
sann-xЯ использую execute block и там параметры как "?". Поэтому не вручную
параметры создавать не могу.
Ты можешь не использовать кривой IBX и тогда проблем с параметрами не будет.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
24.07.2014, 12:52
    #38704811
kdv
kdv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ошибка при повторном присвоении параметра
sann-xне понял идею, подробнее можно?
имена параметров в общем случае - это фикция, на клиентской стороне. Сами по себе они идут по номерам. Первый ? это первый параметр, второй ? - второй, и т.д. Если нумерация с 0, значит 0, 1, 2.
Params[0].asString:=....
...
Рейтинг: 0 / 0
24.07.2014, 12:57
    #38704815
sann-x
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ошибка при повторном присвоении параметра
kdv,

Пробовал указывать параметр через его индекс - результат тот же.
...
Рейтинг: 0 / 0
24.07.2014, 13:02
    #38704825
sann-x
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ошибка при повторном присвоении параметра
Симонов Денис,

вот так тоже не решает проблему:
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
SQL_R.ParamCheck := False;
SQL_R.Params.Count := 2;
SQL_R.Params.AddName('prmStr', 0);
SQL_R.Params.AddName('prmStr2', 1);
SQL_R.Params[0].AsString := 'bla bla';
SQL_R.Params[1].SqlVar.SqlType := SQL_TEXT or (SQL_R.Params[1].SqlVar.SqlType and 1); // set type
SQL_R.Params[1].SqlVar.SqlLen := 100; // set len
SQL_R.Params[1].AsString := '22';
SQL_R.ExecQuery;
...
Рейтинг: 0 / 0
24.07.2014, 13:24
    #38704861
kdv
kdv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ошибка при повторном присвоении параметра
sann-xПробовал указывать параметр через его индекс - результат тот же.
я не очень понимаю, при чем тут execute block, и зачем выключен paramcheck, если никакого execute block в запросах нет. Или ты тренируешься для execute block?
...
Рейтинг: 0 / 0
24.07.2014, 13:26
    #38704863
sann-x
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ошибка при повторном присвоении параметра
kdv,

в коде лишь простой пример запросов для генерации ошибки. В реальном проекте используются execute block.
...
Рейтинг: 0 / 0
24.07.2014, 13:33
    #38704873
sann-x
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ошибка при повторном присвоении параметра
Хм...

Если сразу после "SQL_R.Params.Count := 2" добавить:
Код: pascal
1.
2.
3.
4.
...
SQL_R.Unprepare;
SQL_R.Prepare;
...определение параметров..


то ошибка не вылазит. Такой "хак" можно считать валидным?
...
Рейтинг: 0 / 0
24.07.2014, 13:46
    #38704889
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ошибка при повторном присвоении параметра
Смотрю я на эти извращения и думаю: написать этот же код на чистом API - выйдет короче и
понятнее. WTF?..
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
24.07.2014, 14:02
    #38704929
sann-x
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ошибка при повторном присвоении параметра
Dimitry Sibiryakov,

Почему Prepare-Unprepare - это изврат?
...
Рейтинг: 0 / 0
24.07.2014, 14:09
    #38704944
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ошибка при повторном присвоении параметра
sann-xПочему Prepare-Unprepare - это изврат?
Попробуй его на канале с большим пингом - почувствуешь собственной шкурой.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
24.07.2014, 14:11
    #38704946
sann-x
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ошибка при повторном присвоении параметра
Dimitry Sibiryakov,

т.е. при частых SQL-запросах будет тормозить прога?
...
Рейтинг: 0 / 0
24.07.2014, 14:24
    #38704975
Мимопроходящий
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ошибка при повторном присвоении параметра
Hello, Sann-x!
You wrote on 24 июля 2014 г. 14:23:02:

Sann-x> т.е. при частых SQL-запросах будет тормозить прога?
не будет. расслабься.
а то дмитрий ненавязчиво впарит тебе свой репликатор.
как единственно верное решение.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
24.07.2014, 14:27
    #38704979
sann-x
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ошибка при повторном присвоении параметра
Мимопроходящий,

ОК. Тогда закоммитю этот "хак" как исправление бага.
...
Рейтинг: 0 / 0
24.07.2014, 14:42
    #38705012
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ошибка при повторном присвоении параметра
sann-xТогда закоммитю этот "хак" как исправление бага.
Прэлееестно. Сначала создаём себе проблемы используя кривые компоненты, а потом героически
с ними боремся. Ню-ню...
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Ошибка при повторном присвоении параметра / 20 сообщений из 20, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]