7
votes

ORA-00911: Caractère non valide dans C #, mais pas le développeur ORACLE SQL

J'ai une ligne de code qui lance un

Oracle Exception - ORA-00911: Caractère non valide P> blockquote>

Lorsque vous essayez le code C # suivant: p>

select some_pkg.get_time('23569245', to_date('11/8/2012 1:21:06 PM', 'mm/dd/yyyy hh:mi:ss am'), to_date('12/31/2012 12:52:18 AM', 'mm/dd/yyyy hh:mi:ss am')) from dual


2 commentaires

kurt Pourquoi ne pas créer une procédure stockée et utiliser une requête paramétrée


"L'objectif principal de la procédure stockée consiste à créer des résultats intermédiaires à charger dans une table temporaire, qui est ensuite interrogé dans une instruction SELECT. INSERT ... Les instructions EXEC peuvent être écrites à l'aide de fonctions de valorisation de table." msdn.microsoft.com/en-us/library/ms187650.aspx Étant donné que la fonction n'utilise pas de résultats intermédiaires, il vaut mieux rester en fonction plutôt qu'une procédure stockée.


4 Réponses :


9
votes

Au minimum, vous ne voulez pas que le point-virgule suivant dans la déclaration SQL que vous envoyez de C #.

Je voudrais fortement préconisant également que vous utilisez des variables de liaison plutôt que de concaténer une chaîne avec votre relevé SQL. Cela sera plus efficace, cela empêchera les erreurs liées au pool partagé, elle rendra votre DBA beaucoup plus heureuse et vous protégera contre les attaques d'injection SQL.


4 commentaires

Enlevé le ';' de l'instruction SQL envoyée par C # et a toujours le même message d'exception


@Kurtwagner - Ensuite, le problème est dans quelque chose que vous utilisez pour créer la chaîne (c'est une raison que l'utilisation de variables de liaison est si utile). Si vous souhaitez éviter d'utiliser des variables de liaison, vous devrez nous dire exactement quelle chaîne vous construisez. Pouvez-vous imprimer l'instruction SQL avant de l'exécuter?


J'ai ajouté une chaîne d'échantillonnage qui est envoyée en utilisant un cas réel.


J'avais un problème similaire, je ne sais toujours pas pourquoi cela corrigé cela, mais j'ai ouvert le fichier dans Notepad ++ et converti en UTF-8 de l'UTF-8 BOM et il fonctionne maintenant ...



2
votes

avait le même problème, si quelqu'un d'autre se débat avec ce problème, essayez ce qui suit:

Supprimer le ";" de la chaîne de Sqlsentence dans Visual Studio. Le ";" fait juste partie de l'oracle dbmanager pour séparer les phrases, cela ne fonctionne pas de là (il est reconnu comme un caractère invalide)


1 commentaires

Merci, cela m'a aidé! Au fait, c'est une décision de conception très stupide.



0
votes

C'était un problème délicat. Le caractère suivant "", "a produit l'erreur lorsqu'il est exécuté à partir d'Inline SQL tout en débogage d'une application C #. Cela a bien fonctionné du développeur SQL. DEBUG a finalement travaillé quand "", a été remplacé par la virgule la plus conventionnelle, c'est-à-dire ".


0 commentaires

0
votes

J'ai déjà fait face à cette erreur, lors de l'appel de la procédure stockée à partir de C # Il donne une erreur "Personnage invalide" sur propriétaire.mypackagename.stordedReCrédue . Après avoir creusé de profondes et d'essayer pendant des heures d'identifier où est le problème, il s'avère exactement qu'il existe des caractères cachés et / ou spéciaux tels que \ n . La solution consistait à ré-écrire la requête. Donc, si quelqu'un est en train de se débattre avec ce problème, la leçon à apprendre

  1. N'écrivez pas vos questions quelque part ailleurs et copiez-les-passez-les à votre DB Editor / Tool de gestion, en particulier Toad .
  2. Avant d'appeler la procédure stockée à partir de C # ou de toute autre langue, Assurez-vous de tester la procédure stockée localement sur votre Editeur / outil de gestion de choix, en cas d'erreur dans la requête Vous pourriez facilement le comprendre.

    Espérons que cela sauvera le temps de quelqu'un d'autre.


0 commentaires