SQL через классический ADO – неопределенная функция «круглая»?

StackOverflow https://stackoverflow.com/questions/848288

  •  21-08-2019
  •  | 
  •  

Вопрос

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

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

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

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

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

Это было полезно?

Решение

РЕДАКТИРОВАТЬ2:Правильное решение из комментариев:

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

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

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

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

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

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

И двумя постами позже:

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

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

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

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

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

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

Другие советы

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

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

select round(Column) from Table

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

select round(Column,1) from Table

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

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))

возвращает «Целое число».

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top