Fragen zu MS SQL Server (FireDAC)

Aus RAD Studio
Wechseln zu: Navigation, Suche

Nach oben zu FAQ (FireDAC)

Dieses Thema enthält eine Liste mit Fragen und Antworten zu MS SQL Server.


F1: SQL Server 2005: Kann mit SQL Native Client ein Shared-Memory-Transport verwendet werden?

A: Im Allgemeinen:

  • Überprüfen Sie mit dem Client-Konfigurationsprogramm, ob das Shared-Memory-Protokoll aktiviert ist.
  • Verwenden Sie in der Verbindungsdefinition "Server=(local)".

F2: Wie kann ich mit SQL Server 2005 OriginTabName abrufen?

A: Fügen Sie den Verbindungsdefinitionsparameter "ExtendedMetadata=True" hinzu.

F3: Beim Aufruf einer gespeicherten Prozedur wird die Meldung "[FireDAC][Phys][ODBC]-345. Data too large for variable [#3]. Max len = [2], actual len = [14]" (Daten zu groß für Variable [#3]. Max. Länge = [2], tatsächliche Länge = [14]) ausgegeben. Was ist falsch?

A: Das kommt häufig vor, wenn für eine gespeicherte Prozedur ein VARCHAR-Parameter ohne Angabe der Größe festgelegt ist. Zum Beispiel:

 PROCEDURE ANALYZETABLE @T_OWNER VARCHAR, @T_TABLE VARCHAR AS
 DECLARE @FOOBAR INTEGER;
 BEGIN
   /* DUMMY PROCEDURE JUST FOR COMPATIBILITY PURPOSE */
   SET @FOOBAR = 1;
 END;

Hinweise:

  • Schließen Sie fiMeta aus FetchOptions.Items aus, damit FireDAC nicht die Parameterdefinition der gespeicherten Prozedur abruft. Das ist erforderlich, weil der ODBC-Treiber @T_OWNER VARCHAR als VARCHAR(1) beschreibt.
  • Geben Sie alle Parametereigenschaften, einschließlich von Size, vor Prepare oder dem ersten ExecProc-Aufruf an.

F4: Beim Aufruf einer gespeicherten Prozedur wird die Meldung "[FireDAC][Phys][ODBC][Microsoft][SQL Server Native Client 10.0][SQL Server]Line 1: Incorrect syntax near '{'" (Zeile 1: Inkorrekte Syntax in der Nähe von '{') ausgegeben. Was ist falsch?

A: Dies ist ein bekanntes Problem. Es tritt auf, wenn:

  • Die Verbindung den ODBC-Treiber von SQL Server Native Client 2008 verwendet.
  • Das DBMS SQL Server 2000 ist.
  • Eine gespeicherte Prozedur einen BLOB-Eingabeparameter hat.

Gegenwärtig besteht die einzige Lösung des Problems darin, den ODBC-Treiber von SQL Server 2000 oder SQL Native Client 2005 für die Verbindung zu Microsoft SQL Server 2000 zu verwenden.

F5: Beim Aufruf eines Array DML-Befehls wird die Meldung "[FireDAC][Phys][ODBC][Microsoft][SQL Server Native Client 10.0]String data, length mismatch" (Länge der String-Daten stimmt nicht überein) ausgegeben. Was ist falsch?

A: Dies ist ein bekanntes Problem. Dabei scheint es sich um einen Fehler im ODBC-Treiber von Microsoft SQL Native Client zu handeln. Eine geeignete Lösung für dieses Problem ist nicht bekannt. Das Problem tritt auf, wenn einer der Parameter den Datentyp BLOB (ftBlob, ftMemo usw.) hat. Setzen Sie zur Umgehung dieses Problems ResourceOptions.ArrayDMLSize auf 1.

F6: Warum löst die Anwendung die Exception "Invalid object name '#<my temp table name>'" (Ungültiger Objektname '#<Name der temporären Tabelle>') aus?

A: Die FireDAC-Anwendung kann die obige Exception auslösen, wenn sie mit lokalen temporären Tabellen von Microsoft SQL Server arbeitet. Der folgende Code produziert diesen Fehler:

 FDQuery1.ExecSQL('select * into #TmpOrd from [Orders]');
 FDQuery1.Open('select * from #TmpOrd');

Setzen Sie zur Lösung dieses Problems TFDQuery.ResourceOptions.DirectExecute auf True. Dies ist auch erforderlich, wenn die Anwendung Folgendes ausgiebig verwendet:

  • Lokale temporäre Tabellen im Client-SQL.
  • Und/oder das dynamische Client-SQL.

Optional könnten Sie globale temporäre Tabellen verwenden.

F7: Ich erhalte einen merkwürdigen SQL-Fehler (8155) "No column was specified for column 1 of 'A'" (Keine Spalte für Spalte 1 von 'A' angegeben). Was ist falsch?

A: Vermutlich setzt eine Anwendung FetchOptions.RecsMax auf einen Wert größer null und führt eine Abfrage mit Ausdrücken in der SELECT-Liste aus. Zum Beispiel:

 SELECT MIN(MyField) FROM MyTable WHERE MyIdField > 0

FireDAC ändert in diesem Fall die Abfrage in:

 SELECT TOP 10 * FROM (
   SELECT MIN(MyField) FROM MyTable WHERE MyIdField > 0
 ) A

In SQL Server schlägt diese Syntax mit dem obigen Fehler fehl. Geben Sie zur Lösung dieses Problems die Aliase für Ausdrücke in der SELECT-Liste an.

F8: Ich kann keine chinesischen Zeichen (Big5-Codierung) aus der Datenbank abrufen. Wie kann ich das korrigieren?

A: Versuchen Sie den folgenden Verbindungsdefinitionsparameter hinzuzufügen:

 ODBCAdvanced=AutoTranslate=no

Und fügen Sie folgende Zuordnungsregel hinzu:

 object FDConnection1: TFDConnection
 .....................
     FormatOptions.AssignedValues = [fvMapRules]
     FormatOptions.OwnMapRules = True
     FormatOptions.MapRules = <
       item
         SourceDataType = dtAnsiString
         TargetDataType = dtWideString
       end>
   end

Überprüfen Sie auch, ob der richtige chinesische Datenbankzeichensatz und nicht Latin1 festgelegt ist.

F9: Wenn ich "2011-11-13 00:00" als Datums-/Zeitwert einfüge, wird der Fehler "The conversion of a varchar data type to a datetime data type resulted in an out-of-range value" (Die Umwandlung eines varchar-Datentyps in einen datetime-Datentyp hat einen Wert außerhalb des Bereichs ergeben) angezeigt. Was mache ich falsch?

A: Gemäß MSDN entspricht das verwendete Datums-/Zeitformat nicht dem internationalen Standard. Es gibt mehrere Lösungen, um diesen Fehler zu vermeiden:

  • Verwenden Sie die Option SET DATEFORMAT. Führen Sie beispielsweise die folgende Anweisung aus, um die Reihenfolge von Jahr, Monat und Tag festzulegen:
 FDConnection1.ExecSQL('set dateformat ymd');
 FDConnection1.ExecSQL('insert into Test (date_val) values (convert(datetime, ''2011-11-13 00:00'', 120)');
  • Ändern Sie das Format Ihrer Daten in den internationalen Standard:
 FDConnection1.ExecSQL('insert into Test (date_val) values(''2011-11-13T00:00:00'');

F10: Beim Eintragen von Aktualisierungen in eine SQL Server-Tabelle erhalte ich den Fehler "Update command updated [N] instead of [1] record" (Update-Anweisung hat [N] anstatt [1] Datensätze aktualisiert). Was ist der Grund dafür?

A: Bei SQL Server tritt dieser Fehler häufig auf, wenn die Tabelle einen Trigger hat, der die Datenbank explizit oder implizit durch Aufruf einer gespeicherten Prozedur ändert, die Änderungen an der Datenbank vornimmt. FireDAC erhält dann die Anzahl der vom Trigger geänderten Datensätze, anstatt die Anzahl der von der UPDATE-Anweisung geänderten Datensätze.

Fügen Sie am Beginn des Triggers SET NOCOUNT ON ein, um dies zu vermeiden. Alternativ setzen Sie UpdateOptions.CountUpdatedRecords auf False.

F11: Ich habe einige Tabellenspalten als DATETIME2/DATE/TIME deklariert, und FireDAC gibt sie als WideString zurück. Oder ich erhalte den Fehler "Type mismatch, expecting Date, actual WideString" (Keine Übereinstimmung des Typs, Date erwartet, WideString erhalten). Was ist falsch?

DATETIME2/DATE/TIME wurde in SQL Server 2008 eingeführt. ODBC-Treiber von SQL Server (SQL Server 2000) erkennen diese Typen nicht und ordnen sie zu WideString zu. SQL Server Native Client v10 erkennt diese Typen und stellt sie korrekt dar. Installieren Sie SQL Server Native Client v10, um dieses Problem zu lösen. SQL Server Native Client wird nicht standardmäßig installiert, aber der ODBC-Treiber von SQL Server schon.