powered by simpleCommunicator - 2.0.18     © 2024 Programmizd 02
Map
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Ошибка в OO API Firebird 3.0
13 сообщений из 13, страница 1 из 1
Ошибка в OO API Firebird 3.0
    #40133687
undrey33
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
При выполнения операторов с входными параметрами если база данных с кодировкой символов 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
Ошибка в OO API Firebird 3.0
    #40133689
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
undrey33,

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

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

PS пользуйся тегом src - это невозможно читать.
...
Рейтинг: 0 / 0
Ошибка в OO API Firebird 3.0
    #40133730
undrey33
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
А почему тогда
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
Ошибка в OO API Firebird 3.0
    #40133733
undrey33
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Почему тогда
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
Ошибка в OO API Firebird 3.0
    #40133734
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Потому что ты забыл указать connection charset или указал его однобайтовый.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Ошибка в OO API Firebird 3.0
    #40133739
undrey33
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Указывал connected charset как UTF-8 или не указывал на C++ не работает а в Delphi всё работает.
Если указывать же в строке соединения connected charset как WIN1251 то всё работает, но для этого случая не подходит.
...
Рейтинг: 0 / 0
Ошибка в OO API Firebird 3.0
    #40133742
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
На этом ОО API работает isql и (самое главное) - старое API. То, что ты
рассказываешь, без полного воспроизводимого примера с кодом - сказочки.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Ошибка в OO API Firebird 3.0
    #40133749
undrey33
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Завтра сброшу реальный пример так как сегодня уже занят.
...
Рейтинг: 0 / 0
Ошибка в OO API Firebird 3.0
    #40133802
undrey33
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
На простом примере всё работает. Так что извиняюсь нет там никакой ошибки
...
Рейтинг: 0 / 0
Ошибка в OO API Firebird 3.0
    #40133921
Мимопроходящий
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry Sibiryakov
На этом ОО API работает isql и (самое главное) - старое API.
правильно ли я понял, что именно isc_xxx_api на данном этапе исторического развития является обёрткой над OO API , а не наоборот?
...
Рейтинг: 0 / 0
Ошибка в OO API Firebird 3.0
    #40133922
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Мимопроходящий,

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

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


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