SQL através de ADO clássico - Função indefinida 'Round'?
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.
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.