using System;
using System.Data.Common;
using System.Data;
using System.Collections.Generic;
using System.Linq;
using System.Reflection;
using System.IO;
namespace Developpez.Dotnet.Data
{
///
/// Fournit des méthodes d'extension pour faciliter l'utilisation des classes ADO.NET
///
public static class DataExtensions
{
#region Méthodes d'extension pour DbConnection
///
/// Crée une commande à partir d'une connection et d'une requête
///
/// La connection
/// Le texte de la requête
/// Une commande pour la connexion et la requête spécifiées
public static DbCommand CreateCommand(this DbConnection connection, string commandText)
{
DbCommand command = connection.CreateCommand();
command.CommandText = commandText;
return command;
}
#endregion
#region Méthodes d'extension pour DbCommand
///
/// Ajoute à la commande un paramètre avec les options spécifiées
///
/// La commande à laquelle ajouter un paramètre
/// Le nom du paramètre
/// Le type du paramètre
/// Le paramètre créé
public static DbParameter AddParameter(this DbCommand command, string name, DbType dbType)
{
return AddParameter(command, name, dbType, 0, ParameterDirection.Input);
}
///
/// Ajoute à la commande un paramètre avec les options spécifiées
///
/// La commande à laquelle ajouter un paramètre
/// Le nom du paramètre
/// Le type du paramètre
/// La taille du paramètre
/// Le paramètre créé
public static DbParameter AddParameter(this DbCommand command, string name, DbType dbType, int size)
{
return AddParameter(command, name, dbType, size, ParameterDirection.Input);
}
///
/// Ajoute à la commande un paramètre avec les options spécifiées
///
/// La commande à laquelle ajouter un paramètre
/// Le nom du paramètre
/// Le type du paramètre
/// La direction du paramètre
/// Le paramètre créé
public static DbParameter AddParameter(this DbCommand command, string name, DbType dbType, ParameterDirection direction)
{
DbParameter parameter = command.CreateParameter();
parameter.ParameterName = name;
parameter.DbType = dbType;
parameter.Direction = direction;
command.Parameters.Add(parameter);
return parameter;
}
///
/// Ajoute à la commande un paramètre avec les options spécifiées
///
/// La commande à laquelle ajouter un paramètre
/// Le nom du paramètre
/// Le type du paramètre
/// La taille du paramètre
/// La direction du paramètre
/// Le paramètre créé
public static DbParameter AddParameter(this DbCommand command, string name, DbType dbType, int size, ParameterDirection direction)
{
DbParameter parameter = command.CreateParameter();
parameter.ParameterName = name;
parameter.DbType = dbType;
parameter.Direction = direction;
parameter.Size = size;
command.Parameters.Add(parameter);
return parameter;
}
#endregion
#region Méthodes d'extension pour IDataRecord
///
/// Récupère la valeur de le colonne spécifiée en tant que Boolean
///
/// Le IDataRecord qui contient les données
/// Le nom de la colonne à récupérer
/// La valeur de la colonne
public static bool GetBoolean(this IDataRecord record, string name)
{
int i = record.GetOrdinal(name);
return record.GetBoolean(i);
}
///
/// Récupère la valeur de le colonne spécifiée en tant que Boolean, ou la valeur par défaut spécifiée si la colonne est DBNull
///
/// Le IDataRecord qui contient les données
/// Le nom de la colonne à récupérer
/// La valeur par défault à renvoyer si la colonne vaut DBNull
/// La valeur de la colonne, ou la valeur par défaut spécifiée si la colonne vaut DBNull
public static bool GetBooleanOrDefault(this IDataRecord record, string name, bool defaultValue)
{
int i = record.GetOrdinal(name);
return record.IsDBNull(i) ? defaultValue : record.GetBoolean(i);
}
///
/// Récupère la valeur de le colonne spécifiée en tant que Byte
///
/// Le IDataRecord qui contient les données
/// Le nom de la colonne à récupérer
/// La valeur de la colonne
public static byte GetByte(this IDataRecord record, string name)
{
int i = record.GetOrdinal(name);
return record.GetByte(i);
}
///
/// Récupère la valeur de le colonne spécifiée en tant que Byte, ou la valeur par défaut spécifiée si la colonne est DBNull
///
/// Le IDataRecord qui contient les données
/// Le nom de la colonne à récupérer
/// La valeur par défault à renvoyer si la colonne vaut DBNull
/// La valeur de la colonne, ou la valeur par défaut spécifiée si la colonne vaut DBNull
public static byte GetByteOrDefault(this IDataRecord record, string name, byte defaultValue)
{
int i = record.GetOrdinal(name);
return record.IsDBNull(i) ? defaultValue : record.GetByte(i);
}
///
/// Récupère la valeur de le colonne spécifiée en tant que Char
///
/// Le IDataRecord qui contient les données
/// Le nom de la colonne à récupérer
/// La valeur de la colonne
public static char GetChar(this IDataRecord record, string name)
{
int i = record.GetOrdinal(name);
return record.GetChar(i);
}
///
/// Récupère la valeur de le colonne spécifiée en tant que Char, ou la valeur par défaut spécifiée si la colonne est DBNull
///
/// Le IDataRecord qui contient les données
/// Le nom de la colonne à récupérer
/// La valeur par défault à renvoyer si la colonne vaut DBNull
/// La valeur de la colonne, ou la valeur par défaut spécifiée si la colonne vaut DBNull
public static char GetCharOrDefault(this IDataRecord record, string name, char defaultValue)
{
int i = record.GetOrdinal(name);
return record.IsDBNull(i) ? defaultValue : record.GetChar(i);
}
///
/// Récupère la valeur de le colonne spécifiée en tant que DateTime
///
/// Le IDataRecord qui contient les données
/// Le nom de la colonne à récupérer
/// La valeur de la colonne
public static DateTime GetDateTime(this IDataRecord record, string name)
{
int i = record.GetOrdinal(name);
return record.GetDateTime(i);
}
///
/// Récupère la valeur de le colonne spécifiée en tant que DateTime, ou la valeur par défaut spécifiée si la colonne est DBNull
///
/// Le IDataRecord qui contient les données
/// Le nom de la colonne à récupérer
/// La valeur par défault à renvoyer si la colonne vaut DBNull
/// La valeur de la colonne, ou la valeur par défaut spécifiée si la colonne vaut DBNull
public static DateTime GetDateTimeOrDefault(this IDataRecord record, string name, DateTime defaultValue)
{
int i = record.GetOrdinal(name);
return record.IsDBNull(i) ? defaultValue : record.GetDateTime(i);
}
///
/// Récupère la valeur de le colonne spécifiée en tant que Decimal
///
/// Le IDataRecord qui contient les données
/// Le nom de la colonne à récupérer
/// La valeur de la colonne
public static decimal GetDecimal(this IDataRecord record, string name)
{
int i = record.GetOrdinal(name);
return record.GetDecimal(i);
}
///
/// Récupère la valeur de le colonne spécifiée en tant que Decimal, ou la valeur par défaut spécifiée si la colonne est DBNull
///
/// Le IDataRecord qui contient les données
/// Le nom de la colonne à récupérer
/// La valeur par défault à renvoyer si la colonne vaut DBNull
/// La valeur de la colonne, ou la valeur par défaut spécifiée si la colonne vaut DBNull
public static decimal GetDecimalOrDefault(this IDataRecord record, string name, decimal defaultValue)
{
int i = record.GetOrdinal(name);
return record.IsDBNull(i) ? defaultValue : record.GetDecimal(i);
}
///
/// Récupère la valeur de le colonne spécifiée en tant que Double
///
/// Le IDataRecord qui contient les données
/// Le nom de la colonne à récupérer
/// La valeur de la colonne
public static double GetDouble(this IDataRecord record, string name)
{
int i = record.GetOrdinal(name);
return record.GetDouble(i);
}
///
/// Récupère la valeur de le colonne spécifiée en tant que Double, ou la valeur par défaut spécifiée si la colonne est DBNull
///
/// Le IDataRecord qui contient les données
/// Le nom de la colonne à récupérer
/// La valeur par défault à renvoyer si la colonne vaut DBNull
/// La valeur de la colonne, ou la valeur par défaut spécifiée si la colonne vaut DBNull
public static double GetDoubleOrDefault(this IDataRecord record, string name, double defaultValue)
{
int i = record.GetOrdinal(name);
return record.IsDBNull(i) ? defaultValue : record.GetDouble(i);
}
///
/// Récupère la valeur de le colonne spécifiée en tant que Float
///
/// Le IDataRecord qui contient les données
/// Le nom de la colonne à récupérer
/// La valeur de la colonne
public static float GetFloat(this IDataRecord record, string name)
{
int i = record.GetOrdinal(name);
return record.GetFloat(i);
}
///
/// Récupère la valeur de le colonne spécifiée en tant que Float, ou la valeur par défaut spécifiée si la colonne est DBNull
///
/// Le IDataRecord qui contient les données
/// Le nom de la colonne à récupérer
/// La valeur par défault à renvoyer si la colonne vaut DBNull
/// La valeur de la colonne, ou la valeur par défaut spécifiée si la colonne vaut DBNull
public static float GetFloatOrDefault(this IDataRecord record, string name, float defaultValue)
{
int i = record.GetOrdinal(name);
return record.IsDBNull(i) ? defaultValue : record.GetFloat(i);
}
///
/// Récupère la valeur de le colonne spécifiée en tant que Guid
///
/// Le IDataRecord qui contient les données
/// Le nom de la colonne à récupérer
/// La valeur de la colonne
public static Guid GetGuid(this IDataRecord record, string name)
{
int i = record.GetOrdinal(name);
return record.GetGuid(i);
}
///
/// Récupère la valeur de le colonne spécifiée en tant que Guid, ou la valeur par défaut spécifiée si la colonne est DBNull
///
/// Le IDataRecord qui contient les données
/// Le nom de la colonne à récupérer
/// La valeur par défault à renvoyer si la colonne vaut DBNull
/// La valeur de la colonne, ou la valeur par défaut spécifiée si la colonne vaut DBNull
public static Guid GetGuidOrDefault(this IDataRecord record, string name, Guid defaultValue)
{
int i = record.GetOrdinal(name);
return record.IsDBNull(i) ? defaultValue : record.GetGuid(i);
}
///
/// Récupère la valeur de le colonne spécifiée en tant que Int16
///
/// Le IDataRecord qui contient les données
/// Le nom de la colonne à récupérer
/// La valeur de la colonne
public static short GetInt16(this IDataRecord record, string name)
{
int i = record.GetOrdinal(name);
return record.GetInt16(i);
}
///
/// Récupère la valeur de le colonne spécifiée en tant que Int16, ou la valeur par défaut spécifiée si la colonne est DBNull
///
/// Le IDataRecord qui contient les données
/// Le nom de la colonne à récupérer
/// La valeur par défault à renvoyer si la colonne vaut DBNull
/// La valeur de la colonne, ou la valeur par défaut spécifiée si la colonne vaut DBNull
public static short GetInt16OrDefault(this IDataRecord record, string name, short defaultValue)
{
int i = record.GetOrdinal(name);
return record.IsDBNull(i) ? defaultValue : record.GetInt16(i);
}
///
/// Récupère la valeur de le colonne spécifiée en tant que Int32
///
/// Le IDataRecord qui contient les données
/// Le nom de la colonne à récupérer
/// La valeur de la colonne
public static int GetInt32(this IDataRecord record, string name)
{
int i = record.GetOrdinal(name);
return record.GetInt32(i);
}
///
/// Récupère la valeur de le colonne spécifiée en tant que Int32, ou la valeur par défaut spécifiée si la colonne est DBNull
///
/// Le IDataRecord qui contient les données
/// Le nom de la colonne à récupérer
/// La valeur par défault à renvoyer si la colonne vaut DBNull
/// La valeur de la colonne, ou la valeur par défaut spécifiée si la colonne vaut DBNull
public static int GetInt32OrDefault(this IDataRecord record, string name, int defaultValue)
{
int i = record.GetOrdinal(name);
return record.IsDBNull(i) ? defaultValue : record.GetInt32(i);
}
///
/// Récupère la valeur de le colonne spécifiée en tant que Int64
///
/// Le IDataRecord qui contient les données
/// Le nom de la colonne à récupérer
/// La valeur de la colonne
public static long GetInt64(this IDataRecord record, string name)
{
int i = record.GetOrdinal(name);
return record.GetInt64(i);
}
///
/// Récupère la valeur de le colonne spécifiée en tant que Int64, ou la valeur par défaut spécifiée si la colonne est DBNull
///
/// Le IDataRecord qui contient les données
/// Le nom de la colonne à récupérer
/// La valeur par défault à renvoyer si la colonne vaut DBNull
/// La valeur de la colonne, ou la valeur par défaut spécifiée si la colonne vaut DBNull
public static long GetInt64OrDefault(this IDataRecord record, string name, long defaultValue)
{
int i = record.GetOrdinal(name);
return record.IsDBNull(i) ? defaultValue : record.GetInt64(i);
}
///
/// Récupère la valeur de le colonne spécifiée en tant que String
///
/// Le IDataRecord qui contient les données
/// Le nom de la colonne à récupérer
/// La valeur de la colonne
public static string GetString(this IDataRecord record, string name)
{
int i = record.GetOrdinal(name);
return record.GetString(i);
}
///
/// Récupère la valeur de le colonne spécifiée en tant que String, ou la valeur par défaut spécifiée si la colonne est DBNull
///
/// Le IDataRecord qui contient les données
/// Le nom de la colonne à récupérer
/// La valeur par défault à renvoyer si la colonne vaut DBNull
/// La valeur de la colonne, ou la valeur par défaut spécifiée si la colonne vaut DBNull
public static string GetStringOrDefault(this IDataRecord record, string name, string defaultValue)
{
int i = record.GetOrdinal(name);
return record.IsDBNull(i) ? defaultValue : record.GetString(i);
}
///
/// Récupère la valeur de le colonne spécifiée
///
/// Le IDataRecord qui contient les données
/// Le nom de la colonne à récupérer
/// La valeur de la colonne
public static object GetValue(this IDataRecord record, string name)
{
int i = record.GetOrdinal(name);
return record.GetValue(i);
}
///
/// Récupère la valeur de le colonne spécifiée, ou la valeur par défaut spécifiée si la colonne est DBNull
///
/// Le IDataRecord qui contient les données
/// Le nom de la colonne à récupérer
/// La valeur par défault à renvoyer si la colonne vaut DBNull
/// La valeur de la colonne, ou la valeur par défaut spécifiée si la colonne vaut DBNull
public static object GetValueOrDefault(this IDataRecord record, string name, object defaultValue)
{
int i = record.GetOrdinal(name);
return record.IsDBNull(i) ? defaultValue : record.GetValue(i);
}
///
/// Lit un flux binaire de la colonne spécifiée
///
/// Le IDataRecord qui contient les données
/// Le nom de la colonne à lire
/// La position à laquelle commence la lecture dans la colonne
/// Le buffer de destination
/// La position à laquelle commence l'écriture dans le buffer
/// Le nombre maximum d'octets à lire
/// Le nombre d'octets lus
public static long GetBytes(this IDataRecord record, string name, long dataOffset, byte[] buffer, int bufferOffset, int length)
{
int i = record.GetOrdinal(name);
return record.GetBytes(i, dataOffset, buffer, bufferOffset, length);
}
///
/// Lit un flux de caractères de la colonne spécifiée
///
/// Le IDataRecord qui contient les données
/// Le nom de la colonne à lire
/// La position à laquelle commence la lecture dans la colonne
/// Le buffer de destination
/// La position à laquelle commence l'écriture dans le buffer
/// Le nombre maximum de caractères à lire
/// Le nombre de caractères lus
public static long GetChars(this IDataRecord record, string name, long dataOffset, char[] buffer, int bufferOffset, int length)
{
int i = record.GetOrdinal(name);
return record.GetChars(i, dataOffset, buffer, bufferOffset, length);
}
///
/// Indique si la colonne spécifiée a la valeur DBNull
///
/// Le IDataRecord qui contient les données
/// Le nom de la colonne à lire
/// True si la colonne vaut DBNull, false sinon
public static bool IsDBNull(this IDataRecord record, string name)
{
int i = record.GetOrdinal(name);
return record.IsDBNull(i);
}
///
/// Renvoie le nom du type de données de la colonne spécifiée
///
/// Le IDataRecord qui contient les données
/// Le nom de la colonne dont on veut obtenir le type de données
/// Le nom du type de données de la colonne
public static string GetDataTypeName(this IDataRecord record, string name)
{
int i = record.GetOrdinal(name);
return record.GetDataTypeName(i);
}
///
/// Renvoie le type .NET de la colonne spécifiée
///
/// Le IDataRecord qui contient les données
/// Le nom de la colonne dont on veut obtenir le type .NET
/// Le nom type .NET de la colonne
public static Type GetFieldType(this IDataRecord record, string name)
{
int i = record.GetOrdinal(name);
return record.GetFieldType(i);
}
///
/// Renvoie la valeur de la colonne spécifiée en tant que valeur du type spécifié
///
/// Le type de retour souhaité
/// Le IDataRecord qui contient les données
/// L'index de la colonne à récupérer
/// true pour tenter de convertir la valeur si elle n'est pas de type T ; false pour effectuer un cast direct
/// La valeur de la colonne
/// La conversion spécifiée n'est pas valide
public static T Field(this IDataRecord record, int ordinal, bool tryConvert)
{
if (tryConvert)
return ConvertT.Convert(record[ordinal]);
else
return UnboxT.Unbox(record[ordinal]);
}
///
/// Renvoie la valeur de la colonne spécifiée en tant que valeur du type spécifié
///
/// Le type de retour souhaité
/// Le IDataRecord qui contient les données
/// L'index de la colonne à récupérer
/// La valeur de la colonne
/// La conversion spécifiée n'est pas valide
public static T Field(this IDataRecord record, int ordinal)
{
return record.Field(ordinal, false);
}
///
/// Renvoie la valeur de la colonne spécifiée en tant que valeur du type spécifié
///
/// Le type de retour souhaité
/// Le IDataRecord qui contient les données
/// Le nom de la colonne à récupérer
/// true pour tenter de convertir la valeur si elle n'est pas de type T ; false pour effectuer un cast direct
/// La valeur de la colonne
/// La conversion spécifiée n'est pas valide
public static T Field(this IDataRecord record, string name, bool tryConvert)
{
int i = record.GetOrdinal(name);
return record.Field(i, tryConvert);
}
///
/// Renvoie la valeur de la colonne spécifiée en tant que valeur du type spécifié
///
/// Le type de retour souhaité
/// Le IDataRecord qui contient les données
/// Le nom de la colonne à récupérer
/// La valeur de la colonne
/// La conversion spécifiée n'est pas valide
public static T Field(this IDataRecord record, string name)
{
int i = record.GetOrdinal(name);
return record.Field(i, false);
}
#region Classes utilitaires UnboxT et ConvertT pour convertir les valeurs de champ
// Tiré de la classe System.Data.DataRowExtensions de .NET 3.5
private static class UnboxT
{
internal static readonly Converter