> hi, > i noticed something in my test with Connection.Edit() (sqlite3): > i created a table with connection.exec() > > hConnection.Exec("create table test(id integer primary key, name > varchar(10));") > > then inserted some data > hConnection.Exec("insert into test(name) values(\"Aaron\");") > hConnection.Exec("insert into test(name) values('Zacharias');") > > now, because i thought, this is the only way to prevent the error "table > test has no primary key", i set the primary key property of the table > object: > hConnection.Tables["test"].PrimaryKey = ["id"] > > not this brought me "Read-only property". > is this because i created the table via exec() and there is no > synchronization (possible)? > > regards, > tobi >
You can't update the primary index of a table once it has been created anyway. I have understood where the bug with primary key comes from. It is just a matter of case: write "integer" in upper case, and the database driver will detect the primary key! To understand all that, you must be aware that SQLite is a non-typed database, i.e. the field datatypes given in the CREATE TABLE statement are mostly ignored. A SQLite field can hold any datatype, whatever its definition! "Mostly", because there is a big exception: if you declare a field as "integer primary key", you actually declare a 64 bits integer-only field that will increment automatically as each record creation. And this special primary key does not appear in the index list returned by SQLite (because it is actually an index present in each table, named "rowid"). See http://www.sqlite.org/lang_createtable.html for more information. To detect it, I added a test on the table SQL declaration: if I don't see any index in the table, and if the table has an integer field, I assume it is the primary key. The test is not perfect yet (a table could have an "integer" field and no primary key), but, more important, it was buggy, as it assumed that "integer" was written in upper case! I will fix that in the next revision, and your "id integer primary key" will be correctly detected as the primary key of the table. Note that if you create your table by using the Gambas interface, and not by sending "CREATE TABLE" statements directly, you won't have the problem, because Gambas only uses "integer" when creating an autoincrement integer field. For all other integer fields, it uses "INT4". Regards, -- Benoît Minisini ------------------------------------------------------------------------------ What happens now with your Lotus Notes apps - do you make another costly upgrade, or settle for being marooned without product support? Time to move off Lotus Notes and onto the cloud with Force.com, apps are easier to build, use, and manage than apps on traditional platforms. Sign up for the Lotus Notes Migration Kit to learn more. http://p.sf.net/sfu/salesforce-d2d _______________________________________________ Gambas-user mailing list Gambas-user@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/gambas-user