2015-06-30 5 views
7

Ho scaricato e installato MySQL Connector 5.1 x64 così posso usare MySQL con Delphi. Posso stabilire una connessione con ODBC e fare una connessione dal mio ambiente Delphi e da MySQL Workbench.Ottenere l'eccezione "Gli argomenti sono del tipo errato ..." solo assegnando il testo della query

Ma, quando ho costruire il mio query in fase di esecuzione, ottengo un errore che dice:

Progetto AAA.exe sollevato classe di eccezione EOleException con argomenti di messaggio' sono del tipo errato, sono fuori intervallo accettabile, o sono in conflitto tra loro ". Processo fermato. Usa Step o Esegui per continuare.

Il mio codice:

qDates := TADOQuery.Create(Component); 
qDates.Connection := FConnection; 
qDates.SQL.Text := 
    'select ' + 
    ' * ' + 
    'from ' + 
    ' resulttable ' + 
    'where ' + 
    ' oid = :oid ' + 
    ' and datedial >= :datebegin and datedial <= :dateend'; // <<-- Exception here 

Dettagli:
L'eccezione accade proprio sulla assegnazione di testo, prima di avere la possibilità di configurare i parametri.
Se commento la clausola where, l'assegnazione va bene.
Questo è simile a Using parameters with ADO Query (mysql/MyConnector) ma la differenza è che assegno tutto il testo in una volta e ottengo l'eccezione prima che abbia la possibilità di configurare i parametri.

La parte sconcertante - lo stesso codice funziona perfettamente con l'altra macchina, ma non riesco a capire cosa sia diverso.

Quindi la domanda: cosa potrebbe causare l'eccezione sopra al codice Delphi e al server MySQL?

+0

* Non riesco a capire ciò che è diverso * Che dire di stringhe di connessione? Non differiscono in qualcosa relativo ai parametri? – TLama

+0

Le stringhe di connessione sono esattamente le stesse (e anche il codice sorgente è esattamente lo stesso). L'unica grande differenza è OS - WinXPSP3x86 vs Win7x64 – Kromster

+0

Non riesco a riprodurlo sul PC accanto al mio! xD Quindi la domanda. Non un duplicato perché l'eccezione si verifica prima che 'Parameters' e SQL query siano impostati in una volta. – Kromster

risposta

5

Questo sembra essere un problema con il provider ODBC MySQL.

Se si assegna la connessione dopo aver impostato il testo SQL, funzionerà. Il motivo per cui è possibile trovare here.

qDates := TADOQuery.Create(Component); 
// do net yet assign TADOConnection to prevent roundtrip to ODBC provider 
qDates.SQL.Text := 
    'select ' + 
    ' * ' + 
    'from ' + 
    ' resulttable ' + 
    'where ' + 
    ' oid = :oid ' + 
    ' and datedial >= :datebegin and datedial <= :dateend'; 
qDates.Connection := FConnection; 

UPDATE

Questa QC entry spiega il motivo esatto per questo problema.

In breve, l'unità di ADODB, patch Questa linea dalla procedura di RefreshFromOleDB:

 Parameter.Attributes := dwFlags and $FFFFFFF0; { Mask out Input/Output flags } 

A:.

if dwFlags and $FFFFFFF0 <= adParamSigned + adParamNullable + adParamLong then 
Parameter.Attributes := dwFlags and $FFFFFFF0; { Mask out Input/Output flags } 
Problemi correlati