![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
SQLLite [Delphi, Windows]
KingMidas © (2006-02-15 14:15:00)Люди! У кого-нибудь есть модуль для работы с SQLLite v3 (на bonanzas.rinet.ru лежит для 2.8). Очень надо!
KingMidas (2006-02-17 11:53:00) [1]Спасибо Андрею и Thaddy
Андрей (2006-02-16 18:27:00) [2]KingMidas, извини, забыл. Я его (MkSqLite3api) правил немножко под себя
--- так было
type
ppchar=^pchar;
ppvalue=^pvalue;
pvalue=pointer;
--- а так у меня
type
apchar = array [0..0] of pchar;
ppchar=^ apchar;
ppvalue=^pvalue;
pvalue=pointer;
---
Т.е. ppchar это ссылка на массив. Разумеется, проверка индексов выключена.
Но с другой стороны, можешь массив заведомо большой указать[0..64000], это же просто описание типа.
Собиралось все на D6
KingMidas (2006-02-15 22:42:00) [3]Thaddy, а пример можно ?
Thaddy (2006-02-15 21:36:00) [4]And
http://www.thaddy.com/kolsqlite3table3.pas
Thaddy (2006-02-15 21:32:00) [5]This failed, because it was too big.
Here's a link
http://www.thaddy.com/kolsqlite3.pas
Thaddy (2006-02-15 20:53:00) [6]function SQLite3_BindBlob(hStmt: TSqliteStmt; ParamNum: integer;
ptrData: pointer; numBytes: integer; ptrDestructor: pointer): integer;
cdecl; external 'sqlite3.dll' name 'sqlite3_bind_blob';
function SQLiteFieldType(SQLiteFieldTypeCode: Integer): AnsiString;
function SQLiteErrorStr(SQLiteErrorCode: Integer): AnsiString;
implementation
uses kol;
function SQLiteFieldType(SQLiteFieldTypeCode: Integer): AnsiString;
begin
case SQLiteFieldTypeCode of
SQLITE_INTEGER: Result := 'Integer';
SQLITE_FLOAT: Result := 'Float';
SQLITE_TEXT: Result := 'Text';
SQLITE_BLOB: Result := 'Blob';
SQLITE_NULL: Result := 'Null';
else
Result := 'Unknown SQLite Field Type Code "' + Int2Str(SQLiteFieldTypeCode) + '"';
end;
end;
function SQLiteErrorStr(SQLiteErrorCode: Integer): AnsiString;
begin
case SQLiteErrorCode of
SQLITE_OK: Result := 'Successful result';
SQLITE_ERROR: Result := 'SQL error or missing database';
SQLITE_INTERNAL: Result := 'An internal logic error in SQLite';
SQLITE_PERM: Result := 'Access permission denied';
SQLITE_ABORT: Result := 'Callback routine requested an abort';
SQLITE_BUSY: Result := 'The database file is locked';
SQLITE_LOCKED: Result := 'A table in the database is locked';
SQLITE_NOMEM: Result := 'A malloc() failed';
SQLITE_READONLY: Result := 'Attempt to write a readonly database';
SQLITE_INTERRUPT: Result := 'Operation terminated by sqlite3_interrupt()';
SQLITE_IOERR: Result := 'Some kind of disk I/O error occurred';
SQLITE_CORRUPT: Result := 'The database disk image is malformed';
SQLITE_NOTFOUND: Result := '(Internal Only) Table or record not found';
SQLITE_FULL: Result := 'Insertion failed because database is full';
SQLITE_CANTOPEN: Result := 'Unable to open the database file';
SQLITE_PROTOCOL: Result := 'Database lock protocol error';
SQLITE_EMPTY: Result := 'Database is empty';
SQLITE_SCHEMA: Result := 'The database schema changed';
SQLITE_TOOBIG: Result := 'Too much data for one row of a table';
SQLITE_CONSTRAINT: Result := 'Abort due to contraint violation';
SQLITE_MISMATCH: Result := 'Data type mismatch';
SQLITE_MISUSE: Result := 'Library used incorrectly';
SQLITE_NOLFS: Result := 'Uses OS features not supported on host';
SQLITE_AUTH: Result := 'Authorization denied';
SQLITE_FORMAT: Result := 'Auxiliary database format error';
SQLITE_RANGE: Result := '2nd parameter to sqlite3_bind out of range';
SQLITE_NOTADB: Result := 'File opened that is not a database file';
SQLITE_ROW: Result := 'sqlite3_step() has another row ready';
SQLITE_DONE: Result := 'sqlite3_step() has finished executing';
else
Result := 'Unknown SQLite Error Code "' + Int2Str(SQLiteErrorCode) + '"';
end;
end;
function ColValueToStr(Value: PChar): AnsiString;
begin
if (Value = nil) then
Result := 'NULL'
else
Result := Value;
end;
end.
KingMidas (2006-02-15 20:02:00) [7]to Андрей:
Андрей, под какой версией компилировалась эта программа ?
У меня на D7 не идет - ругается на строку:
Writeln(names[i],'=',values[i]);
Видимо правильно так:
Writeln(names^,'=',values^);
Но выводится только первый столбец БД.
Подскажите пожалуйста, как должно быть ?
Андрей (2006-02-15 17:46:00) [8]Собственно, это не совсем относится к KOL, но можно пойти и другим путем
возьми, например это
http://sqlite.org/contrib/download/mksqlite.zip?get=2
и используй из него только MkSqLite3api.
Вот минимальная прога в моем исполнении:
{$APPTYPE CONSOLE}
uses MkSqLite3api;
function DataTaker(user:pointer; ncols:integer; values:ppchar; names:ppchar):integer; cdecl;
var i: integer;
begin
writeln('------------ fields:',ncols);
DataTaker:=0;
for i:=0 to ncols-1 do begin
Writeln(names[i],'=',values[i]);
end;
end;
var
db: pointer;
err: integer;
begin
CheckSqliteLoaded;
err:=sqlite3_open('test.db3',db);
if err<>SQLITE_OK then begin
Writeln('Error opening database:',sqlite3_errmsg(db));
exit;
end;
sqlite3_exec(db,'select * from testing',DataTaker,nil,nil);
sqlite3_close(db);
end.
Вот ее вывод:
------------ fields:3
f1=0
f2=1
f3=test1
------------ fields:3
f1=0
f2=2
f3=test2
А вот как была создана эта таблица:
BEGIN TRANSACTION;
CREATE TABLE testing (f1 integer, f2 integer, f3 char(50));
INSERT INTO testing VALUES(0,1,'test1');
INSERT INTO testing VALUES(0,2,'test2');
COMMIT;
RA (2006-02-15 14:42:00) [9]Есть здесь http://www.thaddy.com/
Но она бэта.