Intanto andando a spulciare il codice di sqldb presumo che il CreateDB non sia ancora implementato:
procedure TSQLConnection.CreateDB;
begin
DatabaseError(SNotSupported);
end;
Annoto per documentazione:
Ho creato e riempito un database inteso come da prima esecuzione.
Poi o tramite quel progetto grafico o tramite LazRes ( ho dovuto compilarlo prima ) ho creato il file di risorse es. "miofile.lrs".
Alla fine della unit prima di "end." ho aggiunto:
initialization
{$I miofile.lrs}
Nello uses ho aggiunto "LResources".
Nella procedura di creazione del nuovo DB:
var
res: TLResource;
resData: String;
begin
res:=LazarusResources.Find('database'); // nel mio caso il file aggiunto nella risorsa si chiamava database.db
resData:=res.Value;
// salvo il file
with TStringList.Create do
try
Add(resData);
SaveToFile('nuovo.db'); // Usare un TSaveDialog per il nome
finally
Free;
end;
end;
Ho usato il file di risorse esterno perchè nelle prove di quello interno il compilatore non includeva il file nell programma e quindi giustamente andava in errore quando cercava di leggere la risorsa da se stesso.
http://www.sqlite.org/c3ref/open.html
int sqlite3_open(
const char *filename, /* Database filename (UTF-8) */
sqlite3 **ppDb /* OUT: SQLite db handle */
);
A basso livello. ;)
Tanto la dll è caricata. Basta chiamare l'api giusta ;) ... poi ti sganci (la creazione non credo debba avvenire ogni 10 ms .. no? ma una tantum ).
Riconnetti la libreria che stai usando con il nome giusto.
Se vedi come fanno l'apertura, basta aggiungere un flag:
SQLITE_OPEN_READWRITE | SQLITE_OPEN_CREATE
The database is opened for reading and writing, and is created if it does not already exist. This is the behavior that is always used for sqlite3_open() and sqlite3_open16().
Magari non fanno la creazione da procedure, ma la fanno in apertuta. Ora controllo :D
Riga696 di sqlite3con
checkerror(sqlite3_open(pchar(str1),@fhandle));
Ora basta puntare ad un file inesistente e vedere se lo crea ;)