[Delphi] Landinstellingen en database

Pagina: 1
Acties:
  • 177 views sinds 30-01-2008
  • Reageer

  • jelmervos
  • Registratie: Oktober 2000
  • Niet online

jelmervos

Simple user

Topicstarter
Misschien beetje vaag onderwerp, maar wist ff niks beters. :)

Ik haal bet behulp van een Query wat gegevens uit een database. Als ik deze uitlees krijg ik automatisch het goede formaat voor getallen en data's zoals ik heb ingesteld bij Landinstellingen.
Maar nu gebruik ik een aantal van die gegevens weer voor een query in dezelfde database. Dan pikt de database dus geen komma's, data met een streepje, enz.

Hoe los ik dit een beetje goed op. Zodat de gegevens uit een query weer kan gebruiken voor een nieuwe query?

"The shell stopped unexpectedly and Explorer.exe was restarted."


Verwijderd

Queries parameteriseren.
Dus niet:
'select * from Tabel where Datum = ''' + FormatDateTime('dd/mm/yyyy', dDate) + ''''

maar:
'select * from Tabel where Datum = :Datum'
en dan
ParamByName('Datum').AsDateTime := dDate

  • jelmervos
  • Registratie: Oktober 2000
  • Niet online

jelmervos

Simple user

Topicstarter
Bedankt, zal er vandaag eens naar kijken. Ik denk wel dat het zo gaat lukken. :)

"The shell stopped unexpectedly and Explorer.exe was restarted."


  • jelmervos
  • Registratie: Oktober 2000
  • Niet online

jelmervos

Simple user

Topicstarter
Ik heb het goed werkend gekregen. Al moest ik wel voor de INSERT query dit doen:
code:
1
2
  DateSeparator := '/';
  DecimalSeparator := '.';

En later weer terug zetten.

"The shell stopped unexpectedly and Explorer.exe was restarted."


  • whoami
  • Registratie: December 2000
  • Laatst online: 00:01
Op donderdag 29 november 2001 17:30 schreef jelmervos het volgende:
Ik heb het goed werkend gekregen. Al moest ik wel voor de INSERT query dit doen:
code:
1
2
  DateSeparator := '/';
  DecimalSeparator := '.';

En later weer terug zetten.
Zo kun je het wel oplossen, maar wat als je de landinstellingen veranderd? Of als je die applicatie op een andere pc installeert?

https://fgheysels.github.io/


  • jelmervos
  • Registratie: Oktober 2000
  • Niet online

jelmervos

Simple user

Topicstarter
Op donderdag 29 november 2001 18:56 schreef whoami het volgende:

[..]

Zo kun je het wel oplossen, maar wat als je de landinstellingen veranderd? Of als je die applicatie op een andere pc installeert?
Bij mijn landinstellingen staat een komma als decimaal scheidings teken. Maar de database die ik gebruik wil een punt. Als ik een SELECT op die database doe krijg ik toch een komma (of wat ik maar instel bij Landinstellingen). Doe ik vervolgens een INSERT met gegevens die ik uit de SELECT heb gehaald erin dan pikt hij dit niet.

"The shell stopped unexpectedly and Explorer.exe was restarted."


  • jelmervos
  • Registratie: Oktober 2000
  • Niet online

jelmervos

Simple user

Topicstarter
Ik heb al wel ondekt dat dit is aan te passen in de BDE Administrator. Maar om dat nou bij de klant steeds te moeten doen?

Hoe hebben jullie die opgelost?

"The shell stopped unexpectedly and Explorer.exe was restarted."


  • Onno
  • Registratie: Juni 1999
  • Niet online
Wat dacht je van de oplossing van Afterlife?

  • jelmervos
  • Registratie: Oktober 2000
  • Niet online

jelmervos

Simple user

Topicstarter
Op donderdag 29 november 2001 23:31 schreef Onno het volgende:
Wat dacht je van de oplossing van Afterlife?
Die kan ik niet echt plaatsen in mijn probleemstelling:

Eerst een SELECT: krijg datum/komma getallen terug zoals ingesteld bij Landinstellingen. Prima verder.

Met die waarden een INSERT doen: database wil waarden met punten (komma getallen) en slashes (datum).

"The shell stopped unexpectedly and Explorer.exe was restarted."


  • Onno
  • Registratie: Juni 1999
  • Niet online
Op donderdag 29 november 2001 23:43 schreef jelmervos het volgende:
Die kan ik niet echt plaatsen in mijn probleemstelling:

Eerst een SELECT: krijg datum/komma getallen terug zoals ingesteld bij Landinstellingen. Prima verder.
Dan moet je de datum ook niet met .asString opvragen, maar met .asDate. :)

  • jelmervos
  • Registratie: Oktober 2000
  • Niet online

jelmervos

Simple user

Topicstarter
Op donderdag 29 november 2001 23:47 schreef Onno het volgende:

[..]

Dan moet je de datum ook niet met .asString opvragen, maar met .asDate. :)
En dan een formate date gebruiken in de INSERT? Maar dan gebruikt hij nog de Landinstellingen van Windows, mits ik dus die DateSeperator e.d. wijzig.

"The shell stopped unexpectedly and Explorer.exe was restarted."


  • Creepy
  • Registratie: Juni 2001
  • Laatst online: 16-09 18:04

Creepy

Tactical Espionage Splatterer

Decodedate en encodedate?

Alles opvragen m.b.v. .asdate o.i.d. Dan met de decode date het jaar, maand, dag etc. uit elkaar trekken. Dit de gebruiker ergens laten bewerken, er daarna met encodedate weet een tdate van maken, en deze weer in de database schrijven. (dus gewoon met die .asdate, dan laat je het de BDE lekker zelf uitzoeken wat er in de DB geschreven moet worden).

"I had a problem, I solved it with regular expressions. Now I have two problems". That's shows a lack of appreciation for regular expressions: "I know have _star_ problems" --Kevlin Henney


  • Onno
  • Registratie: Juni 1999
  • Niet online
Op vrijdag 30 november 2001 09:07 schreef jelmervos het volgende:
En dan een formate date gebruiken in de INSERT? Maar dan gebruikt hij nog de Landinstellingen van Windows, mits ik dus die DateSeperator e.d. wijzig.
Eh? Als jij gewoon met TDate's werkt, heb je toch helemaal niks te maken met die datumformatteringsmeuk?

  • jelmervos
  • Registratie: Oktober 2000
  • Niet online

jelmervos

Simple user

Topicstarter
Op vrijdag 30 november 2001 10:42 schreef Onno het volgende:

[..]

Eh? Als jij gewoon met TDate's werkt, heb je toch helemaal niks te maken met die datumformatteringsmeuk?
Da's misschien wel waar.

En hoe zit het dan met die decimale punt, precies hetzelfde zeker?

"The shell stopped unexpectedly and Explorer.exe was restarted."


  • Onno
  • Registratie: Juni 1999
  • Niet online
Jup. :)

  • jelmervos
  • Registratie: Oktober 2000
  • Niet online

jelmervos

Simple user

Topicstarter
Op vrijdag 30 november 2001 10:48 schreef Onno het volgende:
Jup. :)
Mooi, zal er vanmiddag even mee bezig. Iig bedankt Onno! :)

"The shell stopped unexpectedly and Explorer.exe was restarted."


  • jelmervos
  • Registratie: Oktober 2000
  • Niet online

jelmervos

Simple user

Topicstarter
Uhm, kom er toch niet echt uit. Misschien kan iemand mij een beetje opweg helpen met een duidelijk voorbeeld. Dus eerst een SELECT en met een aantal van die gegevens een INSERT query uitvoeren.

De INSERT query moet een string zijn.
De SELECT query kan wel een TDateTime terug geven (met die AsDate) maar zodat ik deze in de INSERT query wil gebruiken moet ik hem naar een string omzetten. Hierbij worden dus de schiedingstekens van de datum automatisch veranderd zoals ingesteld bij de Landinstellingen. Toch wil de database dit formaat hebben bij een INSERT query: mm/dd/yyyy

"The shell stopped unexpectedly and Explorer.exe was restarted."


  • Onno
  • Registratie: Juni 1999
  • Niet online
Op vrijdag 30 november 2001 16:20 schreef jelmervos het volgende:
De SELECT query kan wel een TDateTime terug geven (met die AsDate) maar zodat ik deze in de INSERT query wil gebruiken moet ik hem naar een string omzetten.
Oh? Als je doet wat Afterlife suggereert hoef je je TDateTime nergens naar een string om te zetten hoor.

  • jelmervos
  • Registratie: Oktober 2000
  • Niet online

jelmervos

Simple user

Topicstarter
Op vrijdag 30 november 2001 16:24 schreef Onno het volgende:

[..]

Oh? Als je doet wat Afterlife suggereert hoef je je TDateTime nergens naar een string om te zetten hoor.
Hoe kan ik dan ooit die INSERT doen. TQuery.SQL is toch echt van het type TStrings. Dus als ik TQuery.SQL.Text gebruik moet ik toch echt een String opgeven.

Of doe ik nu weer iets geheel verkeerd?

"The shell stopped unexpectedly and Explorer.exe was restarted."


  • Onno
  • Registratie: Juni 1999
  • Niet online
Op donderdag 29 november 2001 08:34 schreef Afterlife het volgende:
'select * from Tabel where Datum = :Datum'
Dat wordt dus Query.SQL. (in jouw geval iets als 'insert into blabla values (:Datum)')
en dan
ParamByName('Datum').AsDateTime := dDate
En daarna doe je dat om de waarde van de parameter :Datum in te vullen.

Wat snap je daar niet aan?

  • jelmervos
  • Registratie: Oktober 2000
  • Niet online

jelmervos

Simple user

Topicstarter
Op vrijdag 30 november 2001 16:51 schreef Onno het volgende:

Wat snap je daar niet aan?
Niks, bedankt voor de uitleg! Het is gelukt. :)

Ik wist niet dat je gewoon :PARAM in een SQL kon stoppen en die parsen met ParamByName. Geweldig!

"The shell stopped unexpectedly and Explorer.exe was restarted."


Verwijderd

Parameters hebben wel meer voordelen...
Bij client/server databases als Oracle, MSSQL, SyBase, InterBase, DB2, etc. geef je daarmee de database de mogelijkheid om een query te optimaliseren. De query blijft nl. steeds hetzelfde, en de database kan dan z'n eigen meest optimale PLAN uitbroeden (welke indexen te gebruiken, etc.).

Wanneer je zelf de parameter waarden al invult, is de query steeds anders, en heeft de database geen profijt van eerder verzamelde statistiek-gegevens.

De snelheidswinst die je daarmee haalt is meestal niet dramatisch, maar kan toch soms (moeilijke joins of selecties met veel voorwaarden in de where clause) wel een procent of 30 zijn. Maar dan moeten de indexen waar 'ie profijt van kan hebben al wel bestaan, natuurlijk. :)
Pagina: 1