Deberías mostrarnos todo el código dooper. Así podremos ver donde está el problema. Si puedes hacernos llegar una demo con el código sería mejor (sin añadir el ejecutable... que sino será más pesado ya que el exe por defecto almacena info de debug y esta es demasiada incrementando el tamaño) Yo podría ver la posibilidad de descargar SQLite y hacer unas pruebas entre mañana y pasado mañana.
¿Ese código en que evento lo tienes? ¿En el OnCreate? ¿En un OnClic de un botón? ¿En ambos? ¿Estás siguiendo al pie de la letra ese tutorial que nos pasaste?
Como dices que en el DBGrid visualmente aparece una nueva fila pero que en efecto en la base de datos no ves nada... no se que pensar. ¿Utilizas alguna herramienta para administrar la base de datos SQLite? Algo como el IBExpert para Firebird, pero para SQLite. Si es así, ¿Cuál?
Recuerda que SQLite es una base de datos mono-usuario por lo que sólo admite una conexión exclusiva por vez. Por tanto mientras estés utilizando Lazarus y mantengas abierta la conexión cualquier otro intento de conectarse o de hacer cualquier operación dará una violación de acceso o un error. Por tanto si usas algún utilitario para administrar la base de datos debes cerrarlo, luego ir por Lazarus. Y a la inversa lo mismo.
Desconozco como se lleva Zeos con SQLite, al menos con Firebird Embebida (la versión mono-usuario de Firebird) efectivamente informa del error si ya hay una conexión.
Pensé que podría ser un problema de dll pero de ser así Zeos te arrojaría un error diciendo que le falta el archivo en cuestión. Pero ahora pienso que quizá el problema esté en que no aplicas una confirmación de la transacción. Aún así ese "extraño" comportamiento del DBGrid me deja intranquilo.
Zeos, de forma un tanto implícita trabaja con transacciones. Para que todos los cambios se reflejen no sólo debe hacerse Post desde el dataset en cuestión (query, table son en esencia datasets) sino que además debe confirmarse la transacción invocando al método Commit del ZConnection.
¿Que es una transacción? Es un conjunto de operaciones que deben hacerse atómicamente, o todo o nada. Es decir: que se "agrupa" una serie de instrucciones a realizar sobre una base de datos. Una característica de la transacción es que deben hacerse todas las operaciones, de lo contrario se dejaría a los datos de la base en un estado inconsistente. Por ello, una transacción se puede confirmar (Commit) o descartar/cancelar (RoollBack). De esta forma siempre la base de datos alcanza un estado consistente, si se descartan las operaciones vuelve a como estaba antes, y de confirmarse alcanza un nuevo estado seguro.
Indirectamente cada vez que le pides a un ZTable que esté en estado de inserción, o modificación, o cualquiera que sea, los componentes Zeos inician una nueva transacción. Y por defecto la propiedad AutoCommit está en true. En lo personal yo prefiero hacer las cosas explícitamente.
Sugiero que pruebes algo como esto en un proyecto nuevo:
procedure TForm1.Button1Click(Sender: TObject);
begin
// vamos a descartar una posible transacción "olvidada" de confirmar (o de deshacer)
// e iniciar una en "limpio"
if zconnection1.InTransaction
then Zconnection1.Rollback;
zconnection1.StartTransaction;
zquery1.Close; // por seguridad lo mantenemos cerrado y trabajaremos desde cero...
zquery1.SQL := 'INSERT INTO PERSONAS(NOMBRE, EDAD) VALUES (:ELNOMBRE, :LAEDAD)';
zquery1.ParamByName('ELNOMBRE').AsString:= 'Juancito';
zquery1.ParamByName('LAEDAD').AsInteger:= 25;
zquery1.ExecSQL;
zconnection1.Commit;
// como los dataset zeos quedan activos aún despues de confirmar la transacción lo cerramos
zquery1.Close;
ShowMessage('Operación terminada');
end;
Si en el ZConnection está todo bien configurado, se ha iniciado conexión previamente y existe la tabla PERSONAS el código anterior debería funcionar perfectamente. Luego comprueba, ya sea con el utilitario que uses, o por código (como tu quieras) si efectivamente se ha procedido a efectuar la inserción.
Yo se que otros compañeros usan SQLite quizá ellos puedan darnos más luz al problema.
Saludos,