Форум: "Прочее";
Текущий архив: 2008.12.14;
Скачать: [xml.tar.bz2];
ВнизОшибка в SQLite Найти похожие ветки
← →
Добежал (2008-10-10 14:49) [0]Судя по всему, SQLite неправильно работает с русскими символами в путях к файлу БД (или, наверное, будет точнее сказать, что работает неверно с НЕ английскими символами).
Есть такой класс://------------------------------------------------------------------------------
// TSQLiteDatabase
//------------------------------------------------------------------------------
constructor TSQLiteDatabase.Create(const FileName: string);
var
Msg: pchar;
iResult: integer;
begin
inherited Create;
self.fInTrans := False;
Msg := nil;
try
iResult := SQLite3_Open(PChar(FileName), FHandle);
if iResult <> SQLITE_OK then
if Assigned(Handle) then
begin
Msg := Sqlite3_ErrMsg(Handle);
raise ESqliteException.CreateFmt("Failed to open database "%s" : %s",
[FileName, Msg]);
end
else
raise ESqliteException.CreateFmt("Failed to open database "%s" : unknown error",
[FileName]);
//set a few configs
self.ExecSQL("PRAGMA SYNCHRONOUS=NORMAL;");
// self.ExecSQL("PRAGMA full_column_names = 1;");
self.ExecSQL("PRAGMA temp_store = MEMORY;");
finally
if Assigned(Msg) then
SQLite3_Free(Msg);
end;
end;
Экспорт:function SQLite3_Open(dbname: PChar; var db: TSqliteDB): integer; cdecl; external "sqlite3.dll" name "sqlite3_open";
Глюк очень интересный. Если, например, сделать так:TSQLiteDatabase.Create("c:\фигня\test.db");
То он не выдает ошибку, а создает файл test.db прямо в "c:\" !
Ощущение, что он как-будто "не учитывает" директории с русскими символами.
Кто встречался, что делать?!
P.S. "sqlite3.dll" - почему то в свойствах версия не указана, но качал с оф. сайта не более месяца назад.
← →
tesseract © (2008-10-10 14:53) [1]
> То он не выдает ошибку, а создает файл test.db прямо в "c:
> \" !
Там строка unicode. Читаем мануал.
← →
Добежал (2008-10-10 15:03) [2]Блин, точно... Нафига так заголовочный файл составлен:
function SQLite3_Open(dbname: PChar; var db: TSqliteDB): integer; cdecl; external "sqlite3.dll" name "sqlite3_open";
гады...
Я б$% ошибку два часа искал! У меня так оказалось, что в директории были русские символы, поэтому он создавал в директории выше. А доступ в директорию выше была запрещена! В результате я вроде как указываю правильный путь (сто пятьдесят раз проверял), а он говорит что не может создать базу... Блин, блин, ненавижу ;)
← →
jack128_ (2008-10-10 15:36) [3]
> Нафига так заголовочный файл составлен:
а как он по твоему должен быть составлен???
← →
tesseract © (2008-10-10 15:36) [4]
> Нафига так заголовочный файл составлен:
Прально он составлен. Для Сей, multibyte там вроде ипользуеться, а не совсем unicode. Да и гемора с выяснением размеров строки вроде поменьше. Delphi вроде сама догадываеться когда какая строка используеться, но не всегда.
← →
jack128_ (2008-10-10 15:38) [5]
> Для Сей, multibyte там вроде ипользуеться, а не совсем unicode
UTF-8 в этой функции используется.
в прочем есть версия функции и для utf-16
← →
Добежал (2008-10-10 16:19) [6]
> а как он по твоему должен быть составлен???
Жень, по-моему, очевидно:
function SQLite3_Open(dbname: PUTF8String; var db: TSqliteDB): integer; cdecl; external "sqlite3.dll" name "sqlite3_open";
> Прально он составлен
хм... наверное, я тупой. Но все таки под PChar обычно понимают указатель на ANSI-символ / строчки.
Хотя, конечно, вы сейчас начнете доказывать обратное...
← →
jack128_ (2008-10-10 16:42) [7]
> Жень, по-моему, очевидно:
int sqlite3_open(
const char *filename,
sqlite3 **ppDb
);
Ты действительно думаешь, что дельфиское PUTF8String - эквивалентно сишному cosnt char *
??? Слава богу, что ты не занимаешся переводом сишных хедеров....
← →
Добежал (2008-10-10 16:56) [8]
> Ты действительно думаешь, что дельфиское PUTF8String - эквивалентно
> сишному cosnt char *
я действительно думаю, что библиотека sqlite3 принимает в качестве параметра указатель на UTF8 набор символов.
В си такого типа видимо нету.
В дельфи есть, это PUTF8String. То есть, описание на си + комментарий справа - получается вот.
Это мое мнение, если я не прав - поясните ошибку. Только не в стиле "ты дурак и слава богу что не ты что-то делаешь".
← →
jack128_ (2008-10-10 17:24) [9]
UTF8String = type string;
PUTF8String = ^UTF8String;
то есть PUTF8String - указатель на строку. ПРичем не просто на строку, а на _длинную_ строку, которая сама по себе является указателем на символы.
char * - это указатель на символ
← →
Добежал (2008-10-10 17:39) [10]Черт, точно.
Действительно, должно быть что-то типа:UTFChar = type char;
PUTFString = ^UTFChar;
или навроде того. Но такого типа судя по всему нету... Тогда самое близкое PChar, это да.
Я ступил, заголовочные файлы в порядке.
Но это не отменяет того, что функцию:
> constructor TSQLiteDatabase.Create(const FileName: string);
надо было писать как:constructor TSQLiteDatabase.Create(const FileName: UTF8String);
← →
Игорь Шевченко © (2008-10-10 17:43) [11]Вообще-то символ в UTF-8 - это char, так что в заголовке все правильно написано
← →
Anatoly Podgoretsky © (2008-10-10 19:08) [12]> Игорь Шевченко (10.10.2008 17:43:11) [11]
Не согласен, для порядку надо TUTF8String, это же как TCaption/TDate/TTime - нужно для двух целей - первое подчеркнуть что это особый тип, а второе - это то что можно сделать отдельный редактор свойства для диспетчера объектов.
← →
Добежал (2008-10-10 21:03) [13]
> Вообще-то символ в UTF-8 - это char
а указатели в 32-ух битной windows все 32-ух битные. Но зачем то ведь придумали типизированные указатели.
> так что в заголовке все правильно написано
в заголовке да. Неправильно здесь:constructor TSQLiteDatabase.Create(const FileName: string);
Надо:constructor TSQLiteDatabase.Create(const FileName: UTF8String);
← →
jack128_ (2008-10-10 21:13) [14]
> Надо:
>
> constructor TSQLiteDatabase.Create(const FileName: UTF8String);
>
да нет, сигнатуру нуно поменять на WideString, а в реализацию добавить UTF8Encode
Страницы: 1 вся ветка
Форум: "Прочее";
Текущий архив: 2008.12.14;
Скачать: [xml.tar.bz2];
Память: 0.48 MB
Время: 0.028 c