SQL a través de ADO clásico - No definido Función 'Ronda'?
Pregunta
Estoy trabajando en un producto legado y tengo algo de SQL que se ejecuta a través de ADO, a una base de datos Access con tablas vinculadas a SQL Server. Estoy recibiendo el error Ronda 'función definida '' cuando ejecuto el SQL, pero Si tomo la consulta y ejecutar directamente en Access funciona bien . Sé que todo está correcto y que este es un problema específico de la máquina ya que este es el código de la producción, que funciona en otros equipos y se ha desplegado con éxito para muchos clientes.
No estoy seguro por dónde empezar a ser honesto. Estoy corriendo los (últimos) versiones correctas de Jet / ADO / MDAC.
Cualquier ayuda sería apreciada.
Gracias de antemano.
EDIT: Obviamente, el SQL incluye la función de agregado 'Ronda'. Soy consciente de las diferencias entre Jet y SQL implementaciones. Este problema se debe a algún problema con un componente en mi máquina y no con el código. El SQL se ejecuta correctamente cuando se hace a través de MS Access 2007, pero no a través de ADO.
Solución
Edit2: solución adecuada a partir de los comentarios:
shahkalpesh: Si se ejecuta bien a través de acceso, podría ser que tiene acceso el archivo DLL que dispone, el cual tiene la función de Ronda. ¿Cuál es la conexión de cadena, que está utilizando?
Stimul8d: No estoy seguro de cómo puede ser algo tan ver con la cadena de conexión. Este código funciona en cualquier otra máquina, sin cambios; pero no en la mía.
Andomar: Bueno, eso es su problema allí mismo, el equipo está farked arriba. Todavía se puede instalar VB6 SP6 tal vez.
Stimul8d: Bueno, SP6 arregló. Saludos Anndomar, ni idea de qué SP6 fija, pero lo hizo!
EDIT: Basado en su comentario este grupo de noticias posterior podría ser la respuesta:
Por desgracia, cuando se está ejecutando consultas desde fuera de acceso (como se son de VB), su única conexión con la base de datos es a través de la Jet motor, que no sabe nada sobre la mayoría de las funciones de VBA. No hay forma de evitar esto, aparte de para volver los datos a su uso de VB y utilizar las funciones de los datos allí.
Y dos puestos más adelante:
He resuelto el problema. Actualizado mi VB con el Service Pack 6 ... que tomó cuidar de los problemas.
vieja respuesta aquí:
piso, intente () en lugar de ROUND ().
Para redondear algo al entero más cercano, usted podría:
declare @floatmyboat float
set @floatmyboat = 1.51
select floor(@floatmyboat+0.5)
P.S. Tal vez publicar el error exacto que se obtiene. Si se trata de "La función de ciclo requiere de 2 a 3 argumentos.", Eso significa que SQL Server es Borking en la ronda ().
Otros consejos
Existe la función round () en SQL Server también.
La única diferencia es:. Acceda a la precisión es un parámetro opcional, pero en SQL Server tiene que especificar que
Así que esto sólo funcionará en Access, pero no en SQL Server:
select round(Column) from Table
Esto funciona en Access y SQL Server:
select round(Column,1) from Table
podría ser que tiene acceso el archivo DLL a su disposición, que tiene la Ronda función
ACE / Jet utiliza los servicios de expresión compartir con VBA. En términos generales, ACE / Jet soporta como expresiones todas las funciones VBA5 (a diferencia de métodos) cuyos argumentos y devolver valores son escalares tipos (por ejemplo, no hay matrices, no hay objetos). La expresión Round()
entra en esta definición y, de hecho, está disponible para ACE / Jet con la misma semántica que su función equivalente de VBA. Como cualquiera que esté familiarizado con el motor ACE / Jet debe saber, sin embargo, la semántica pueden diferir de los equivalentes de VBA por ejemplo, ACE / Jet ANSI-92 SQL consulta en modo
SELECT TYPENAME(ROUND(5, 1))
devuelve 'Long', mientras que VBA
?Typename(Round(5, 1))
devuelve 'Integer'.
En otras palabras, <=> no iba a ser el problema aquí.