2017-09-21 2 views
0

Je suis actuellement confronté à un problème ennuyeux et je serais heureux de recevoir un aperçu.Caractère de fin supplémentaire lors de la récupération de varchar2 à partir d'Oracle 11g avec ASP.Net core 2 avec OracleClient

Je développe une application simple qui récupère certains enregistrements d'un oracle 11g db et les affiche. J'utilise le noyau 2 ASP.Net et le package System.data.OracleClient pour établir une connexion à la base de données.

Cependant, quand je fais une sélection simple et retreive champ varchar2 comme l'extrait suivant:

// Init connection 
var connection = new OracleConnection(connectionString); 

// Create query command 
OracleCommand cmd = connection.CreateCommand(); 
cmd.CommandText = "select * from mytable"; 

// Execute query 
var reader = cmd.ExecuteReader(); 

// Go through all retreived raw and display only the string fields 
while (reader.Read()) { 
    object[] rawRow = new object[reader.FieldCount]; 
    foreach(var o in rawRow) { 
     if(o is string){ 
      // Display the string 
     } 
    } 
} 

Je retreive la chaîne avec une poubelle arrière supplémentaire ombles comme: « maValeur 翽 » Le 翽 est vraiment un extra char, il n'est pas présent dans le champ stocké dans le db. Quand j'utilise sql + client, je n'ai pas ce caractère.

Si un problème pressenti la charset, mais comme le charbon i un supplémentaire et le champ de valeur contient ascii ombles seulement, il ne doit pas être ...

Clochette de quelqu'un?

DBM Oracle 11g

NLS_NCHAR_CHARACTERSET AL16UTF16

NLS_CHARACTERSET WE8MSWIN1252

Merci à l'avance

Edit:

Client: Oracle 12C conf chemin et reg (soit 32 ou 64 bits):

NLS_LANG FRENCH_FRANCE.WE8MSWIN1252

Edit 2:

Le caractère supplémentaire peut changer, obtenu ꌽ, ⌴ et quelques autres. Il ressemble vraiment à un problème de conversion de charset, mais au niveau du connecteur :(

Edit 3:.

Je viens de tester avec le client Oracle à base de mono non officielle (Mono.Data.OracleClientCore) et je reçois les mêmes résultats, maintenant je doute que ce soit le connecteur Peut-être que les clients OCI ne lisent pas le chemin ou la conf ...

+1

Vous pouvez vérifier exactement ce qui est dans la colonne de la table avec 'select dump (mycolumn, 1016) de mytable', mais vous penseriez que SQL \ * Plus le montrerait. Quel est le NLS_LANG pour SQL \ * Plus, et l'équivalent pour votre application? C'est, dans les deux cas, le jeu de caractères du client plutôt les jeux de caractères du serveur que vous avez déjà inclus. –

+0

Ma variable d'environnement NLS_LANG est définie sur FRENCH_FRANCE.WE8MSWIN1252, comme le serveur :(La sauvegarde: Typ = 1 Len = 6 CharacterSet = WE8MSWIN1252: 50,45,52,4e, 4f, 54 et je reçois "Pernot 翽" – grifos

+0

Quelle est votre chaîne de connexion? – MiguelKVidal

Répondre

0

Le champ varchar2 dans Oracle stocke les données sous forme d'octets afin d'extraire efficacement chaque valeur vous pouvez utiliser les types de données suivants:

1 - octet

2 - carboniser

3 - char []

4 - int

Vous pouvez voir this document oracle de la façon dont chaque type de données Oracle est mis en correspondance.NET

+0

Merci pour votre réponse, malheureusement, l'OracleDataReader a déjà interprété le champ comme une chaîne et je ne peux pas le forcer à l'obtenir en tant que tableau char (l'implémentation OracleClient .net core lancera une exception avec GetChars) Donc j'attends la surface de mise en œuvre de base d'Oracle Officiel .net Jusqu'à ce jour j'ai une horrible solution ... – grifos