Lazarus 3.0 (2023.12.21.)
Letöltés

  • Oldal:
  • 1

TÉMA:

Access 2003 adatbázis, auto increment mező 2017 jan. 17 16:02 #2151

  • Hozso
  • Hozso profilkép Témaindító
  • Haladó forumozó
  • Haladó forumozó
  • Hozzászólások: 33
  • Köszönetek: 0
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.

Access 2003 adatbázis, auto increment mező 2017 jan. 17 04:00 #2150

  • Gábor
  • Gábor profilkép
  • Adminisztrátor
  • Adminisztrátor
  • Hozzászólások: 499
  • Köszönetek: 86
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!)
Hogyan kérdezzünk okosan? / Mit kell tennünk kérdezés előtt? -- Lazarus 3.0 -- FPC 3.2-- GNU/Linux 5.15.0 x86_64

Access 2003 adatbázis, auto increment mező 2017 jan. 17 01:26 #2149

  • Hozso
  • Hozso profilkép Témaindító
  • Haladó forumozó
  • Haladó forumozó
  • Hozzászólások: 33
  • Köszönetek: 0
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 }

Access 2003 adatbázis, auto increment mező 2017 jan. 16 21:48 #2148

  • Gábor
  • Gábor profilkép
  • Adminisztrátor
  • Adminisztrátor
  • Hozzászólások: 499
  • Köszönetek: 86
A hibaüzenet és a forráskód (pas+sql) érintett részeit is ismertesd velünk!
Hogyan kérdezzünk okosan? / Mit kell tennünk kérdezés előtt? -- Lazarus 3.0 -- FPC 3.2-- GNU/Linux 5.15.0 x86_64

Access 2003 adatbázis, auto increment mező 2017 jan. 16 14:56 #2147

  • Hozso
  • Hozso profilkép Témaindító
  • Haladó forumozó
  • Haladó forumozó
  • Hozzászólások: 33
  • Köszönetek: 0
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.

Access 2003 adatbázis, auto increment mező 2017 jan. 16 14:39 #2146

  • Gábor
  • Gábor profilkép
  • Adminisztrátor
  • Adminisztrátor
  • Hozzászólások: 499
  • Köszönetek: 86
AUTO INCREMENT mezőt nem lehet írni, annak értékét az adatbazis motorja automatikusan határozza meg (növeli)
Hogyan kérdezzünk okosan? / Mit kell tennünk kérdezés előtt? -- Lazarus 3.0 -- FPC 3.2-- GNU/Linux 5.15.0 x86_64

Access 2003 adatbázis, auto increment mező 2017 jan. 16 09:52 #2145

  • Hozso
  • Hozso profilkép Témaindító
  • Haladó forumozó
  • Haladó forumozó
  • Hozzászólások: 33
  • Köszönetek: 0
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.)

  • Oldal:
  • 1