Questions relatives au serveur MS SQL (FireDAC)
Remonter à FAQ (FireDAC)
Cette rubrique contient une liste des questions et réponses relatives au serveur MS SQL.
Q1 : SQL Server 2005 : est-il possible d'utiliser le transport Mémoire partagée avec SQL Native Client ?
R : En général :
- Avec le logiciel Client Network Utility, vérifiez que le protocole Mémoire partagée est activé ;
- Utilisez Server=(local) dans la définition de votre connexion.
Q2 : Comment puis-je récupérer OriginTabName avec SQL Server 2005 ?
R : Ajoutez le paramètre de définition de connexion ExtendedMetadata=True.
Q3 : Quand j'appelle une procédure stockée, je reçois le message "[FireDAC][Phys][ODBC]-345. Données trop grandes pour la variable [#3]. Max len = [2], actual len = [14]". Quel est le problème ?
R : Dans la majorité des cas, cela se produit quand une procédure stockée a un paramètre VARCHAR défini sans taille spécifiée. Par exemple :
PROCEDURE ANALYZETABLE @T_OWNER VARCHAR, @T_TABLE VARCHAR AS
DECLARE @FOOBAR INTEGER;
BEGIN
/* DUMMY PROCEDURE JUST FOR COMPATIBILITY PURPOSE */
SET @FOOBAR = 1;
END;
Remarques :
- Excluez fiMeta de FetchOptions.Items, de sorte que FireDAC n'extrait pas la définition des paramètres de la procédure stockée. C'est obligatoire car le pilote ODBC décrit @T_OWNER VARCHAR en tant que VARCHAR(1).
- Spécifiez les propriétés de tous les paramètres, y compris Size avant Prepare ou le premier appel à ExecProc.
Q4 : Quand j'appelle une procédure stockée, je reçois le message "[FireDAC][Phys][ODBC][Microsoft][SQL Server Native Client 10.0][SQL Server]Ligne 1 : syntaxe incorrecte proche de '{'". Quel est le problème ?
R : C'est un problème connu. Il se produit quand :
- La connexion utilise le pilote ODBC de SQL Server Native Client 2008 ;
- Le SGBD est SQL Server 2000 ;
- Et une procédure stockée à un paramètre d'entrée BLOB.
Pour le moment, la seule solution consiste à utiliser le pilote ODBC de SQL Server 2000 ou SQL Native Client 2005 quand vous vous connectez à Microsoft SQL Server 2000.
Q5 : Quand j'appelle la commande Array DML, je reçois le message "[FireDAC][Phys][ODBC][Microsoft][SQL Server Native Client 10.0]Non concordance de longueur des données de la chaîne". Quel est le problème ?
R : C'est un problème connu. Il semble que ce soit un bogue dans le pilote ODBC de Microsoft SQL Native Client. Nous n'avons pas de solution correcte à ce problème, qui se produit quand l'un des paramètres a un type de données BLOB (ftBlob, ftMemo, etc.). La solution consiste à définir ResourceOptions.ArrayDMLSize sur 1.
Q6 : Pourquoi l'application déclenche-t-elle l'exception "Nom d'objet incorrect '#<nom de ma table temp>'" ?
R : L'application FireDAC peut déclencher cette exception quand elle utilise des tables temporaires locales Microsoft SQL Server. Le code suivant reproduit le problème :
FDQuery1.ExecSQL('select * into #TmpOrd from [Orders]');
FDQuery1.Open('select * from #TmpOrd');
Pour résoudre ce problème, définissez TFDQuery.ResourceOptions.DirectExecute sur True. C'est également nécessaire quand l'application a beaucoup recours :
- Aux tables temporaires locales dans le client SQL ;
- Et/ou au client dynamique SQL.
Vous pouvez éventuellement utiliser des tables temporaires globales.
Q7 : Je reçois un message d'erreur SQL étrange (8155) "Aucune colonne n'a été spécifiée pour la colonne 1 de 'A'". Quel est le problème ?
R : Il semble qu'une application définisse FetchOptions.RecsMax sur une valeur supérieure à zéro et exécute une requête avec des expressions dans la liste SELECT. Par exemple :
SELECT MIN(MyField) FROM MyTable WHERE MyIdField > 0
Dans ce cas, FireDAC modifie une requête en :
SELECT TOP 10 * FROM (
SELECT MIN(MyField) FROM MyTable WHERE MyIdField > 0
) A
Dans SQL Server, cette syntaxe échoue avec le message d'erreur ci-dessus. Pour résoudre ce problème, spécifiez les alias des expressions dans la liste SELECT.
Q8 : Je ne parviens pas à récupérer les caractères chinois (encodage Big5) d'une base de données. Comment résoudre ce problème ?
R : Essayez d'ajouter le paramètre de définition de connexion :
ODBCAdvanced=AutoTranslate=no
Et ajoutez la règle de mappage :
object FDConnection1: TFDConnection
.....................
FormatOptions.AssignedValues = [fvMapRules]
FormatOptions.OwnMapRules = True
FormatOptions.MapRules = <
item
SourceDataType = dtAnsiString
TargetDataType = dtWideString
end>
end
Vérifiez également que vous avez défini le jeu de caractères chinois correct, et non Latin1.
Q9 : Quand j'insère '2011-11-13 00:00' comme valeur date/heure, j'obtiens le message d'erreur "La conversion d'un type de données varchar en type de données datetime a généré une valeur hors étendue". Quel est le problème ?
R : Selon MSDN, le format date/heure utilisé n'est pas conforme à la norme internationale. Plusieurs solutions permettent d'éviter cette erreur :
- Utilisez l'option SET DATEFORMAT. Par exemple, exécutez ce code pour définir l'ordre d'affichage de l'année, du mois et du jour :
FDConnection1.ExecSQL('set dateformat ymd');
- Utilisez la fonction CONVERT :
FDConnection1.ExecSQL('insert into Test (date_val) values (convert(datetime, ''2011-11-13 00:00'', 120)');
- Changez le format de vos données conformément à la norme internationale :
FDConnection1.ExecSQL('insert into Test (date_val) values(''2011-11-13T00:00:00'');
Q10 : Quand je valide des mises à jour dans la table SQL Server, je reçois le message d'erreur "Commande de mise à jour [N] mise à jour au lieu de l'enregistrement [1]". Pour quelle raison ?
R : Dans la majorité des cas avec SQL Server, cette erreur se produit quand la table possède un déclencheur qui modifie la base de données de façon explicite ou implicite en appelant une procédure stockée qui modifie la base de données. Ensuite, FireDAC reçoit le nombre d'enregistrements modifiés par le déclencheur, au lieu du nombre d'enregistrements mis à jour par la commande UPDATE.
Pour éviter ce problème, insérez SET NOCOUNT ON au début du déclencheur. Vous pouvez également définir UpdateOptions.CountUpdatedRecords sur False.
Q11 : J'ai déclaré certaines colonnes de la table en tant que DATETIME2/DATE/TIME et FireDAC les renvoie comme WideString. Ou j'obtiens une non concordance de type (j'attends Date et j'obtiens WideString). Quel est le problème ?
Les DATETIME2/DATE/TIME ont été introduits dans SQL Server 2008. Le pilote ODBC de SQL Server (SQL Server 2000) ne reconnaît pas ces types et les mappe en WideStrings. SQL Server Native Client v10 les reconnaît et les représente correctement. Pour résoudre ce problème, vous devez installer SQL Server Native Client v10. Il n'est pas installé par défaut, contrairement au pilote ODBC de SQL Server.