AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Datenbanken Problem mit .DataType in MSSQL
Thema durchsuchen
Ansicht
Themen-Optionen

Problem mit .DataType in MSSQL

Ein Thema von Skorpion81 · begonnen am 12. Mai 2010 · letzter Beitrag vom 12. Mai 2010
Antwort Antwort
Skorpion81

Registriert seit: 8. Dez 2005
Ort: Hünfelden
2 Beiträge
 
#1

Problem mit .DataType in MSSQL

  Alt 12. Mai 2010, 10:17
Datenbank: MSSQL • Version: 2008 • Zugriff über: SDAC / TMSConnection
Hallo zusammen,

ich habe ein Projekt übernommen, welches normalerweise auf Informix DBs zugreift. Ich möchte dies nun um den Zugriff auf MSSQL DBs erweitern. Im Prinzip möchte ich am Grundgerüst nicht so viel ändern. Also habe ich den "Informix Code" genommen und die Connections und Querys ausgetauscht.
Klappt auch ganz gut, aber hier stosse ich auf ein Problem (direkt erste Zeile):
Delphi-Quellcode:
case FDMSingle.MSDialerQueryAny.FieldByName(FieldList[i]).DataType of

                 ftInteger,
                 ftSmallint,
                 ftWord,
                 ftAutoInc : begin
                                SourceInsert := SourceInsert + IntToStr
                                (FDMSingle.MSDialerQueryAny.FieldByName(FieldList[i]).AsInteger);
                              end;
                 ftLargeint: begin
                                 SourceInsert := SourceInsert + VarToStr4
                                 (FDMSingle.MSDialerQueryAny.FieldByName(FieldList[i]).AsVariant);
                              end;
                  ftString,
                  ftMemo,
                  ftWidestring,
                  ftFixedChar : begin
                                if Fparam.DestDB <> CCSV then
                                  begin
                                     SourceInsert := SourceInsert + '''' + trim(wandlesonderzeichen
                                     (FDMSingle.MSDialerQueryAny.fieldbyname(FieldList[i]).AsString)) + ''''
                                  end
                                  else
                                  begin
                                    SourceInsert := SourceInsert + trim
                                    (FDMSingle.MSDialerQueryAny.fieldbyname(FieldList[i]).AsString);
                                  end;
                              end;
                 ftDate,
                 ftTime,
                 ftDateTime,
                 ftTimeStamp: begin
                                SourceInsert := SourceInsert + makedtstring
                                (FDMSingle.MSDialerQueryAny.FieldByName(FieldList
                                [i]).AsDateTime,Fparam.DestDB);
                              end;
                 ftFloat : begin
                                SourceInsert := SourceInsert + floattostr
                                (FDMSingle.MSDialerQueryAny.fieldbyname(FieldList[i]).AsFloat);
                              end;
                 ftBoolean : begin
                                iF FDMSingle.MSDialerQueryAny.fieldbyname(FieldList[i]).Asboolean = True
                                  then Sourceinsert := sourceinsert + inttostr(1)
                                 else
                                   Sourceinsert := sourceinsert + inttostr(0) ;
                              end;
                 else
                   begin
                     if rglobpara.CompressErrMsg
                       then inc(fieldtypeerror);
                     if fieldtypeerror = 0
                       then wlog(PROCNAME,'ERROR','Unbekannter Feldtyp ' + inttostr(ord
                       (FDMSingle.MSDialerQueryAny.FieldByName(FieldList[i]).DataType)));
                   end;

               end; //case
Und zwar stosse ich bei einer bestimmten Spalte, die das heißt 24HShift, bei der Case Abfrage xxx.DataType auf einen Fehler:
Folgende Fehlermeldung erhalte ich:
Das Feld '[24HShift]' wurde nicht gefunden
Gibt es da ein bekanntes Problem, wenn die Spaltennamen mit Ziffern beginnen? Wie kann ich das umgehen. Ich kann die Datenbankfelder nicht wirklich ändern, da ich die Datenbank vorgegeben bekommen habe.
Es gibt ja noch die Möglichkeit die Datentypen über eine SQL Abfrage herauszubekommen. Aber kennt von euch nicht jemand die Lösung, wie ich es mit der Delphi Funktion xxx. DataType hinbekommen kann.
Über SQL würde ich es dann mit folgendem Query probieren:
SQL-Code:
SELECT
        table_name=sysobjects.name,
        column_name=syscolumns.name,
        datatype=systypes.name,
        length=syscolumns.length
FROM
        sysobjects
            JOIN syscolumns ON sysobjects.[id] = syscolumns.[id]
            JOIN systypes ON syscolumns.xtype=systypes.xtype
WHERE
        sysobjects.[xtype]='Uand sysobjects.name = 'tablename'
ORDER BY
        sysobjects.[name],
        syscolumns.colid

Freue mich sehr über eure Hilfe.
Gruß,
Skorpion81
  Mit Zitat antworten Zitat
Benutzerbild von Bernhard Geyer
Bernhard Geyer

Registriert seit: 13. Aug 2002
17.202 Beiträge
 
Delphi 10.4 Sydney
 
#2

Re: Problem mit .DataType in MSSQL

  Alt 12. Mai 2010, 10:24
Wenn es SDAC betrifft. hast du das Problem dort schon gemeldet. Evtl. kommen die damit nicht zurecht bzw. haben einen Bug.
Windows Vista - Eine neue Erfahrung in Fehlern.
  Mit Zitat antworten Zitat
nahpets
(Gast)

n/a Beiträge
 
#3

Re: Problem mit .DataType in MSSQL

  Alt 12. Mai 2010, 10:31
Hallo,

wo kommt FieldList her?

Stimmt die Reihenfolge der Feldnamen in der Liste mit der Reihenfolge der Spalten in der Tabelle überein?

Wenn ja, könnte das gehen:
case FDMSingle.MSDialerQueryAny.Fields[i].DataType of Ob Spaltennamen, die mit Ziffern beginnen, jetzt so unbedingt SQL-Standard sind, wage ich zu bezweifeln.

Werden da eigentlich alle Spalten in einer Schleife abgearbeitet? Dann kannst Du auf den Spaltennamen komplett verzichten:
Delphi-Quellcode:
for i := to FDMSingle.MSDialerQueryAny.Fields.Count - 1 do begin
  case FDMSingle.MSDialerQueryAny.Fields[i].DataType of
    ...
      ftAutoInc : begin
                     SourceInsert := SourceInsert + IntToStr
                     (FDMSingle.MSDialerQueryAny.Fiels[i].AsInteger);
                   end;
    ...
  end;
end;
Wobei mir da nochwas auffällt:

Warum bitte dasda?SourceInsert := SourceInsert + IntToStr(FDMSingle.MSDialerQueryAny.Fiels[i].AsInteger); geht auch mitSourceInsert := SourceInsert + FDMSingle.MSDialerQueryAny.Fiels[i].AsString;
  Mit Zitat antworten Zitat
Skorpion81

Registriert seit: 8. Dez 2005
Ort: Hünfelden
2 Beiträge
 
#4

Re: Problem mit .DataType in MSSQL

  Alt 12. Mai 2010, 10:47
@ Bernhard

Nein habe noch nicht SDAC kontaktiert.

@ Stephan
Also Fieldlist wird vorher dynamisch mit allen Spaltennamen gefüllt, die die Tabelle hat.
In Informix habe ich dafür eine Funktion vom Luxenatreiber verwenden können, die da heißt GetFieldNames.
Diese gibt es für MSSQL / SDAC leider nicht, also habe ich mir einen Query zusammengebaut:

'Select column_name=syscolumns.name FROM sysobjects JOIN syscolumns ON sysobjects.id = syscolumns.id JOIN systypes ON syscolumns.xtype=systypes.xtype WHERE sysobjects.xtype=''U'' and sysobjects.name = ''' + STabname + ''' AND (sys.systypes.name <> ''sysname'') ORDER BY syscolumns.name ' Von daher ist momentan die Reihenfolge in Fieldlist nicht gleich der Spaltenreihenfolge, aber das lässt sich ändern.
Ich werde deinen Vorschlag mal ausprobieren.
Danke!
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 13:23 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz