C'est une absolue hurleurs. Je ne peux pas en croire mes propres yeux, et je ne peut pas croire à personne avant moi aurait découvert si c'était un véritable bug en C#, donc je vais mettre pour le reste de la communauté des développeurs à me dire ce que je fais de mal. Je suis sûr que cette question va impliquer de moi en disant "DOH!" et de claquer ma tête, très difficile avec la paume de ma main - mais voilà, de toute façon...
Pour des raisons de test, j'ai créé un tableau Test_1
, avec un script comme suit:
CREATE TABLE TEST_1 (
COLUMN1 NUMBER(12) NOT NULL,
COLUMN2 VARCHAR2(20),
COLUMN3 NUMBER(12))
TABLESPACE USERS
STORAGE (
INITIAL 64K
MAXEXTENTS UNLIMITED
)
LOGGING;
Maintenant j'exécute le code suivant:
var conn = new OracleConnection("connectionblahblah");
conn.Open();
var cmd = conn.CreateCommand();
cmd.CommandText =
"insert into Test_1(Column1, Column2, Column3) " +
"values(:Column1, :Column2, :Column3)";
var p = cmd.Parameters;
p.Add("Column1", 1);
p.Add("Column3", null);
p.Add("Column2", "record 1");
cmd.ExecuteNonQuery();
Whoa! J'obtiens une erreur ORA-01722 erreur "numéro non valide"! Quel est le problème, si? Column1
est numérique, et a une valeur de 1, c'est très bien; Column2
est une chaîne de caractères, et Column3
est nullable de la colonne, de manière à ne pas causer d'ennuis...
Maintenant, asseyez-vous pour celui-ci... le problème ici est que, Column3
et Column2
sont transposées dans l'ordre dans lequel ils sont ajoutés à l' OracleParameterCollection
. Basculer entre eux à travers, et hop! Il fonctionne!
Ceci, bien sûr, qui m'amène à la prochaine évident expérience... nous allons changer ce bloc de code pour ajouter des paramètres comme ceci:
p.Add("Foo", 1);
p.Add("Bar", "record 1");
p.Add("hahahahahahaha", null);
Vous pensez que ça va marcher? Eh bien, devinez quoi - il n'!
Je suis assis ici absolument stupéfait. Je ne peux pas croire ce que je vois, et de même, je ne crois pas que personne avant moi a découvert ce problème (sauf que je ne sais pas comment utiliser Google correctement).
Ce n'est pas seulement une nuisance - il est vraiment dangereux. Ce qui se serait passé si j'avais transposé deux colonnes du même type de données? Je n'aurais pas même eu une erreur - j'ai simplement inséré les données erronées dans le mauvais colonnes, et pas le plus sage.
Quelqu'un a une idée pour une solution de contournement - autre que juste en faisant attention de ne pas ajouter des paramètres dans le mauvais ordre?