2011-09-12 4 views
4

J'ai un projet C# existant qui lit un fichier texte et le charge dans une base de données Oracle à l'aide de System.Data.OleDb en tant que fournisseur. Le problème est que si le fichier a des caractères ascii supérieurs (par exemple ÀÑÓ, espace insécable), il génère toujours une erreur lorsqu'il essaie de le charger dans Oracle:En utilisant C#, est-il possible de faire en sorte que System.Data.OleDb gère les caractères spéciaux?

Erreur: OLEDBConnection Command La valeur de données n'a pas pu être convertie pour des raisons autres que l'incompatibilité de signe ou le dépassement de données.

Notre Oracle peut accepter les caractères ascii supérieurs (insérer via SQL * PLUS fonctionne bien), c'est System.Data.OleDb qui a un problème.

Quelqu'un sait s'il y a un paramètre pour changer cela? Je ne peux pas croire que cela accepte seulement A-Z-0-9. Regardé à travers une documentation, mais n'a rien trouvé.

Si ce n'est pas possible, comment faites-vous savoir OLEDB pour échapper le caractère. Fatigué de mettre \ dans le fichier avant les caractères spéciaux, mais il reste des erreurs avec le même message.

+5

Note rapide: ces ne sont pas des caractères "ASCII supérieurs" - ASCII ne contient pas de caractères accentués ... c'est un simple encodage 7 bits. –

+2

Avez-vous essayé d'utiliser les classes 'System.Data.OracleClient' incorporées, ou même le ODP.NET officiel (fournisseur Oracle ADO.NET), au lieu du fournisseur OLEDB ADO.NET? –

+0

À quoi ressemble votre chaîne de connexion? –

Répondre

2

Vous devrez peut-être utiliser des conversions HEX. Par exemple% c4 est Ä.

Essayez-le et faites-moi savoir si cela fonctionne. Voici les fonctions de conversion que vous pouvez utiliser.

internal String convertAsciiTextToHex(String asciiText) 
{ 
StringBuilder sBuffer = new StringBuilder(); 
for (int i = 0; i < asciiText.Length; i++) 
{ 
    sBuffer.Append(Convert.ToInt32(asciiText[i]).ToString("x")); 
} 
return sBuffer.ToString().ToUpper(); 
} 

internal String convertHexToAsciiText(String hexString) 
{ 
    StringBuilder sb = new StringBuilder(); 

for (int i = 0; i < hexString.Length; i += 2) 
{ 
    string hs = hexString.Substring(i, 2); 
    sb.Append(Convert.ToChar(Convert.ToUInt32(hs, 16))); 
} 
    String ascii = sb.ToString(); 
    return ascii; 
} 
+0

Je ne veux pas les caractères convertis, je veux être capable de lire un Ñ du fichier et de le stocker dans Oracle via OLEDB. Oracle peut les stocker et les fichiers les fournissent. Ce sont des noms espagnols et convertir un Ñ en quelque chose d'autre en fait un nom différent. – user722226

+0

Vous les convertissez uniquement en hexadécimal, vous ne modifiez pas la valeur réelle. Je suis curieux de voir si les encoder correctement dans votre base de données Oracle. – ApolloSoftware

+0

Il stocke la valeur hexadécimale dans la base de données puisque j'utilise un insert standard dans une colonne varchar2. convertir un Ñ en hex va stocker la valeur hexadécimale.Je devrais utiliser la fonction spéciale oracle pour faire une conversion hexadécimale en ascii – user722226

1

Votre type de données et votre type de paramètre sont-ils nvarchar2?

3

Habituellement, cela est possible sans aucun problème ... puisque vous ne fournissez pas beaucoup de détails que quelques pointeurs généraux:

  • Database Charset doit être réglé sur AL32UTF8
    vous pouvez vérifier en exécutant SELECT parameter, value FROM nls_database_parameters WHERE parameter = 'NLS_CHARACTERSET';
  • client Charset doit être réglé sur AL32UTF8
    voir pour ces paramètres de registre pour NLS_LANG
  • Les colonnes doivent être VARCHAR2
  • chaîne de connexion devrait inclure OLEDB.NET=True
    pour référence ultérieure voir http://download.oracle.com/docs/cd/B28359_01/win.111/b28431/using.htm#i1017221

Autres points à vérifier pourrait être OS et client et les versions OLEDB ... certains ont des bugs ou des comportements étranges ...

Questions connexes