Lazarus 2.0.10 (2020.07.11.)
Letöltés

file Access 2003 adatbázis, auto increment mező

  • Hozso
  • Hozso profilkép
  • Új fórumozó
  • Új fórumozó
  • Hozzászólások: 13
  • Köszönetek: 0

Hozso válaszolt a témára: Access 2003 adatbázis, auto increment mező

Közben került megoldás: INSERT - SELECT utasítást kell használjak a mezőnevek felsorolásával, az ID mező kihagyása nélkül. Jó lett volna az eredeti megoldást használni, mert akkor nem kellene minden mezőnevet felsorolnom, dehát ez van.
#2151

  • Gábor
  • Gábor profilkép
  • Adminisztrátor
  • Adminisztrátor
  • Hozzászólások: 432
  • Karma: 8
  • Köszönetek: 70

Gábor válaszolt a témára: Access 2003 adatbázis, auto increment mező

Nekem úgy tűnik mintha már eleve (ID mező nélkül is) több mezőt adnál meg (próbálnál írni), mint amennyit lehet.

(Forráskódot soha ne kipontozva idézz, mert lehet, hogy épp ott van a hiba!)
#2150

  • Hozso
  • Hozso profilkép
  • Új fórumozó
  • Új fórumozó
  • Hozzászólások: 13
  • Köszönetek: 0

Hozso válaszolt a témára: Access 2003 adatbázis, auto increment mező

Ha kihagyom a paraméterek közül az ID, akkor a következő az üzenet:

Could not execute statement. ODBC error details: last return code: SQL Error Record 1: SQL State: 21S01; Native Error -3520; Message: [Microsoft] ODBC Microsoft Access illesztőprogram A kérések száma és a célmezők száma nem egyezik meg;

A program ekkor így néz ki:

SQLQuery.SQL.Text:=SQLQuery.SQL.Text + 'values (:dt1,:dt2,:m159, ...

SQLQuery.ParamByName('dt1').AsDateTime := dtBufStartDateTimeArray[iI];
// SQLQuery.ParamByName('id').AsLargeInt;
SQLQuery.ParamByName('dt2').AsDateTime := dtBufStartDateTimeArray[iI];
SQLQuery.ParamByName('m159').AsFloat := Conv_0_1_UnSigned(bBufMSBRec_2Array[iI,318],bBufMSBRec_2Array[iI,319]); { MSB DM 6159 }
...


Ha az ID mezőnek NULL értéket próbálok adni, akkor pedig:

Could not execute statement. ODBC error details: last return code: SQL Error Record 1: SQL State: 23000; Native Error -1504; Message: [Microsoft] ODBC Microsoft Access illesztőprogram Egy Variant típusú változónak próbált meg értéket adni;

A program ekkor így néz ki:
SQLQuery.SQL.Text:=SQLQuery.SQL.Text + 'values (:dt1,NULL, :dt2,:m159, ...

SQLQuery.ParamByName('dt1').AsDateTime := dtBufStartDateTimeArray[iI];
// SQLQuery.ParamByName('id').AsLargeInt;
SQLQuery.ParamByName('dt2').AsDateTime := dtBufStartDateTimeArray[iI];
SQLQuery.ParamByName('m159').AsFloat := Conv_0_1_UnSigned(bBufMSBRec_2Array[iI,318],bBufMSBRec_2Array[iI,319]); { MSB DM 6159 }
#2149

  • Gábor
  • Gábor profilkép
  • Adminisztrátor
  • Adminisztrátor
  • Hozzászólások: 432
  • Karma: 8
  • Köszönetek: 70

Gábor válaszolt a témára: Access 2003 adatbázis, auto increment mező

A hibaüzenet és a forráskód (pas+sql) érintett részeit is ismertesd velünk!
#2148

  • Hozso
  • Hozso profilkép
  • Új fórumozó
  • Új fórumozó
  • Hozzászólások: 13
  • Köszönetek: 0

Hozso válaszolt a témára: Access 2003 adatbázis, auto increment mező

Közben másik fórumon odáig jutottam, hogy az általam linkelt leírás MySQL-re (vagy mire... de lényeg, hogy nem Access-re) vonatkozik. Az Access azt írja, hogy az autoNum mezőt nem kell beírni,ki kell hagyni a paraméterek közül. Ha kihagyom, akkor viszont ugyanúgy hibajelzést kapok.

msdn.microsoft.com/en-us/library/bb208861(v=office.12).aspx


INSERT INTO Statement (Microsoft Access SQL) [Access 2007 Developer Reference]

Azt mondja:
"
INSERT INTO Statement (Microsoft Access SQL)

Office 2007
Remarks

... When you do not specify each field, the default value or Null is inserted for missing columns. Records are added to the end of the table. ...

...If your destination table contains a primary key, make sure you append unique, non-Null values to the primary key field or fields; if you do not, the Microsoft Access database engine will not append the records.

If you append records to a table with an AutoNumber field and you want to renumber the appended records, do not include the AutoNumber field in your query. Do include the AutoNumber field in the query if you want to retain the original values from the field."

E szerint valóban nem kellene megadnom az azonosító mezőt az INSERT-ben. De mégis szól érte futás közben, hogy nem stimmel a beírandó mezők száma.
#2147

  • Gábor
  • Gábor profilkép
  • Adminisztrátor
  • Adminisztrátor
  • Hozzászólások: 432
  • Karma: 8
  • Köszönetek: 70

Gábor válaszolt a témára: Access 2003 adatbázis, auto increment mező

AUTO INCREMENT mezőt nem lehet írni, annak értékét az adatbazis motorja automatikusan határozza meg (növeli)
#2146

  • Hozso
  • Hozso profilkép
  • Új fórumozó
  • Új fórumozó
  • Hozzászólások: 13
  • Köszönetek: 0

Hozso létrehozta a témát: Access 2003 adatbázis, auto increment mező

Készítettem egy Access 2003 adatbázist. Az első mező dátum/idő, a második egy autoincrement mező kellene, hogy legyen (a neve 'ID'). Az adatbázist Access 2010-ben hoztam létre, ott végzem el a módosításokat. Tehát nem a felhasználói programomból akarom létrehozni. A programomból csak beírni fogok. (Ez egy mezei adatgyűjtő alkalmazás.) A következőket találtam a neten:

www.cubrid.org/wiki_tutorials/entry/how-to-insert-data-into-tables-with-auto_increment-columns

stackoverflow.com/questions/12609621/insert-an-auto-incremented-primary-key-into-an-access-table

A problémám az, hogy amikor a Lazarus programból be akarom írni a következő sort, akkor egyszerűen nem hajlandó az ID mezőt írni! A mező típusa: számláló. Mérete: hosszú egész, új érték: Növekvő, Indexelt: igen (nem lehet azonos). Próbáltam ezt a mezőt elsődleges kulcsnak beállítani és próbáltam úgy is, hogy nem elsődleges kulcs. A második linken lévő cikk azt mondja, hogy az adattípust "AutoNumber"-re kell állítani. Én ilyet nem találok a magyar nyelvű Access-ben. (Lehet, hogy ezt nem veszem észre???)

A programomban így írok (írnék) ki egy sort az adatbázisba (részlet):

SQLQuery.SQL.Text:=SQLQuery.SQL.Text + 'values (:dt1,:id ,:m159,:m160);';


SQLQuery.ParamByName('dt1').AsDateTime := dtBufStartDateTimeArray[iI];
SQLQuery.ParamByName('id').AsLargeInt := 0; *
SQLQuery.ParamByName('m159').AsFloat := Conv_0_1_UnSigned(bBufMSBRec_2Array[iI,318],bBufMSBRec_2Array[iI,319]); { MSB DM 6159 }
SQLQuery.ParamByName('m160').AsFloat := Conv_0_1_UnSigned(bBufMSBRec_2Array[iI,320],bBufMSBRec_2Array[iI,321]); { MSB DM 6160 }


*: Próbáltam úgy is, hogy az ':id' helyett NULL-t adok meg.


Az eredmény mindig valamilyen hibaüzenet. Hol van a kutya elásva?

(Mielőtt bele akartam volna applikálni az adatbázisba ezt az azonosító mezőt, az adatbázisba mentés működött, tehát a program többi része valószínűleg megfelelően működik.)
#2145