Motorola MC3090 – jak połączyć się z SQLite?

0

Witam, walczę już od kilku dni z uruchomieniem SQLite na WinCE bez sukcesu :( nie mogę połączyć się do bazy danych używam sqllite3ce.dll (próbopwałem kilku innych bibliotek bez powodzenia). Biblioteka jest umieszczona razem z plikiem exe.
Być może jest to wina sposobu uruchamiania:

procedure TForm1.Button1Click(Sender: TObject);
begin
    //SQLiteLibraryName:='sqlite3.dll'; // zmienilem z sqlite3ce.dll na sqlite3.dll
    Connect.DatabaseName := 'demo.db';
    Connect.Connected := True;
    //
    try
    SqlQuery1.Close;
    SQLQuery1.Clear;
    SqlQuery1.SQL.Add('create table nowa_tabela (ID integer Primary Key, NAME varchar(40))');
    SqlQuery1.ExecSQL;
    finally
    SqlQuery1.Close;
    end;
end;

po uruchomieniu programu w logu mam info:

TApplication.HandleException Transaction not set
  Stack trace:
  $001BCC44
  $001B54A0
  $0015C1D4
  $0017F09C
  $0017F940
  $0017EF6C
  $00020230

proszę o podpowiedź co robię żle.

0

jaka wersja lazarusa i fpc ?

0

proszę o podpowiedź co robię żle.

Nie korzystasz z wyszukiwarki
http://forum.lazarus.freepascal.org/index.php?topic=23737.0

1

Łap w załączniku ten działa.

0
satq napisał(a):

Łap w załączniku ten działa.
.+
Używam Typhon32 wersja 6.2 a wersja FPC: 3.1.1
Kiedy kompiluję program pod Windows to działa bez problemu ale po podmianie dll na wersję dla WinCE wywala mi błąd

TApplication.HandleException Connect1 : no such table: pessoas [tak mam nazwaną tablice]
  Stack trace:
  $001B3690
  $001B132C
  $001B1F70
  $001B5F94
  $001B5E04
  $0015C2B4
  $0017F17C
  $0017FA20
  $0017F04C
  $00020230

kod programu w całości

unit Unit1;

{$mode objfpc}{$H+}

interface

uses
  Classes, SysUtils, sqlite3conn, sqldb, FileUtil, Forms, Controls, Graphics,
  Dialogs, StdCtrls;

type

  { TForm1 }

  TForm1 = class(TForm)
    Button1: TButton;
    Button2: TButton;
    Connect1: TSQLite3Connection;
    Label1: TLabel;
    Label2: TLabel;
    Label3: TLabel;
    SQLQuery1: TSQLQuery;
    SQLTransaction1: TSQLTransaction;
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
    procedure FormCreate(Sender: TObject);
  private

  public

  end;

var
  Form1: TForm1;

implementation

{$R *.frm}

{ TForm1 }

procedure TForm1.Button2Click(Sender: TObject);
begin
  Application.Terminate;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  //SQLiteLibraryName := 'sqlite3.7.16.1-arm4.dll';
  SetBounds(0,22,Screen.Width,Screen.Height);
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  //Connect1.DatabaseName:='\\demo.db';
  try
   SQLiteLibraryName := 'sqlite3.dll';
   label3.Caption:= 'dll ok';
  except
   Label3.caption := 'nie zaladowało biblioteki';
  end;


  Connect1.Connected := True;
  try

    Connect1.Open;
    SQLTransaction1.Active := True;
    Connect1.ExecuteDirect('insert into pessoas("id", "nome") values (6, "test6");');
    SQLTransaction1.Commit;
      Label2.Caption := 'działa';
  {  SQLQuery1.Close;
    SQLQuery1.Clear;
    //SQLQuery1.SQL.Add('create table nowa_tabela (ID integer Primary Key, NAME varchar(40))');
    SQLQuery1.SQL.Add('select * from pessoas');

    SQLQuery1.ExecSQL;  }
  except
    // SQLQuery1.Close;
   on E: EInOutError do
    Label2.Caption := e.Message;
  end;
end;

end. 

pewnie czegoś nie zrobiłem w kodzie ale jeszcze nie wiem co :( - walczę dalej

0

nie startujesz transakcji - w ogole zacznj bez tego moim zdaniem.
Zastosuj parametry w zapytaniach SQL.

0

Jak mam ten kod (ponizej) dla win32 to działa a jak zmienię bibliotekę (tą którą udostępnił kolega satq) i kompilacje dla WinCE to program wywala błąd a w logu mam:

TApplication.HandleException Connect1 : no such table: pessoas

kod który uruchamiam dla Button1 to:

    try
        //SQLiteLibraryName := 'sqlite3ce.dll';
        //SQLiteDefaultLibrary := 'sqlite3win.dll'
        Connect1.DatabaseName:= 'demo.db';
        Connect1.Connected:= True;
        SQLQuery1.SQL.Clear;
        SQLQuery1.SQL.Add('insert into pessoas(id, nome) values (:id_e, :name_e)');
        SQLQuery1.Params.paramByName('id_e').AsString := Edit1.Text;
        SQLQuery1.Params.paramByName('name_e').AsString := Edit2.Text;
        SQLQuery1.ExecSQL;
       //     SQLTrans1.Active:= True;
        SQLTrans1.Commit;

        SQLQuery1.Close;
  except
   //Label3.caption := 'nie zaladowało biblioteki';
       on E: EInOutError do
    Label2.Caption := e.Message;
  end; 

Nie rozumiem dlaczego nie mogę uruchomić kodu na WinCE.
Proszę o łopatologiczną pomoc :(.........

1

Z komunikatu wynika, że w bazie nie ma tabeli "pessoas". Na Windowsie pewnie masz aktualną wersję bazy a na WinCE pustą. Druga możliwość jest taka, że program łączy się z bazą w innym miejscu niż ją wstawiłeś. Wtedy podczas Connect1.Connected program tworzy nową pustą bazę, a wywołanie insert nie znajduje takiej tabeli w pustej bazie. Sprawdź czy przeniosłeś na urządzenie utworzoną bazę razem z aplikacją. Jeśli tak to proponuję sprawdzić czy program widzi bazę w miejscu z którego ją wywołuje np. fileexists. Spróbuje też podać ścieżkę bezwzględną do bazy na WinCE.

0

Sprawdziłem i program widzi bazę oraz skopiowałem bazę do urządzenia (emulatora). baza demo.db i tabela pessoas istnieje w bazie.
Jutro sprawdzę na urządzeniu :(

Nie umiem sprawdzić :( kombinuję na różne sposoby i dla Windows działa a dla WinCE nie.
Dodałem do projektu z SQLdb TSQLDBLibraryLoader niby nie wywala błędu ale nadal nie mogę zmodyfikować bazy na WinCE.
Nadal brak tabeli:(
w create formy dałem

  try
    SQLDBLibraryLoader1.ConnectionType:= 'SQLite3';
     SQLDBLibraryLoader1.LibraryName:= 'sqlite3.dll';
    SQLDBLibraryLoader1.Enabled:= True;
  except
    Label1.Caption:= 'biblioteka sqlite3.dll nie załadowana';
  end;

Dla windows to działa.
Dla button1 kod:

if FileExists('bazatest.db') Then
  begin
      Connect1.DatabaseName:= 'bazatest.db';
      Connect1.Connected:= True;
      SQLQuery1.SQL.Clear;
      if FileExists('bazatest.db') then
         begin

            SQLQuery1.SQL.Clear;
            SQLQuery1.SQL.Add('insert into nuser(id, imie) values (:id_e, :name_e)');
            SQLQuery1.Params.paramByName('id_e').AsString := Edit1.Text;
            SQLQuery1.Params.paramByName('name_e').AsString := Edit2.Text;
            SQLQuery1.ExecSQL;
            SQLTrans1.Active:= True;
            SQLTrans1.Commit;

            SQLQuery1.Close;

         end;
  end else ...

Kurna głupi już jestem. :(

1

Dużo opcji już Tobie nie zostało. Próbuj tworzyć tabele bezpośrednio z poziomu aplikacji na pustej bazie. Wyświetl sobie listę dostępnych tablic i zobacz co tam siedzi. Spróbuj też złapać @satq i niech udostępni jakiś przykład na którym będzie działać ta biblioteka. Może jednak coś z nią jest nie tak.

0

Bardzo dziękuje za pomoc. okazało się że program tworzy bazę w innym miejscu po przeniesieniu w w to miejsce bazy danych wszystko działa.
Jeszcze mi zostało dojść do tego jak w programie wpisać bezpośrednią ścieżkę do bazy bo coś mi to nie działa.
Jeszcze raz dziękuję za pomoc.

1
SQLite3Connection1.DatabaseName := ExtractFilePath(Application.ExeName) + 'test.db';
0

Witam po małej przerwie wróciłem do walki z WinCE i odczytując dane z bazy SQLite3 (SELECT) z Motoroli 3090 działa poprawnie ale próbując zrobić insert lub update wywala mi błąd
np.: robiąc UPDATE w logach mam: TApplication.HandleException disk I/O error

procedure TForm1.Save1Click(Sender: TObject);
begin

    SQLite3Conn.Connected:= False;
    SQLite3Conn.DatabaseName:= ExtractFilePath(Application.ExeName) + 'mfifo.db';
    //SQLTransaction1.DataBase.DatabaseName:='\Storage Card\mfifo.db';
    SQLite3Conn.Connected:= True;
    if FileExists(ExtractFilePath(Application.ExeName) + 'mfifo.db') then
    begin
        // wczytanie id maszyny
       SQLQuery1.Close;
       SQLQuery1.SQL.Clear;
       SQLQuery1.SQL.Add('UPDATE QM SET quantityBox = 12 WHERE idMachines = 3');
       SQLQuery1.ExecSQL;
       SQLTransaction1.Commit;
    end;
     SQLQuery1.Close;
end;

Kiedy usunę SQLTransaction1.Commit; to program tworzy plik tymczasowy nie wprowadzając danych do bazy.
Może mnie któryś z kolegów naprowadzić co robię nie tak. :(

1

Wygląda na to, że prawdopodobnie nie masz uprawnień do zapisu pliku bazy.

1 użytkowników online, w tym zalogowanych: 0, gości: 1