/ Forside / Teknologi / Udvikling / ASP / Nyhedsindlæg
Login
Glemt dit kodeord?
Brugernavn

Kodeord


Reklame
Top 10 brugere
ASP
#NavnPoint
smorch 9259
Harlekin 1866
molokyle 1040
Steffanst.. 758
gandalf 657
smilly 564
gibson 560
cumano 530
MouseKeep.. 480
10  Random 410
Læse med dato fra access-db?
Fra : Peter [5260]


Dato : 08-03-05 00:08

Hej,
Jeg havde følgende stump kode hos min gamle ISP (Azero), hvor det virkede
fint (Access-db):

timestmp = now()
strSQL = "INSERT INTO tbBestilling ("
strSQL = strSQL & "TimeStmp, "
strSQL = strSQL & "BrugerID, "
strSQL = strSQL & "Vare, "
strSQL = strSQL & "HenvKode) "
strSQL = strSQL & "VALUES ('"
strSQL = strSQL & timestmp & "', '"
strSQL = strSQL & rs("BrugerID") & "', '"
strSQL = strSQL & "OA" & "', '"
strSQL = strSQL & hk & "')"
Connbr.Execute(strSQL)
'### Læs bestillingen igen for at få BestilID
strSQL = "SELECT * FROM tbBestilling WHERE TimeStmp = #" & timestmp &
"#"
response.write "SQL=[" & strSQL & "]"
Set rs = Connbr.Execute(strSQL)
bid = rs("BestilID")

Efter jeg er flyttet til Danhost, melder den fejl i SQL-sætningen.
Jeg har prøvet at udskifte # med ping (') og ingenting, men det hjælper
ikke!

Brug af ingenting:
SQL=[SELECT * FROM tbBestilling WHERE TimeStmp = 07-03-2005 23:49:34]
Microsoft OLE DB Provider for ODBC Drivers error '80040e14'
[Microsoft][ODBC Microsoft Access Driver] Syntax error (missing operator) in
query expression 'TimeStmp = 07-03-2005 23:49:34'.

Brug af #:
SQL=[SELECT * FROM tbBestilling WHERE TimeStmp = #07-03-2005 23:51:41#]
ADODB.Field error '800a0bcd'
Either BOF or EOF is True, or the current record has been deleted. Requested
operation requires a current record.

Brug af ping ('):
SQL=[SELECT * FROM tbBestilling WHERE TimeStmp = '07-03-2005 23:58:09']
Microsoft OLE DB Provider for ODBC Drivers error '80040e07'
[Microsoft][ODBC Microsoft Access Driver] Data type mismatch in criteria
expression.

Feltet TimeStmp er af typen vbGeneralDate = standarddatoformat
INSERT'en går godt, og datoen bliver også skrevet fint nok til databasen.

Men hvad går der galt her?...hvad skal TimeStmp pakkes ind i for at det
virker?
Er der ingen generelle regler for læsning med dato i en SELECT?

På forhånd tak
Peter



 
 
Jens Gyldenkærne Cla~ (08-03-2005)
Kommentar
Fra : Jens Gyldenkærne Cla~


Dato : 08-03-05 10:57

Peter [5260] skrev:

> timestmp = now()

Vi tager den lige igen (beklager, men dette spørgsmål har været her
*mange* gange).

Skal man indsætte dags dato (med eller uden tid) i en database, så gøres
det bedst ved at lade databasen generere datoværdien. Altid. Hver gang.

Din nuværende kode lader asp-parseren generere en datoværdi som du så
overfører til databasen i form af en tekststreng. Derfor er datoværdien
ikke entydig - den kan opfattes som mm/dd/yyyy eller dd/mm/yyyy - og det
kan let gå galt.

Hvis feltet TimeStmp altid skal have værdien "dags dato" ved nye poster,
så sæt feltets standardværdi til now() - så behøver man slet ikke gøre
mere ved indsættelser.

Hvis man vil angive værdien ved indsættelse, så brug databasens funktion
(i Access er det Now(), præcis som i asp). Se forskellen på følgende to
sætninger:

Forkert!
strSQL = "INSERT INTO tabel (datofelt) VALUES ('" & Now() & "')"

Rigtigt:
strSQL = "INSERT INTO tabel (datofelt) VALUES (Now())"

--
Jens Gyldenkærne Clausen
Svar venligst under det du citerer, og citer kun det der er
nødvendigt for at forstå dit svar i sammenhængen. Se hvorfor og
hvordan på http://usenet.dk/netikette/citatteknik.html

Peter [5260] (08-03-2005)
Kommentar
Fra : Peter [5260]


Dato : 08-03-05 13:46

Jens Gyldenkærne Clausen wrote:
> Peter [5260] skrev:
>
>
>> timestmp = now()
>
>
> Vi tager den lige igen (beklager, men dette spørgsmål har været her
> *mange* gange).
>
> Skal man indsætte dags dato (med eller uden tid) i en database, så gøres
> det bedst ved at lade databasen generere datoværdien. Altid. Hver gang.
>
[snip]
>
> Hvis man vil angive værdien ved indsættelse, så brug databasens funktion
> (i Access er det Now(), præcis som i asp). Se forskellen på følgende to
> sætninger:
>
> Forkert!
> strSQL = "INSERT INTO tabel (datofelt) VALUES ('" & Now() & "')"
>
> Rigtigt:
> strSQL = "INSERT INTO tabel (datofelt) VALUES (Now())"
>

Korrekt, jeg har set *afarter* af dette spørgsmål, men ikke helt
specifikt til den af mig beskrevne problematik....ellers beklager jeg meget!

Du har ret i, at ved at benytte db'ens datofunktion, så bliver data
entydige og konsistente - et must i enhvert databasedesign!

Problemet er blot, at jeg skal bruge denne dato til at læse den netop
skrevne record igen lige efter INSERT, og derfor skal jeg bruge feltet
TimeStmp udfyldt med now().

Teoretisk (og sikkert også i praksis) kan der jo godt gå et par sekunder
fra SQL-sætningen opbygges, til jeg laver den sidste SELECT.
Mon ikke den vil få en EOF/NotFound i 9 ud af 10 tilfælde, hvis jeg
benytter din metode til INSERT, og derefter laver en SELECT efter din
opskrift:
SELECT * FROM tbBestilling WHERE TimeStmp = " & now()
??

Det er naturligvis ikke efterprøvet, men jeg tror det!

Sååeeehh, du har forklaret en væsentlig - og meget efterspurgt -
problemstilling i ASP, men du har vist ikke svaret på mit spørgsmål

Mvh
Peter

Jens Gyldenkærne Cla~ (08-03-2005)
Kommentar
Fra : Jens Gyldenkærne Cla~


Dato : 08-03-05 15:22

Peter [5260] skrev:

> Problemet er blot, at jeg skal bruge denne dato til at læse den netop
> skrevne record igen lige efter INSERT, og derfor skal jeg bruge feltet
> TimeStmp udfyldt med now().

Hvis du skal bruge en unik nøgle til at hente posten igen, kan du tage
fat i session-id.

> Teoretisk (og sikkert også i praksis) kan der jo godt gå et par sekunder
> fra SQL-sætningen opbygges, til jeg laver den sidste SELECT.

Bestemt.

> Mon ikke den vil få en EOF/NotFound i 9 ud af 10 tilfælde, hvis jeg
> benytter din metode til INSERT, og derefter laver en SELECT efter din
> opskrift:
> SELECT * FROM tbBestilling WHERE TimeStmp = " & now()

Den metode ville jeg heller ikke anvende. I princippet risikerer du også
en fejl hvis to kunder indsætter en post i samme sekund.
Hvis man har brug for at hive den post man indtaster ud igen, kan man
som nævnt ovenfor benytte sessionID (evt. med TOP 1 hvis der kan
indsættes flere i samme session). En anden mulighed er at benytte en
cursor til at tilføje posten - og så hente id-nummeret herfra:

sql = "SELECT * FROM tabel WHERE 1 = 2"
set rs = conn.execute(sql)
rs.AddNew ' (eller måske rs.Add - kan jeg ikke huske)
rs("felt1") = felt1
....
rs.Update
id = rs("idfelt")


--
Jens Gyldenkærne Clausen
Svar venligst under det du citerer, og citer kun det der er
nødvendigt for at forstå dit svar i sammenhængen. Se hvorfor og
hvordan på http://usenet.dk/netikette/citatteknik.html

Peter [5260] (08-03-2005)
Kommentar
Fra : Peter [5260]


Dato : 08-03-05 15:59

Jens Gyldenkærne Clausen wrote:
>
> Hvis du skal bruge en unik nøgle til at hente posten igen, kan du tage
> fat i session-id.
>
> Hvis man har brug for at hive den post man indtaster ud igen, kan man
> som nævnt ovenfor benytte sessionID (evt. med TOP 1 hvis der kan
> indsættes flere i samme session). En anden mulighed er at benytte en
> cursor til at tilføje posten - og så hente id-nummeret herfra:
>
> sql = "SELECT * FROM tabel WHERE 1 = 2"
> set rs = conn.execute(sql)
> rs.AddNew ' (eller måske rs.Add - kan jeg ikke huske)
> rs("felt1") = felt1
> ...
> rs.Update
> id = rs("idfelt")
>

Tak for svar (og tålmodighed!).

SessionID er absolut en mulighed, og at lave en rs.Update har jeg ikke
forsøgt endnu, så den vil også blive afprøvet snarest.

Mvh
Peter

Søg
Reklame
Statistik
Spørgsmål : 177548
Tips : 31968
Nyheder : 719565
Indlæg : 6408803
Brugere : 218887

Månedens bedste
Årets bedste
Sidste års bedste