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.

Était-ce utile?

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.

scroll top