public int ActualizaObjetoPersistenteByClavePrimaria <T>(T beanOriginal, T beanModificado, DbConnection connection, DbTransaction tr) { //calculamos el tipo de T para obtener información sobre los objetos que queremos contruir //a partir de la base de datos Type tipo = typeof(T); //comprobamos que el tipo sea persistente if (tipo.IsDefined(typeof(ObjetoPersistente), false)) { //generamos el nombre de la tabla por defecto a partir del nombre del tipo string nombreTabla = CalcularNombreTabla(tipo); #region Calcular el comando de inserccion DbCommandBuilder comandBuilder = CrearDBCommandBuilder(nombreTabla, connection, tr); DbCommand comandoInsert = comandBuilder.GetUpdateCommand(true); if (tr != null) { comandoInsert.Transaction = tr; } StringBuilder sql = new StringBuilder(comandoInsert.CommandText.Split("WHERE".ToCharArray())[0]); AtributoPersistente k = GetFieldInfoPrimaryKey(beanOriginal); if (k != null) { sql.AppendFormat(" WHERE {0}=:{0}", k.MapeadoPor); } #endregion //connection.Close(); //connection.Open(); DbCommand updateCommand = _factoria.CreateCommand(); if (tr != null) { updateCommand.Transaction = tr; } updateCommand.CommandText = sql.ToString(); updateCommand.Connection = connection; DbParameterCollection parametrosComando = updateCommand.Parameters; //rellenamos las condiciones del comando para buscar el bean a modificar RellenarParametrosFrom <T>(beanOriginal, parametrosComando, "Original_"); //rellenamos los valores que queremos modificar RellenarParametrosFrom <T>(beanModificado, parametrosComando); return(updateCommand.ExecuteNonQuery()); } return(-1); }
/// <summary> /// Rellena la colección de parametros con los valores de los atributos mapeados en la base de datos /// </summary> /// <typeparam name="T">Tipo genérico</typeparam> /// <param name="bean">Obqueto persistente</param> /// <param name="dbParameterCollection">Colección de parametros que se quiere rellenar</param> /// <param name="prefijo">prefijo común que tienen todos los parámetros que se quiere rellenar</param> private void RellenarParametrosFrom <T>(T bean, DbParameterCollection dbParameterCollection, string prefijo) { Type tipo = typeof(T); //comprobamos que sea un objeto persistente if (tipo.IsDefined(typeof(ObjetoPersistente), false)) { //hacemos bind de todos los atributos de la case foreach (FieldInfo var in tipo.GetFields(BindingFlags.Instance | BindingFlags.NonPublic)) { //para cada atributo vemos si es persistente AtributoPersistente[] attrs = var.GetCustomAttributes(typeof(AtributoPersistente), false) as AtributoPersistente[]; if (attrs.Length > 0) { //obtenemos el nombre del campo que mapea este atributo AtributoPersistente atributo = attrs[0]; string mapeadoPor = atributo.MapeadoPor; //si no se ha especificado ningún nombre de columa de la base datos, le asignamos el nombre del atributo if (string.IsNullOrEmpty(mapeadoPor)) { mapeadoPor = var.Name; } if (!string.IsNullOrEmpty(prefijo)) { mapeadoPor = prefijo + mapeadoPor; } //vemos si existe una columna que contenga el nombre que se mapea dbParameterCollection.Add(CreateParameter(mapeadoPor, null));//esta línea es distinta a la versión vb.net. Hay que estudiar si efectivamente debe estar aqui. if (dbParameterCollection.Contains(mapeadoPor)) { DbParameter parametro = dbParameterCollection[mapeadoPor]; object objeto = var.GetValue(bean); parametro.Value = DBNull.Value; if (objeto != null && !(atributo.PerminteNulo && atributo.ValorNulo.Equals(Convert.ToString(objeto), StringComparison.InvariantCultureIgnoreCase))) { parametro.Value = objeto; } } } } } }