SQL tramite ADO classico - funzione non definita 'Round'?
Domanda
Sto lavorando su un prodotto legacy e ho un po 'di SQL in esecuzione tramite ADO, ad un database di Access con le tabelle collegate a SQL Server. Ricevo l'errore 'funzione non definita 'Round', quando eseguo il codice SQL, ma se prendo la query e correre direttamente in Access funziona benissimo . So che tutto sia corretto e che questo è un problema specifico della macchina in quanto questo è il codice di produzione, funziona su altre macchine ed è stato implementato con successo per molti clienti.
Non sono nemmeno sicuro da dove cominciare ad essere onesti. Sono in esecuzione le corrette (recenti) versioni di Jet / ADO / MDAC.
Qualsiasi aiuto sarebbe apprezzato.
Grazie in anticipo.
EDIT: Ovviamente, la SQL include la funzione di aggregazione 'Round'. Sono consapevole delle differenze tra Jet e SQL implementazioni. Questo problema è dovuto a qualche problema con un componente sulla mia macchina e NON con il codice. Lo SQL eseguito correttamente quando fatto attraverso MS Access 2007, ma non attraverso ADO.
Soluzione
EDIT2: soluzione giusta dai commenti:
shahkalpesh: Se esegue bene attraverso Access, potrebbe essere che Access ha la DLL a sua disposizione, che ha la funzione Round. Qual è la stringa di connessione, si sta utilizzando?
Stimul8d: Non sono sicuro di come può essere qualsiasi cosa, in modo da fare con la stringa di connessione. Questo codice funziona su ogni altra macchina, senza modifiche; non solo sulla mia.
Andomar: Beh, questo è il tuo problema proprio lì, la macchina è farked up. È comunque possibile installare VB6 SP6 forse.
Stimul8d: Beh, SP6 riparato. Acclamazioni Anndomar, idea del perché SP6 fisso, ma lo ha fatto!
EDIT: Sulla base di tuo commento dopo questo newsgroup potrebbe essere la risposta:
Purtroppo, quando si esegue query al di fuori di accesso (come voi sono da VB), il tuo unico collegamento a il database è attraverso il Jet motore, che non sa nulla su maggior parte delle funzioni VBA. Non c'è modo per aggirare questo, altro che tornare i dati per la vostra applicazione VB e utilizzare le funzioni base dei dati lì.
E due post successivi:
ho risolto il problema. Aggiornato il mio VB con il Service Pack 6 ... ci sono voluti cura dei problemi.
Old risposta qui:
Prova FLOOR () al posto di ROUND ().
Per arrotondare qualcosa all'intero più vicino, si potrebbe:
declare @floatmyboat float
set @floatmyboat = 1.51
select floor(@floatmyboat+0.5)
P.S. Forse inviare l'errore esatto che si ottiene. Se si tratta di "La funzione rotonda richiede da 2 a 3 argomenti.", Questo significa che SQL Server è Borking sul ROUND ().
Altri suggerimenti
La funzione round () esiste in SQL Server pure.
L'unica differenza è:. In Access la precisione è un parametro opzionale, ma in SQL Server è necessario specificarlo
Quindi questo funziona solo in Access, ma non in SQL Server:
select round(Column) from Table
Questo funziona in Access e di SQL Server:
select round(Column,1) from Table
potrebbe essere che Access ha la DLL a sua disposizione, che ha la rotonda la funzione
ACE / Jet utilizza i servizi di condivisione di espressione con VBA. In termini generali, ACE / Jet supporta espressioni come tutte le funzioni VBA5 (distinti dai metodi) cui argomenti e restituire valori sono scalari tipi (ad esempio presenta array, senza oggetti). Il Round()
espressione rientra in questa definizione e infatti è disponibile per ACE / Jet con la stessa semantica sua funzione equivalente VBA. Come chiunque abbia familiarità con il motore ACE / Jet dovrebbe sapere, però, la semantica possono differire dai equivalenti VBA per esempio ACE / Jet ANSI-92 query in modalità SQL
SELECT TYPENAME(ROUND(5, 1))
restituisce 'lungo', mentre VBA
?Typename(Round(5, 1))
restituisce 'Integer'.
In altre parole, <=> non era intenzione di essere il problema qui.