J'ai quelques problèmes avec une application que nous portons vers Mono.
(Pour référence, le runtime .NET est 4.0, et la version mono est 2.6.7).
EDIT : Ce problème persiste sur Mono 2.10.2
Dans le cadre du démarrage de l'application, celle-ci lit des données en mémoire. Pour cette partie, j'utilise simplement des commandes SQL en ligne, mais pour une raison quelconque, je constate un comportement incohérent sous Linux/Mono (alors que tout fonctionne sous Windows/.NET).
J'ai une requête qui fonctionne bien dans certains scénarios, mais pas dans d'autres.
Cet exemple particulier ne fonctionne pas :
var cmd = new SqlCommand("SELECT ID, Name, VATTerritoryID, NativeCurrencyID FROM PricingZones", conn);
var reader = cmd.ExecuteReader();
var objectToLoad = new SomeObjectType();
while (reader.Read())
{
objectToLoad.Property1 = reader.GetInt32(row.GetOrdinal("ID"));
objectToLoad.Property2 = reader.GetString(row.GetOrdinal("Name"));
objectToLoad.Property3 = reader.GetInt32(row.GetOrdinal("VATTerritoryID"));
objectToLoad.Property3 = reader.GetInt32(row.GetOrdinal("NativeCurrencyID"));
}
EDIT : A titre de comparaison, en voici un qui fonctionne. :
var cmd = new SqlCommand("SELECT VATTerritoryID, ProductDescriptionID, VATBandID FROM VATTerritoryBandExceptions", conn);
var reader = cmd.ExecuteReader();
var someOtherObjectToLoad = new SomeOtherObjectType();
while (reader.Read())
{
someOtherObjectToLoad.Property1 = reader.GetInt32(row.GetOrdinal("VATTerritoryID"));
someOtherObjectToLoad.Property2 = reader.GetString(row.GetOrdinal("ProductDescriptionID"));
someOtherObjectToLoad.Property3 = reader.GetInt32(row.GetOrdinal("VATBandID"));
}
Je me doutais bien qu'il y avait des différences :
- La casse (je sais que c'est différent sous Windows/linux), mais mettre tout en minuscules n'a pas résolu le problème.
- les noms de colonne (peut-être Mono se soucie-t-il davantage des mots réservés ?), mais il semble que le remplacement de Name par [Name] ou 'Name' n'ait pas fait de différence.
L'erreur que j'ai eu dans le premier cas était :
[IndexOutOfRangeException: Array index is out of range.]
at System.Data.SqlClient.SqlDataReader.GetInt32(Int32 i)
Suggérant qu'il n'y a pas de "column1" dans le jeu de résultats retourné.
(EDIT : mise à jour de cette section pour plus de clarté)
Bizarrement, si je fais ça :
var cmd = new SqlCommand("SELECT ID, Name, VATTerritoryID, NativeCurrencyID FROM PricingZones", conn);
var reader = cmd.ExecuteReader();
var objectToLoad = new SomeObjectType();
while (reader.Read())
{
Console.WriteLine("First row, first column is " + row.GetValue(0));
Console.WriteLine("First row, second column is " + row.GetValue(1));
Console.WriteLine("First row, third column is " + row.GetValue(2));
Console.WriteLine("First row, fourth column is " + row.GetValue(3));
}
La sortie est :
First row, first column is 0
First row, second column is New
Array index is out of range.
Je suppose que quelque chose d'étrange se produit avec le framework Mono dans ce cas, mais je ne trouve pas de rapport de bogue pertinent, et je ne peux pas identifier pourquoi cela ne se produit que dans certains cas et pas dans d'autres ! Quelqu'un d'autre a-t-il eu une expérience similaire ?
EDIT : J'ai modifié certaines des déclarations pour qu'elles correspondent exactement à celles de la requête défaillante. au cas où il y aurait un problème avec les mots réservés ou autres. Notez que la requête que je lance dans le second cas demande réellement quatre colonnes et ne reçoit apparemment que deux colonnes très bizarres (0 | New ).