Bonjour,
Voila j'ai crée une classe généric appelé Object qui est censé pouvoir charger/sauvegarder/modifier n'importe lequel de mes objets metiers.
Chaqu'un de mes objets metiers sont hérité d'une classe générique appelé Table, ils possède en plus un attribut qui définit le nom de la table et la clé primaire de la table en base. Chacune des propriétés possèdent un attribut correspodant au nom et au type du champ en base.
Ca c'est pour le contexte. Mon problème se situe au niveau de la sauvegarde. A chaque fois que je veux sauvegarder un object, je boucle sur les attribut et je récupère le nom du champs et la valeur associé, je construit ma requête comme ca.
La structure de la requête est correct mais les valuers ne sont pas remplacé. Par exemple pour une requête du type insert il me mettra :
INSERT INTO test (id, value) values (@ID, @value). Il ne remplace pas les identifiants des paramètres par leurs valeurs.
Voici mon code, j'éspère avoir été assez clair :
public static void SaveObject(AGDDataTable poObject)
{
MySqlConnection cn;
MySqlParameter param;
MySqlCommand cmd;
String sSqlUpdate;
String sSqlInsertFields;
String sSqlInsertValues;
Type type = poObject.GetType();
AGDTable atrTable = ((AGDTable[])type.GetCustomAttributes(typeof(AGDTable), true))[0];
String sTableName = atrTable.TableName;
String sPrimaryKey = atrTable.PrimaryKey;
String sVirgule = "";
sSqlUpdate = "UPDATE " + sTableName + " SET ";
sSqlInsertFields = "INSERT INTO " + sTableName + "(" + sPrimaryKey;
sSqlInsertValues = " VALUES(@ID";
foreach (PropertyInfo pi in type.GetProperties())//Construction de la requête à partir des propriétés de ma classe
{
AGDField[] aoField = (AGDField[])pi.GetCustomAttributes(typeof(AGDField), false);
if (aoField.Length > 0)
{
String sFieldName = aoField[0].FieldName;
sSqlUpdate += sVirgule + sFieldName + " = @" + sFieldName;
sSqlInsertFields += ", " + sFieldName;
sSqlInsertValues += ", @" + sFieldName;
sVirgule = ", ";
}
}
sSqlUpdate += " WHERE " + sPrimaryKey + " = @ID";
sSqlInsertFields += " )";
sSqlInsertValues += " )";
cn = new MySqlConnection(Properties.Resources.SECUConnectionString);
cn.Open();
if (poObject.Id > 0)
{
cmd = new MySqlCommand(sSqlUpdate, cn);
}
else
{
poObject.Id = GetNextId(sTableName);
cmd = new MySqlCommand(sSqlInsertFields + sSqlInsertValues, cn);
}
foreach (PropertyInfo pi in type.GetProperties())//Création des parametres
{
AGDField[] aoField = (AGDField[])pi.GetCustomAttributes(typeof(AGDField), false);
if (aoField.Length > 0)
{
//Récupère l'attribut AGDField permettant de savoir le nom du champ et le type en base
AGDField field = aoField[0];
param = new MySqlParameter(field.FieldName, field.DBType);
//Récupère la valeur de cette propriété pour cette instance d'objet
param.Value = pi.GetValue(poObject, null);
cmd.Parameters.Add(param);
}
}
param = new MySqlParameter(sPrimaryKey, MySqlDbType.Int64);
param.Value = poObject.Id;
cmd.Parameters.Add(param);
try
{
cmd.ExecuteNonQuery();
}
catch (Exception excp)
{
Exception myExcp = new Exception("Could not Save " + poObject.GetType().Name + ". Error: " +
excp.Message, excp);
throw (myExcp);
}
}
Voila si quelqu'un sait pourquoi mes paramètres sont mal pris en compte je suis tout ouie