2009-05-11 3 views
1

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

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

ЛЮБАЯ помощь будет оценена по достоинству.

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

EDIT: Очевидно, что SQL включает в себя совокупную функцию «Round». Я знаю различия между реализацией Jet и SQL. Эта проблема связана с некоторой проблемой с компонентом на моей машине и НЕ с кодом. SQL выполняется должным образом, когда выполняется через MS Access 2007, но НЕ через ADO.

+0

Если это работает на других машинах, это может быть проблемой из-за DLL, которая содержит функцию Round. Я думаю, что это DLL, связанные с VB. – shahkalpesh

+0

Не может быть проблемой с DLL, так как она отлично работает через Access. Я также знаю, что ссылки на проекты верны. Я в тупике! – Stimul8d

+0

Какое приложение это приложение? Пользовательское приложение Access, приложение VB6, приложение C++ или просто двоичный файл? – Andomar

ответ

2

EDIT2: Право решения от комментариев:

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

Stimul8d: Я не уверен, как это может произойти со строкой соединения. Этот код работает на КАЖДОЙ другой машине без изменений; просто не на моем.

Andomar: Хорошо, это ваша проблема прямо там, ваша машина зажата. Вы все равно можете установить vb6 sp6.

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

EDIT: На основе вашего комментария this newsgroup поста может быть ответ:

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

и две должности позже:

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

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

Try FLOOR() вместо ROUND().

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

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

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

+0

Я отправил точную ошибку - «Неопределенная функция« Круглый ». Это проблема локальной среды, а не проблема с кодом. – Stimul8d

+0

Вы используете эту ошибку при выполнении Sql в базе данных Access? – Andomar

+0

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

1

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

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

select round(Column) from Table 

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

select round(Column,1) from Table 
1

это может быть, что доступ имеет доступную ему DLL , которая имеет функцию Round

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

SELECT TYPENAME(ROUND(5, 1)) 

возвращает 'Long', в то время как VBA

?Typename(Round(5, 1)) 

возвращает 'Integer'.

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

 Смежные вопросы

  • Нет связанных вопросов^_^