![]() |
Datenbank: MSSQL • Version: 2008 • Zugriff über: SDAC / TMSConnection
Problem mit .DataType in MSSQL
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:
Und zwar stosse ich bei einer bestimmten Spalte, die das heißt 24HShift, bei der Case Abfrage xxx.DataType auf einen Fehler:
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 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]='U' and sysobjects.name = 'tablename' ORDER BY sysobjects.[name], syscolumns.colid Freue mich sehr über eure Hilfe. Gruß, Skorpion81 |
Re: Problem mit .DataType in MSSQL
Wenn es SDAC betrifft. hast du das Problem dort schon gemeldet. Evtl. kommen die damit nicht zurecht bzw. haben einen Bug.
|
Re: Problem mit .DataType in MSSQL
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:
Delphi-Quellcode:
Ob Spaltennamen, die mit Ziffern beginnen, jetzt so unbedingt SQL-Standard sind, wage ich zu bezweifeln.
case FDMSingle.MSDialerQueryAny.Fields[i].DataType of
Werden da eigentlich alle Spalten in einer Schleife abgearbeitet? Dann kannst Du auf den Spaltennamen komplett verzichten:
Delphi-Quellcode:
Wobei mir da nochwas auffällt:
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; Warum bitte dasda?
Delphi-Quellcode:
geht auch mit
SourceInsert := SourceInsert + IntToStr(FDMSingle.MSDialerQueryAny.Fiels[i].AsInteger);
Delphi-Quellcode:
SourceInsert := SourceInsert + FDMSingle.MSDialerQueryAny.Fiels[i].AsString;
|
Re: Problem mit .DataType in MSSQL
@ 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:
SQL-Code:
Von daher ist momentan die Reihenfolge in Fieldlist nicht gleich der Spaltenreihenfolge, aber das lässt sich ändern.
'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 '
Ich werde deinen Vorschlag mal ausprobieren. Danke! |
Alle Zeitangaben in WEZ +1. Es ist jetzt 09:32 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz