2011-12-16 8 views
7

Come si utilizza CAST in ADO per convertire i valori Float in String?Tipo di annuncio SQL di tipo Float to String (Excel)

ho cercato

SELECT CAST([Field] AS VARCHAR(20)) FROM ... 

e

SELECT CAST([Field] AS STRING) FROM ... 

e sempre ottiene un'eccezione OLE (Errore sconosciuto).

La colonna della tabella contiene valori numerici misti (giustificati a destra) e alfanumerici (giustificati a sinistra). Se esistono solo valori alfanumerici, il tipo di campo query ADO è String.

Sto usando Delphi 2009 ADO e Excel 2010.

risposta

2

Forse usando CStr avrebbe funzionato, cioè

SELECT CStr([Field]) FROM... 
+0

Il CSTR sembra essere una funzione di conversione valido. Ora dà un altro errore: Campo "Campo" non trovato. Immagino che la funzione CSTR cambi il nome della colonna e. Quindi è necessario un nome di campo alias: SELECT CStr ([Field]) come [Field]. Google per l'aiuto :) – mjn

+0

Anche dopo il casting c'è ancora un errore durante l'apertura del set di risultati - "E_FAIL". Non vengono fornite altre informazioni Amo Excel come formato di scambio dati: P – mjn

+0

Forse il CSTR fallisce se il campo è già una stringa? Prova a trasmettere solo quelle righe che non hanno valore di tipo stringa nel campo, qualcosa come 'SELECT iif (fieldType ([field]) <> string, CStr ([field]), [field]) FROM'. Non conosco la sintassi corretta dalla parte superiore della mia testa, ma tu hai l'idea ... – ain

4

cast è un'espressione SQL-Server. utilizzare SELECT Field FROM...

a Delfi: ADOQuery.FieldByName('Field').AsString

non puoi lanciare via istruzione SQL.

quando si utilizza tipi di dati misti:

Leggi this from MSDN (A Attenzione sui tipi di dati misti):

ADO must guess at the data type for each column in your Excel worksheet or range. (This is not affected by Excel cell formatting settings.) A serious problem can arise if you have numeric values mixed with text values in the same column. Both the Jet and the ODBC Provider return the data of the majority type, but return NULL (empty) values for the minority data type. If the two types are equally mixed in the column, the provider chooses numeric over text.

dovrai aggiungere IMEX=1 nella sezione Proprietà estese di la stringa di connessione. il campo permanente sarà di TWideStringField.

La stringa di connessione dovrebbe essere simile a questo:

Provider=Microsoft.Jet.OLEDB.4.0;Password="";User ID=Admin;Data Source=C:\MyFile.xls;Mode=Share Deny None;Extended Properties="Excel 8.0;IMEX=1";...

+0

L'applicazione Delphi utilizza campi permanenti, quindi l'errore si verifica quando si apre il set di risultati, ovvero non riesco a utilizzare .AsString perché l'apertura non riesce – mjn

+0

non riesce anche se si utilizza una selezione semplice? es .: "select * from $ sheet1" (senza casting)?e cosa intendi per "campi persistenti"? – kobik

+0

I "campi persistenti" sono come componenti, che memorizzano proprietà come tipo, dimensione, precisione, didascalia, ecc. Per ogni colonna della tabella. Una semplice selezione * funzionerà. Ma se ci sono requisiti speciali, questi componenti di campo sono lì e se hanno un tipo che non corrisponde al tipo di dati effettivo, il componente ADO Delphi lamenta e solleva un'eccezione. – mjn

1

Prova

SELECT IIF([Field] IS NULL, NULL, CSTR([Field])) AS [Field] 
    FROM ...