J'ai construit une enveloppe autour de NpgSQL pour un tas de méthodes que j'utilise habituellement dans le DAL de mes projets. Deux d'entre eux, j'utilise habituellement pour remplir des DTO directement à partir d'un DataReader. Habituellement, dans une méthode d'assistant de remplissage, j'instancie le DTO et je parcourt les propriétés qui mappent les données du Datareader à la propriété correspondante. La méthode de remplissage est générée la plupart du temps.NpgSQLdataReader GetOrdinal jeter des exceptions .. n'importe comment?
Puisque j'autorise la plupart des propriétés à être nulles ou à utiliser les valeurs par défaut du DTO, j'ai utilisé une méthode pour vérifier si les données de dataReader sont valides pour la propriété avant de remplir la propriété. Donc, je vais avoir un IsValidString (« fieldname ») et méthodes DRGetString (« fieldname »), comme suit:
public bool IsValidString(string fieldName)
{
if (data.GetOrdinal(fieldName) != -1
&& !data.IsDBNull(data.GetOrdinal(fieldName)))
return true;
else
return false;
}
public string DRGetString(string fieldName)
{
return data.GetString(data.GetOrdinal(fieldName));
}
Ma méthode de remplissage est delagated à toute méthode exécutée la requête et ressemble à:
public static object FillObject(DataParse<PostgreSQLDBDataParse> dataParser)
{
TipoFase obj = new TipoFase();
if (dataParser.IsValidInt32("T_TipoFase"))
obj.T_TipoFase = dataParser.DRGetInt32("T_TipoFase");
if (dataParser.IsValidString("NM_TipoFase"))
obj.NM_TipoFase = dataParser.DRGetString("NM_TipoFase");
//...rest of the properties .. this is usually autogenerated by a T4 template
return obj;
}
Cela fonctionnait bien et dandy dans NpgSQL pre 2.02. . Lorsque la méthode GetOrdinal a été appelée, et si le champ était inexistant dans dataReader, j'obtiendrais simplement un -1 retourné. Facile à retourner false dans IsValidString() et passez simplement à la propriété suivante. Le coup de performance de la vérification des champs inexistants était pratiquement négligeable.
Malheureusement, les modifications apportées à NpgSQL font que GetOrdinal génère une exception lorsque le champ n'existe pas. J'ai une solution de contournement simple dans laquelle j'emballe le code dans un try/catch et lance false dans le catch. Mais je peux sentir le coup dans la performance, surtout quand je vais en mode débogage. Remplir une longue liste prend quelques minutes. En fait, NpgSQL a un paramètre qui peut être ajouté à la chaîne de connexion (Compatibilité) pour supporter la compatibilité ascendante de cette méthode, mais je n'ai jamais réussi à le faire fonctionner correctement (je reçois toujours une exception à cause d'un mal formé). chaîne de connexion). Quoi qu'il en soit, je cherche des suggestions pour de meilleures solutions de contournement. Une meilleure façon de remplir l'objet à partir du lecteur de données ou même de contourner le problème d'exception?