Zeos7 und MSSQL - DATETIME Felder

Für Themen zu Datenbanken und Zugriff auf diese. Auch für Datenbankkomponenten.
Antworten
MmVisual
Beiträge: 1581
Registriert: Fr 10. Okt 2008, 23:54
OS, Lazarus, FPC: Winuxarm (L 4 FPC 3.2.2)
CPU-Target: 32/64Bit

Zeos7 und MSSQL - DATETIME Felder

Beitrag von MmVisual »

Hallo,
Meine EXE funktioniert gut mit SQLite, MySQL und PostgreSQL. Nun wollte ich auch MSSQL unterstützen. Soweit werden die Daten auch gezeigt, aber beim Feld "DATETIME" kann Zeos nicht posten.
ich mache einen Insert und TZSQLMonitor zeit mir den SQL Befehl der generiert wurde:

INSERT INTO "elelatest"."dbo"."param" (ParNr,AendDatum) VALUES (3,'2013.03.19 14:40:50:423')

Wenn ich das in die SQL Eingabe von MSSQL eingebe, dann gibt es Mecker, da das Datumsformat falsch ist. Aber das funktioniert:
INSERT INTO "elelatest"."dbo"."param" (ParNr,AendDatum) VALUES (3,'2013-19-03 14:40:50.423')

Nun die Frage: Wie kann ich Zeos parametrieren, dass für alle Datumsfehler eine andere Formatierung zu verwenden ist?
Auch sollten die Spaltennamen in " gesetzt werden, was ich auch noch nicht herausgefunden habe.

Weiß jemand Rat?

Grüße Markus.
EleLa - Elektronik Lagerverwaltung - www.elela.de

Antrepolit
Beiträge: 340
Registriert: Di 12. Sep 2006, 08:57
OS, Lazarus, FPC: Winux (L 0.9.xy FPC 2.2.z)
CPU-Target: xxBit
Kontaktdaten:

Re: Zeos7 und MSSQL - DATETIME Felder

Beitrag von Antrepolit »

Es ist nie ratsam, Datümer als Strings in der VALUES-Klausel einzubringen. Bei Oracle gibt es deshalb die TO_DATE()-Funktion. Leider verwenden gängige Beispiele diese Funktion oft nicht. MSSQL sollte ein Pendant dazu haben. Dieses sollte dann auch verwendet werden. Mein Professor schüttelte immer den Kopf über solche Datum-Inserts ohne die passende Funktion, weil sie eben stark von der Localization der Datenbank abhängig sind.

Ist das ein Tippfehler?

Code: Alles auswählen

INSERT INTO "elelatest"."dbo"."param" (ParNr,AendDatum) VALUES (3,'2013.03.19 14:40:50[b][u]:[/u][/b]423')
 
Wenn ich das in die SQL Eingabe von MSSQL eingebe, dann gibt es Mecker, da das Datumsformat falsch ist. Aber das funktioniert:
INSERT INTO "elelatest"."dbo"."param" (ParNr,AendDatum) VALUES (3,'2013-19-03 14:40:50[b][u].[/u][/b]423')
Grüße, Antrepolit

care only if your os is really burning

MmVisual
Beiträge: 1581
Registriert: Fr 10. Okt 2008, 23:54
OS, Lazarus, FPC: Winuxarm (L 4 FPC 3.2.2)
CPU-Target: 32/64Bit

Re: Zeos7 und MSSQL - DATETIME Felder

Beitrag von MmVisual »

Der Punkt/Doppelpunkt am Ende interessiert nicht, es ist das Datum und die Reihenfolge der Werte.

Ich habe das mal abgeändert, ob das gut ist weiß ich jetzt nicht, da muss EgonHiergeist noch mal drüber schauen:
ZDbcDbLibUtils.pas

Code: Alles auswählen

function PrepareSQLParameter(Value: TZVariant; ParamType: TZSQLType;
  ConSettings: PZConSettings; PlainDriver: IZDBLibPlainDriver): ZAnsiString;
var
  TempBytes: TByteDynArray;
  TempBlob: IZBlob;
begin
: : :
      stDate:
        if SameText(PlainDriver.GetProtocol, 'mssql') Then
          Result := ZAnsiString('''' + FormatDateTime('yyyy"-"dd"-"mm',
            SoftVarManager.GetAsDateTime(Value)) + '''')
        else Result := ZAnsiString('''' + FormatDateTime('yyyy/mm/dd',
            SoftVarManager.GetAsDateTime(Value)) + '''');
      stTime:
        Result := ZAnsiString('''' + FormatDateTime('hh":"mm":"ss":"zzz',
          SoftVarManager.GetAsDateTime(Value)) + '''');
      stTimestamp:
        if SameText(PlainDriver.GetProtocol, 'mssql') Then
          Result := ZAnsiString('''' + FormatDateTime('yyyy"-"dd"-"mm hh":"mm":"ss":"zzz',
            SoftVarManager.GetAsDateTime(Value)) + '''')
        else Result := ZAnsiString('''' + FormatDateTime('yyyy/mm/dd hh":"mm":"ss":"zzz',
            SoftVarManager.GetAsDateTime(Value)) + '''');
EleLa - Elektronik Lagerverwaltung - www.elela.de

Antworten