Domanda

Ho un'applicazione C # .Net che accede ai dati da un'applicazione commerciale supportata da un Oracle 10 db. Un paio di campi nel database dell'app commerciale (dichiarata varchar2 (n)) contengono caratteri speciali. La "quotazione intelligente" apostrofo, per esempio. L'app client commerciale visualizza correttamente questi caratteri, ma la mia applicazione li visualizza come un punto interrogativo invertito. Il set di caratteri Oracle è " WE8ISO8859P1 " ;.

La mia applicazione legge il database commerciale utilizzando System.Data.OracleClient.OracleDataAdapter, convertito in una tabella tramite DataSet.Tables. I tablerows vengono convertiti in oggetti e i campi in questione vengono memorizzati come stringhe.

Se esamino (nel debugger) i dati nel DataSet immediatamente dopo averli letti dal db, e i caratteri speciali sono già visualizzati in modo errato. Non riesco a capire come esaminare i dati come byte esadecimali per vedere cosa c'è davvero lì, né sono sicuro di cosa dovrei cercare.

Ho anche notato che Toad mostra i personaggi anche come punti interrogativi invertiti.

Un aspetto della nostra applicazione scrive questi record in una tabella separata nel nostro database; quando ciò accade, i caratteri speciali vengono modificati e successivamente visualizzati come caselle anziché punti interrogativi capovolti.

Posso fornire ulteriori informazioni se necessario. Grazie per qualsiasi aiuto!

È stato utile?

Soluzione 2

Postscript per chiunque navighi in questa discussione:

Bogdan mi è stato di grande aiuto nel portarmi alla "risposta" (come è) ma, come sottolinea, potresti non avere circostanze identiche.

  1. Abbiamo comunicato con il team responsabile dell'utilizzo del software commerciale. Stavano copiando / incollando da Word ed Excel, ed è così che venivano inseriti i caratteri speciali.

  2. Il problema si è verificato nella traduzione del carattere tra il database remoto e il nostro database. Il database host utilizza il set di caratteri WE8ISO8859P1, dove il nostro utilizza WE8MSWIN1252. A causa di preoccupazioni a livello aziendale, al momento non è possibile modificare uno dei set di caratteri.

  3. Ho usato SYS.UTL_RAW.CAST_TO_RAW (nome campo) per convertire il campo sorgente per cercare 'BF' (il codice esadecimale per un punto interrogativo invertito nel nostro set di caratteri). Questo almeno mi consente di identificare il record e il carattere del problema. TUTTAVIA, molti caratteri speciali diversi sui record remoti verrebbero / potrebbero essere tradotti in BF. Ad esempio, i trattini di Word non sono semplici "trattino" personaggi e anche tradotti nel punto interrogativo invertito.

  4. dump (fieldname) in qualche modo converte in codici di caratteri decimali PRIMA della traduzione, A MENO CHE non abbia usato SYS.UTL_RAW.CAST_TO_RAW nella stessa query. Ciò ha causato incredibili mal di testa. dump () di per sé potrebbe essere utile per identificare caratteri pre-tradotti specifici dalla fonte db.

La soluzione migliore sarebbe quella di utilizzare lo stesso set di caratteri su entrambi i dbs. Poiché ciò non è possibile per noi, abbiamo sostituito manualmente tutte le occorrenze del carattere speciale sul db di origine (remoto) con equivalenti non speciali (apostrofo regolare o trattino). Tuttavia, poiché il software commerciale non corregge o contrassegna caratteri speciali, potremmo riscontrare questo problema in futuro. Pertanto, la nostra applicazione di aggiornamento cercherà il punto interrogativo invertito e invierà una notifica al proprietario del sistema con l'ID del record errato. Questo, come tante altre situazioni aziendali, dovrà fare. ; -)

Grazie ancora, Bogdan!

Altri suggerimenti

Alcuni caratteri nel set di caratteri WE8ISO8859P1 hanno una rappresentazione binaria diversa rispetto allo stesso carattere in UTF8.

Quello che suggerisco sono 2 possibili modi

1) Prova a utilizzare i provider di dati nativi Oracle per .NET (ODP.NET). Potrebbe esserci un bug / funzionalità nella libreria Microsoft System.Data.OracleClient che questo adattatore non supporta automaticamente la conversione di WE8ISO8859P1 in Unicode. Ecco un link a ODP.NET

Spero che ci sarà un supporto per questa codifica in ODP (ma a dire il vero non l'ho mai verificato, è solo un suggerimento)

2) Soluzione alternativa: nel set di dati, è necessario creare un campo binario (associato al campo della tabella originale) e un campo String (non associato al database). Quando carichi i dati nel set di dati, esegui l'iterazione per ogni riga e esegui la conversione dall'array binario alla stringa.

Il codice dovrebbe essere qualcosa del genere

Encoding e = Encoding.GetEncoding("iso-8859-1");
foreach(DataRow row in dataset.Tables["MyTable"])
{
    if (!row.IsNull("MyByteArrayField"))
        row["MyStringField"] = e.GetString((row["MyByteArrayField"] as byte[]));
}
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top