SQL через классический ADO - неопределенная функция 'Round'? - PullRequest
1 голос
/ 11 мая 2009

Я работаю над устаревшим продуктом, и у меня есть некоторый SQL, выполняемый через ADO, к базе данных Access со связанными таблицами с SQL Server. Я получаю сообщение об ошибке «Неопределенная функция« Round », когда я выполняю SQL, но , если я беру запрос и запускаю его непосредственно в Access, он отлично работает . Я знаю, что ВСЕ правильно, и это проблема конкретной машины, так как это рабочий код, он работает на других машинах и успешно развернут для многих клиентов.

Я даже не уверен, с чего начать, если честно. Я использую правильные (последние) версии Jet / ADO / MDAC.

ЛЮБАЯ помощь будет признательна.

Заранее спасибо.

РЕДАКТИРОВАТЬ: Очевидно, что SQL включает в себя агрегатную функцию «Раунд». Я знаю о различиях между реализациями Jet и SQL. Эта проблема связана с некоторой проблемой с компонентом на моей машине, а НЕ с кодом. SQL выполняется правильно, когда выполняется через MS Access 2007, но НЕ через ADO.

Ответы [ 3 ]

2 голосов
/ 11 мая 2009

EDIT2: правильное решение из комментариев:

shahkalpesh: если он выполняется через Access, вполне возможно, что Access имеет доступную ему DLL, которая имеет функцию Round. Какую строку подключения вы используете?

Stimul8d: я не уверен, как это может быть что-либо, так что делать со строкой подключения. Этот код работает на КАЖДОМ другом компьютере, без изменений; только не по моему.

Андомар: Ну, это твоя проблема, твоя машина заглохла. Вы все еще можете установить vb6 sp6 возможно.

Stimul8d: Ну, SP6 это исправил. Приветствия Anndomar, не знаю, почему SP6 исправил это, но это сделал!

РЕДАКТИРОВАТЬ: На основе вашего комментария эта группа новостей сообщение может быть ответом:

К сожалению, когда вы работаете запросы извне Access (как вы от VB), ваше единственное соединение с база данных через джет двигатель, который ничего не знает о большинстве функций VBA. Нет никаких способ обойти это, кроме как вернуться данные в ваше приложение VB и используйте функции на данных там.

И два поста позже:

Я решил проблему. Обновил мой VB с пакетом обновления 6 ... потребовалось забота о проблемах.

Старый ответ здесь:

Попробуйте FLOOR () вместо ROUND ().

Чтобы округлить что-либо до ближайшего целого числа, вы можете:

declare @floatmyboat float
set @floatmyboat = 1.51
select floor(@floatmyboat+0.5)

P.S. Возможно опубликуйте точную ошибку, которую вы получите. Если это «функция округления требует от 2 до 3 аргументов.», Это означает, что Sql Server работает на ROUND ().

1 голос
/ 12 мая 2009

может быть, что Access имеет DLL доступно для него, который имеет раунд функция

ACE / Jet использует сервисы совместного использования выражений с VBA. Вообще говоря, ACE / Jet поддерживает в качестве выражений все функции VBA5 (в отличие от методов), аргументы и возвращаемые значения которых являются скалярными типами (например, без массивов, без объектов). Выражение Round() подпадает под это определение и действительно доступно для ACE / Jet с той же семантикой, что и его эквивалент функции VBA. Любой, кто знаком с двигателем ACE / Jet, должен знать, что семантика может отличаться от эквивалентов VBA, например, ACE / Jet ANSI-92 Query Mode SQL

SELECT TYPENAME(ROUND(5, 1))

возвращает 'Long', тогда как VBA

?Typename(Round(5, 1))

возвращает целое число.

Другими словами, Round() не будет проблемой здесь.

1 голос
/ 11 мая 2009

Функция round () также существует в SQL Server.
Единственное отличие: в Access точность является необязательным параметром, но в SQL Server его необходимо указать.

Так что это будет работать только в Access, но не в SQL Server:

select round(Column) from Table

Это будет работать в Access и SQL Server:

select round(Column,1) from Table
...