, nico-pyright(c) Suite à ce billet [.NET][SGBD][SQL Server] [Sql Serveur 2008] Le type HierarchyID et les datasets typés, j’ai crée une petite fonction, incomplète pour l’instant, qui permet d’appeler une procédure stockée avec les bons paramètres, dont les paramètres de type HierarchyID.
L’”astuce” consiste en l’utilisation du tableau typeAndSqlTypeAndUdt qui permet de faire la relation entre un type .Net et son type SQL Server (agrémenté de l’UDT si besoin).
Voici le code de démo :
class Program
{
static void Main()
{
List<SqlParamObject> paramObjects = new List<SqlParamObject>
{
new SqlParamObject { ParameterName = "@Guid", Type = typeof (Guid), Value = monGuid },
new SqlParamObject { ParameterName = "@MonEntier", Type = typeof (int), Value = monEntier },
new SqlParamObject { ParameterName = "@HierarchyID", Type = typeof (SqlHierarchyId), Value = hierarchyID },
};
ExecuteNonQuery(
ConfigurationManager.ConnectionStrings["MA_CONNEXION"], "maProcedureStockee", paramObjects);
}
public static void ExecuteNonQuery(ConnectionStringSettings connectionStringSettings, string storedProcedureName, List<SqlParamObject> sqlParamObjects)
{
DbProviderFactory factory = DbProviderFactories.GetFactory(connectionStringSettings.ProviderName);
using (IDbConnection connection = factory.CreateConnection())
{
connection.ConnectionString = connectionStringSettings.ConnectionString;
connection.Open();
using (IDbCommand command = factory.CreateCommand())
{
command.Connection = connection;
foreach (SqlParamObject paramObject in sqlParamObjects)
{
string paramName = paramObject.ParameterName.StartsWith("@") ? paramObject.ParameterName : string.Format("@{0}", paramObject.ParameterName);
var typeAndUdtTypeName = GetTypeAndUdtTypeNameFromType(paramObject.Type);
object value = paramObject.Value ?? DBNull.Value;
SqlParameter sqlParameter = new SqlParameter(paramName, typeAndUdtTypeName.Key) { UdtTypeName = typeAndUdtTypeName.Value, Value = value };
command.Parameters.Add(sqlParameter);
}
command.CommandType =
CommandType.StoredProcedure;
command.CommandText = storedProcedureName;
command.ExecuteNonQuery();
}
}
}
private static KeyValuePair<SqlDbType, string> GetTypeAndUdtTypeNameFromType(Type type)
{
Dictionary<Type, KeyValuePair<SqlDbType, string>> typeAndSqlTypeAndUdt = new Dictionary<Type, KeyValuePair<SqlDbType, string>>
{
typeof(bool), new KeyValuePair<SqlDbType, string>(SqlDbType.Bit, "") },
{ typeof(byte), new KeyValuePair<SqlDbType, string>(SqlDbType.TinyInt, "") },
{ typeof(byte[]), new KeyValuePair<SqlDbType, string>(SqlDbType.Image, "") },
{ typeof(DateTime), new KeyValuePair<SqlDbType, string>(SqlDbType.DateTime, "") },
{ typeof(decimal), new KeyValuePair<SqlDbType, string>(SqlDbType.Decimal, "") },
{ typeof(double), new KeyValuePair<SqlDbType, string>(SqlDbType.Float, "") },
{ typeof(Guid), new KeyValuePair<SqlDbType, string>(SqlDbType.UniqueIdentifier, "") },
{ typeof(Int16), new KeyValuePair<SqlDbType, string>(SqlDbType.SmallInt, "") },
{ typeof(Int32), new KeyValuePair<SqlDbType, string>(SqlDbType.Int, "") },
{ typeof(Int64), new KeyValuePair<SqlDbType, string>(SqlDbType.BigInt, "") },
{ typeof(object), new KeyValuePair<SqlDbType, string>(SqlDbType.Variant, "") },
{ typeof(string), new KeyValuePair<SqlDbType, string>(SqlDbType.VarChar, "") },
{ typeof(int?), new KeyValuePair<SqlDbType, string>(SqlDbType.Int, "") },
{ typeof(SqlHierarchyId), new KeyValuePair<SqlDbType, string>(SqlDbType.Udt, "HierarchyId") }
};
if (typeAndSqlTypeAndUdt.ContainsKey(type))
return typeAndSqlTypeAndUdt[type];
throw new NotImplementedException(string.Format("Type {0} is not yet supported", type));
}
}
public class SqlParamObject
{
public string ParameterName { get; set; }
public object Value { get; set; }
public Type Type { get; set; }
}
Notez que je ne peux pas faire un GetType de l’objet pour avoir son type, si celui-ci est nul, d’où l’utilisation d’une propriété Type.
Vous devez être identifié pour poster un commentaire.
, nico-pyright(c) J'ai essayé d'exécuter une procédure stockée qui avait en paramètre un type HierarchyID.
Un truc du genre :
Et je me suis retrouvé avec cette erreur :
La propriété UdtTypeName doit être définie pour les paramètres UDT
J'ai essayé de voir où on pouvait mettre ce fameux paramètre dans mon dataset, mais j'ai été incapable de le trouver.
Vous devez être identifié pour poster un commentaire.
, nico-pyright(c) Nonon, ca ne sera pas un cours sur le type HierarchyID, je ne suis aucunement DBA :)
Mais comme tout développeur, j'ai besoin de modéliser des tables de base de données et d'écrire du SQL.
J'ai pu lire 2-3 petites choses sur le net sur les HierarchyID mais toujours le même exemple, celui de la hiérarchie entre les employés d'une boite.
Je vous livre ici le fruit de mes recherches.
Je me propose ici de modéliser un disque dur, c'est à dire un volume, composé de dossiers ou de fichiers, qui peuvent eux même contenir des sous-dossiers ou des fichiers.
On aura donc trois tables :
Vous devez être identifié pour poster un commentaire.
| Lun | Mar | Mer | Jeu | Ven | Sam | Dim |
|---|---|---|---|---|---|---|
| 1 | ||||||
| 2 | 3 | 4 | 5 | 6 | 7 | 8 |
| 9 | 10 | 11 | 12 | 13 | 14 | 15 |
| 16 | 17 | 18 | 19 | 20 | 21 | 22 |
| 23 | 24 | 25 | 26 | 27 | 28 | 29 |
| 30 |
Copyright © 2000-2012 - www.developpez.com