2013-10-29 25 views
11

Mam problem z bazą danych SQLite. Używam SQLite ODBC z http://www.ch-werner.de/sqliteodbc/ zainstalowana w wersji 64-bitowej i stworzył ODBC z tymi ustawieniami:Aktualizowanie bazy danych SQLite za pośrednictwem tabeli połączonej ODBC w Access

enter image description here

otworzę moje bazy danych Access oraz link do źródła danych. Mogę otworzyć tabelę, dodawać rekordy, ale nie mogę usuwać ani edytować żadnych rekordów. Czy jest coś, co muszę naprawić po stronie ODBC, aby na to pozwolić? Błąd, który pojawia się podczas próby usunięcia rekordu, to:

Silnik baz danych Microsoft Access zatrzymał proces, ponieważ Ty i inny użytkownik próbujesz zmienić te same dane w tym samym czasie.

Kiedy edytować rekord uzyskać:

Rekord został zmieniony przez innego użytkownika od rozpoczęcia edycji. Jeśli zapiszesz rekord, nadpiszesz zmieniony, którego dokonał inny użytkownik.

Zapisanie zapisu jest wyłączone. Dostępne jest tylko kopiowanie do schowka lub upuszczanie zmian.

+0

Istnieje podobne pytanie na innym forum [tutaj] (http://social.msdn.microsoft.com/Forums/office/en-US/85196e70-d77f-4aef-af3f-78e43570f54a/editing-records-in -a-sqlite-backend-db? forum = accessdev). Czy którakolwiek z tych odpowiedzi lub sugestii może pomóc? –

+0

@GordThompson Dodanie pola Datownik wydaje się działać. Musiałem jednak później oczyścić stolik. Jedyne rekordy Dostęp może się zmienić, chociaż są to rekordy dodane przez dostęp. Dodałem rekord, jednak edycja SQLite Expert Personal i Access nie mogą zmienić ani usunąć tych rekordów. – Herrozerro

+0

Dodając link do tego powiązanego pytania: http://stackoverflow.com/questions/22837151/sqlite-linked-tables-in-access-give-deleted-values-again – gwideman

Odpowiedz

9

Moja pierwsza próba odtworzenia problemu nie powiodła się. Użyłem następujących w moim teście 32-bitowym VM:

  • Access 2010
  • SQLite 3.8.2
  • SQLite ODBC 0,996

stworzyłem i zaludnionych tabeli testowej [TBL1] jak udokumentowano here. Stworzyłem połączoną tabelę programu Access i po wyświetleniu monitu wybrałem obie kolumny ([jedna] i [dwie]) jako klucz główny. Kiedy otworzyłem połączoną tabelę w widoku arkusza danych, mogłem dodawać, edytować i usuwać rekordy bez żadnych incydentów.

Jedyną różnicą, którą mogę zobaczyć między moją instalacją a twoją (oprócz tego, że jestem na 32-bitowym i 64-bitowym) jest to, że w ustawieniach DSN ODBC opuściłem ustawienie Sync.Mode na jego domyślnym poziomie wartość NORMAL, a Twoja wydaje się być ustawiona na OFF.

Spróbuj ustawić swoje Sync.Mode na NORMAL i sprawdź, czy to ma znaczenie.

Edit Re: Komentarze

Rozwiązaniem w tym przypadku był następujący:

Możliwym Rozwiązaniem byłoby stworzenie nowej tabeli SQLite z wszystkich tych samych kolumn plus nowego INTEGER PRIMARY KLUCZ KEY, który Access "zobaczy" jako AutoNumber. Możesz utworzyć unikalny indeks na (co jest obecnie) w pierwszych czterech kolumnach, aby zapewnić, że pozostaną unikalne, ale nowa nowa "tożsamość" (ROWID) kolumna jest tym, co Access użyłby do zidentyfikowania wierszy dla operacji CRUD.

+0

byłoby możliwe dodanie rekordu za pomocą innego programu jak http://www.sqliteexpert.com/? Wydaje mi się, że wydaje się, że próbujesz edytować rekord nie dodany przez dostęp. Z polem Datownik, jeśli dodałem rekord przez dostęp, działa dobrze, ale dodanie rekordu z innego źródła wydaje się mieć ten sam problem. – Herrozerro

+0

@Herrozerro Stworzyłem dwa pierwsze rekordy w tabeli przy użyciu samego SQLite (zgodnie z [here] (http://www.sqlite.org/sqlite.html)) i byłem w stanie edytować i usunąć jedną z tych rekordów . Jeśli masz mały przykładowy plik SQLite, który możesz udostępnić przez [wikisend.com] (http://wikisend.com) (lub podobny), mógłbym zobaczyć, czy zachowuje się inaczej dla mnie. –

+0

tutaj jest link do mojego pliku. https://www.dropbox.com/s/2o68md7fd1vvr7b/qaqc.sqlite – Herrozerro

4

Ja też miałem ten problem. Mam tabelę z kluczem podstawowym w polu VARCHAR (30) (TEXT).

Dodanie kolumny INTEGER PRIMARY KEY nie pomogło w ogóle. Po wielu testach odkryłem, że problem dotyczy pola DATETIME, które miałem w tabeli. Usunąłem pole DATETIME i mogłem zaktualizować wartości rekordów w widoku arkusza danych MS Access.

Teraz wszystkie pola DATETIME, których potrzebuję w SQLite, deklaruję jako VARCHAR (19), więc niektórzy uzyskują dostęp poprzez ODBC jako tekst. Nie doskonały, ale działa. (I oczywiście SQLite nie ma prawdziwego pola typu DATETIME, tak więc TEKST jest w porządku i przekonwertuje OK)

Potwierdziłem, że jest to problem z konwersją numerów. Z pustego pola daty, mogę dodać czas 01-01-2014 12:01:02 poprzez dostęp widoku arkusza danych, gdybym wtedy spojrzeć na wartości w SQLite sekundy zostały zaokrąglone: ​​

sqlite> SELECT three from TEST where FLoc='1020'; 
2014-01-01 12:01:00.000 

SYNCMODE powinien być również NORMALNY, a nie WYŁĄCZONY.

Aktualizacja: Jeśli masz jakieś pól tekstowych o określonej długości (np foo VARCHAR (10)) i zawartości pól zawiera więcej znaków niż definicja pola (co pozwala SQLite) MS-Access będzie również barf kiedy próbuje zaktualizować dowolne pól w tym wierszu.

+0

Miałem ten sam problem i obejściło obejście D.Peters. przejście od DATETIME do VARCHAR (19) jest rozwiązaniem. Wielkie dzięki. – cetipabo

0

Przeszukałem wszystkie podobne posty, ponieważ miałem podobny problem z SQLite połączonym przez ODBC z Access. Miałem trzy stoły, z których dwa były dozwolone, ale trzeci nie. Trzeci miał pole DATETIME i kiedy zmieniłem typ danych na pole TEXT w oryginalnej bazie danych SQLite i zsynchronizowałem się z dostępem, mogłem edytować tabelę. Tak więc dla mnie zostało to potwierdzone jako problem z polem DATETIME.