Herrozerro
Herrozerro

Reputation: 1681

Updating an SQLite database via an ODBC linked table in Access

I am having an issue with an SQLite database. I am using the SQLite ODBC from http://www.ch-werner.de/sqliteodbc/ Installed the 64-bit version and created the ODBC with these settings:

enter image description here

I open my Access database and link to the datasource. I can open the table, add records, but cannot delete or edit any records. Is there something I need to fix on the ODBC side to allow this? The error I get when I try to delete a record is:

The Microsoft Access database engine stopped the process because you and another user are attempting to change the same data at the same time.

When I edit a record I get:

The record has been changed by another user since you started editing it. If you save the record, you will overwrite the changed the other user made.

Save record is disabled. Only copy to clipboard or drop changes is available.

Upvotes: 14

Views: 8583

Answers (5)

Brian Gonzalez
Brian Gonzalez

Reputation: 1354

I recently dealt with an issue where Access was not displaying any data for one of the columns in a linked table. It was odd because it wasn't working in Access and Power Query but it was working fine using DB Browser and the ADODB library.

After further inspection, the affected column whose data type should have been text was actually set to integer. After updating it to text from integer the issue was resolved.

Upvotes: 0

wmorgan
wmorgan

Reputation: 1

After running into this problem, not finding a satisfactory answer, and wasting a lot of time trying other solutions, I eventually discovered that what others have mentioned about DATETIME fields is accurate but another solution exists that lets you keep the proper data type. The SQLite ODBC driver can convert Julian day values into the ODBC SQL_TIMESTAMP / SQL_TYPE_TIMESTAMP types by looking for floating point values in the column, if you have that option enabled in the driver. Storing dates in this manner gives the ODBC timestamp value enough precision to avoid the write conflict error, as well as letting Access see the column as a date/time field.

Even storing sub-second precision in the date string doesn't work, which is possibly a bug in the driver because the resulting TIMESTAMP_STRUCT contains the same values, but the fractional seconds must be lost elsewhere.

Upvotes: 0

jroyce
jroyce

Reputation: 2148

I've searched all similar posts as I had a similar issue with SQLite linked via ODBC to Access. I had three tables, two of them allowed edits, but the third didn't. The third one had a DATETIME field and when I changed the data type to a TEXT field in the original SQLite database and relinked to access, I could edit the table. So for me it was confirmed as an issue with the DATETIME field.

Upvotes: 0

Gord Thompson
Gord Thompson

Reputation: 123549

My initial attempt to recreate your issue was unsuccessful. I used the following on my 32-bit test VM:

  • Access 2010
  • SQLite 3.8.2
  • SQLite ODBC Driver 0.996

I created and populated the test table [tbl1] as documented here. I created an Access linked table and when prompted I chose both columns ([one] and [two]) as the Primary Key. When I opened the linked table in Datasheet View I was able to add, edit, and delete records without incident.

The only difference I can see between my setup and yours (apart from the fact that I am on 32-bit and you are on 64-bit) is that in the ODBC DSN settings I left the Sync.Mode setting at its default value of NORMAL, whereas yours appears to be set to OFF.

Try setting your Sync.Mode to NORMAL and see if that makes a difference.

Edit re: comments

The solution in this case was the following:

One possible workaround would be to create a new SQLite table with all the same columns plus a new INTEGER PRIMARY KEY column which Access will "see" as AutoNumber. You can create a unique index on (what are currently) the first four columns to ensure that they remain unique, but the new new "identity" (ROWID) column is what Access would use to identify rows for CRUD operations.

Upvotes: 10

D.Peters
D.Peters

Reputation: 101

I had this problem too. I have a table with a primary key on a VARCHAR(30) (TEXT) field.

Adding an INTEGER PRIMARY KEY column didn't help at all. After lots of testing I found the issue was with a DATETIME field I had in the table. I removed the DATETIME field and I was able to update record values in MS-Access datasheet view.

So now any DATETIME fields I need in SQLite, I declare as VARCHAR(19) so they some into Access via ODBC as text. Not perfect but it works. (And of course SQLite doesn't have a real DATETIME field type anyway so TEXT is just fine and will convert OK)

I confirmed it's a number conversion issue. With an empty DATETIME field, I can add a time of 01-01-2014 12:01:02 via Access's datasheet view, if I then look at the value in SQLite the seconds have been rounded off:

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

SYNCMODE should also be NORMAL not OFF.

Update: If you have any text fields with a defined length (e.g. foo VARCHAR(10)) and the field contents contains more characters than the field definition (which SQLite allows) MS-Access will also barf when trying to update any of the fields on that row.

Upvotes: 4

Related Questions