Гость
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Ошибка в OO API Firebird 3.0 / 13 сообщений из 13, страница 1 из 1
12.02.2022, 10:31
    #40133687
undrey33
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ошибка в OO API Firebird 3.0
При выполнения операторов с входными параметрами если база данных с кодировкой символов UTF-8 функции getMessageLength(),
getOffset(),getNullOffset() для поле1 CHAR и VARCHAR() выдают неправильные результаты. Например база данных :
CREATE DATABASE 'UTF.FDB' PAGE_SIZE 4096;
ALTER DATABASE SET DEFAULT CHARACTER SET UTF8;
CREATE TABLE Owners (
ID SMALLINT PRIMARY KEY,
NAME MYNAME VARCHAR(40) COLLATE UNICODE_CI_AI);
Выполнение следующих операторов (Visual studio C++ и Embarcadero c++):
IStatement* stmt = att->prepare(&status, tra, 0, "UPDATE Owners SET Name = ? WHERE ID = 0", SQL_DIALECT_CURRENT,
IStatement::PREPARE_PREFETCH_METADATA);
IMessageMetadata* meta = stmt->getInputMetadata(&status);
char* buffer = new char[meta->getMessageLength(&status)]; //ошибка размер буфера 164 вместо нужных 44
//копирование требуемых символов в кодировке UTF-8
short* flag = (short*)&buffer[meta->getNullOffset(&status, 0)]; //ошибка 162 вместо 42
att->execute(&status, tra, 0, "UPDATE Owners SET Name = ? WHERE ID = 0", SQL_DIALECT_CURRENT, meta, buffer, NULL, NULL);
//вызовет исключение "Malformed string"
В Embarcadero Delphi при использовании firebird.pas из комплекта поставки Firebird ошибок в вышеуказанных функциях нет.
...
Рейтинг: 0 / 0
12.02.2022, 10:36
    #40133689
Симонов Денис
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ошибка в OO API Firebird 3.0
undrey33,

Нет там никаких ошибок
...
Рейтинг: 0 / 0
12.02.2022, 12:04
    #40133712
hvlad
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ошибка в OO API Firebird 3.0
undrey33,

Под каждый utf8 символ резервируется 4 байта в буфере.

PS пользуйся тегом src - это невозможно читать.
...
Рейтинг: 0 / 0
12.02.2022, 13:44
    #40133730
undrey33
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ошибка в OO API Firebird 3.0
А почему тогда
att:IAttacment;
stmt:IStatment;
meta:IMetadata;
...
stmt:=att.prepare(Status,Tra,0,'UPDATE Owners SET Naame=? WHERE ID=0',
SQL_Dialect_CURRENT,IStatement.PREPARE_PREFETCH_METADATA);
meta:=stmt.getInputMetadata(Status);
meta.getMessageLength(Status) даёт результат 44 для UTF-8
...
Рейтинг: 0 / 0
12.02.2022, 13:49
    #40133733
undrey33
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ошибка в OO API Firebird 3.0
Почему тогда
stmt:=att.prepare(Status,tra,0,'UPDATE Owners SET Name=? WHERE ID-0',
SQL_DIALECT_CURRENT,IStatement.PREPARE_PREFETCH_METADATA);
meta:=stmt.getInputMetadata(Status);
и meta.getMessageLength(Status); даёт результат 44 для UTF-8
...
Рейтинг: 0 / 0
12.02.2022, 13:56
    #40133734
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ошибка в OO API Firebird 3.0
Потому что ты забыл указать connection charset или указал его однобайтовый.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
12.02.2022, 14:23
    #40133739
undrey33
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ошибка в OO API Firebird 3.0
Указывал connected charset как UTF-8 или не указывал на C++ не работает а в Delphi всё работает.
Если указывать же в строке соединения connected charset как WIN1251 то всё работает, но для этого случая не подходит.
...
Рейтинг: 0 / 0
12.02.2022, 14:35
    #40133742
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ошибка в OO API Firebird 3.0
На этом ОО API работает isql и (самое главное) - старое API. То, что ты
рассказываешь, без полного воспроизводимого примера с кодом - сказочки.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
12.02.2022, 15:53
    #40133749
undrey33
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ошибка в OO API Firebird 3.0
Завтра сброшу реальный пример так как сегодня уже занят.
...
Рейтинг: 0 / 0
13.02.2022, 09:53
    #40133802
undrey33
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ошибка в OO API Firebird 3.0
На простом примере всё работает. Так что извиняюсь нет там никакой ошибки
...
Рейтинг: 0 / 0
14.02.2022, 12:00
    #40133921
Мимопроходящий
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ошибка в OO API Firebird 3.0
Dimitry Sibiryakov
На этом ОО API работает isql и (самое главное) - старое API.
правильно ли я понял, что именно isc_xxx_api на данном этапе исторического развития является обёрткой над OO API , а не наоборот?
...
Рейтинг: 0 / 0
14.02.2022, 12:00
    #40133922
Симонов Денис
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ошибка в OO API Firebird 3.0
Мимопроходящий,

да
...
Рейтинг: 0 / 0
14.02.2022, 12:52
    #40133941
Мимопроходящий
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ошибка в OO API Firebird 3.0
Симонов Денис
да
ну, тогда пришла пора
заключать договора!
вам пора! и вам пора!
с вентиляторным заводом
заключать договора!

© рЫклама из 90-х.
...
Рейтинг: 0 / 0
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Ошибка в OO API Firebird 3.0 / 13 сообщений из 13, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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