SQL par ADO classique - Fonction non définie 'Round'?
Question
Je travaille sur un produit existant et j'ai une SQL en cours d'exécution à travers ADO, à une base de données Access avec des tables liées à SQL Server. Je reçois l'erreur « Fonction non définie « Round » quand j'exécute SQL mais si je prends la requête et exécuter directement dans Access il fonctionne très bien . Je sais que tout est correct et que cela est une machine spécifique puisque ce problème est le code de production, il travaille sur d'autres machines et a été déployé avec succès pour de nombreux clients.
Je ne suis même pas sûr où commencer à être honnête. Je suis en cours d'exécution les versions correctes (plus récente) de Jet / ADO / MDAC.
Toute aide serait appréciée.
Merci d'avance.
EDIT: De toute évidence, le SQL inclut la fonction d'agrégat 'Round'. Je suis au courant des différences entre les implémentations de Jet et SQL. Ce problème est dû à un problème avec un composant sur ma machine et non pas avec le code. Le SQL exécute correctement lorsque vous avez terminé par MS Access 2007, mais pas par ADO.
La solution
EDIT2: bonne solution des commentaires:
shahkalpesh: Si elle exécute bien à travers l'accès, il est possible que l'accès a la DLL dont il dispose, qui a la fonction ronde. Quelle est la chaîne de connexion, vous utilisez?
Stimul8d: Je ne sais pas comment il peut être quelque chose d'aussi faire avec la chaîne de connexion. Ce code fonctionne sur toutes les autres machines, sans changement; tout simplement pas sur le mien.
Andomar: Eh bien, c'est votre problème là, votre machine est farked vers le haut. Vous pouvez toujours installer VB6 SP6 peut-être.
Stimul8d: Eh bien, SP6 fixé il. Vive Anndomar, aucune idée pourquoi SP6 fixe, mais il l'a fait!
EDIT: D'après votre commentaire poste de ce groupe de discussion pourrait être la réponse:
Malheureusement, lorsque vous exécutez recherches effectuées en dehors de l'accès (comme vous sont de VB), votre seule connexion la base de données se fait par le Jet moteur, qui ne sait rien A propos de la plupart des fonctions VBA. Il n'y a pas autour de cette autre que pour revenir les données à votre application VB et utiliser les fonctions sur les données là-bas.
Et deux postes plus tard:
Je l'ai résolu le problème. Mise à jour mon VB avec le Service Pack 6 ... il a fallu prendre soin des problèmes.
Ancienne réponse ici:
Essayez FLOOR () au lieu de ROND ().
Pour arrondir quelque chose à l'entier le plus proche, vous pouvez:
declare @floatmyboat float
set @floatmyboat = 1.51
select floor(@floatmyboat+0.5)
P.S. poster l'erreur exacte peut-être que vous obtenez. Si elle est "La fonction excentrées nécessite 2 à 3 arguments.", Cela signifie que Sql Server est Borking sur le cycle ().
Autres conseils
La fonction round () existe dans SQL Server ainsi.
La seule différence est:. Dans Access la précision est un paramètre optionnel, mais dans SQL Server vous devez spécifier
Alors cela ne fonctionnera que dans Access, mais pas dans SQL Server:
select round(Column) from Table
Cela fonctionne dans Access et SQL Server:
select round(Column,1) from Table
il se pourrait que l'accès a la DLL dont il dispose, qui a la ronde fonction
ACE / Jet utilise les services d'expression d'actions avec VBA. D'une manière générale, ACE / Jet prend en charge que les expressions toutes les fonctions de VBA5 (par opposition aux méthodes) dont les arguments et les valeurs de retour sont types scalaire (par exemple pas de tableaux, pas d'objets). L'expression tombe dans Round()
cette définition et est en effet disponible à ACE / Jet avec la même sémantique que son équivalent de la fonction VBA. Comme tous ceux qui connaissent le moteur ACE / Jet devrait savoir, cependant, la sémantique peuvent différer des équivalents VBA par exemple ACE / Jet mode de requête SQL ANSI-92
SELECT TYPENAME(ROUND(5, 1))
renvoie Long ', alors que VBA
?Typename(Round(5, 1))
rendements entier.
En d'autres termes, on ne va pas <=> être le problème ici.