Beispiel #1
0
        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);
        }
Beispiel #2
0
        /// <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;
                            }
                        }
                    }
                }
            }
        }