Pergunta

Eu estou trabalhando em um produto legado e eu tenho alguns SQL que está sendo executado através de ADO, para um banco de dados Access com tabelas vinculadas ao SQL Server. Estou recebendo o erro 'Função indefinida 'Round' quando eu executar o SQL, mas Se eu tomar a consulta e executar diretamente no Access trabalha muito bem . Eu sei que tudo está correto e que esta é uma questão máquina específica uma vez que este é o código de produção, ele funciona em outras máquinas e foi implantado com sucesso para muitos clientes.

Eu não estou mesmo certo por onde começar, para ser honesto. Estou correndo as (últimas) versões corretas de Jet / ADO / MDAC.

Qualquer ajuda seria apreciada.

Agradecemos antecipadamente.

EDIT: Obviamente, o SQL inclui a função agregada 'Round'. Estou ciente das diferenças entre implementações Jet e SQL. Este problema é devido a algum problema com um componente na minha máquina e não com o código. Os executa SQL corretamente quando feito através de MS Access 2007, mas não através de ADO.

Foi útil?

Solução

EDIT2: solução certa a partir dos comentários:

shahkalpesh: Se ele executa bem através Access, pode ser que Access tem a DLL de que dispõe, que tem a função Round. Qual é a seqüência de conexão, você está usando?

Stimul8d: Eu não tenho certeza de como ele pode ser qualquer coisa assim fazer com a seqüência de conexão. Esse código funciona em cada outra máquina, sem alterações; só não nos meus.

Andomar: Bem, esse é o seu problema ali mesmo, a sua máquina está farked-se. Você ainda pode instalar vb6 sp6 talvez.

Stimul8d: Bem, SP6 fixa-lo. Felicidades Anndomar, nenhuma idéia porque SP6 fixa-lo, mas ele fez!

EDIT: Com base no seu comentário pós este newsgroup pode ser a resposta:

Infelizmente, quando você estiver executando consultas de fora do Acesso (como você são de VB), sua única conexão com o banco de dados é através da Jet motor, que não sabe nada sobre a maioria das funções de VBA. Não há maneira de contornar isso, além de retorno os dados para o seu aplicativo VB e usar as funções sobre os dados lá.

E dois posts mais tarde:

Eu resolvi o problema. Atualizado meu VB com o Service Pack 6 ... levou cuidar dos problemas.

resposta Old aqui:

Tente FLOOR () em vez de ROUND ().

Para algo redondo para o número inteiro mais próximo, você pode:

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

P.S. Talvez postar o erro exato que você começa. Se é "A função rodada requer 2 a 3 argumentos.", Isso significa que o SQL Server está Borking na ROUND ().

Outras dicas

A função round () existe no SQL Server também.
A única diferença é:. Acesso na precisão é um parâmetro opcional, mas no SQL Server você tem que especificá-lo

Então, isso só irá funcionar no Access, mas não no SQL Server:

select round(Column) from Table

Este trabalho no Access e SQL Server:

select round(Column,1) from Table

pode ser que Access tem a DLL de que dispõe, que tem a Rodada função

ACE / Jet utiliza serviços de expressão compartilhar com VBA. De um modo geral, os suportes de ACE / Jet como expressões todas as funções VBA5 (como distinto de métodos) cujos argumentos e valores de retorno são escalar tipos (por exemplo, não há matrizes, não há objectos). A expressão Round() cai nesta definição e na verdade, está disponível para ACE / Jet com a mesma semântica sua função VBA equivalente. Como qualquer pessoa familiarizada com o motor ACE / Jet deve saber, no entanto, a semântica pode ser diferente do VBA equivalentes por exemplo ACE / Jet ANSI-92 Consulta Modo SQL

SELECT TYPENAME(ROUND(5, 1))

retorna 'Long', enquanto VBA

?Typename(Round(5, 1))

retorna 'Integer'.

Em outras palavras, Round() não ia ser o problema aqui.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top