none
Obtener el tamaño de un campo RRS feed

  • Pregunta

  • Hola quiero obtener el tamaño de un campo de una tabla por ejemplo si tengo un campo nombre en una tabla que su tamaño es de 50, Nombre varchar(50)

    Que en mi formulario la caja de texto nombre me permita ingresar 50 caracteres no mas, pero ese dato lo quiero leer desde la base de datos se me ocurre usar este STORE sp_columns Personal.

    por ejemplo de Nombre es 60 entonces quiero ponerle el tamaño en mi caja de texto, no se si haya alguna manera de obtener el resultado que quiero con este resultado qeu me da el store.


    Pedro Ávila
    "El hombre sabio querrá estar siempre con quien sea mejor que él."
    Lima - Perú

    • Tipo cambiado Pedro Ávila jueves, 3 de abril de 2014 18:05 me equivoque
    miércoles, 2 de abril de 2014 3:04

Respuestas

  • Eso ya lo sabemos y ya te han respondido.

    ¿Tienes tus propias clases de negocio?

    Pues ponles el atributo MaxLength como te he dicho antes.

    ¿Cargas los datos a partir de un DataReader?

    El DataReader tiene un método GetSchemaTable que te da la información que pides.

    Pero no machaques la base de datos en tiempo de ejecución con sp_columns


    "No darás tropezón ni desatino que no te haga adelantar camino" Bernardo Balbuena

    miércoles, 2 de abril de 2014 12:03
  • Este atributo el MaxLength es nuevo en .NET Framework 4.5. Con VS 2010 no lo tienes ¿Qué VS tienes?

    Primero tienes que añadir una referencia al ensamblado System.ComponentModel.DataAnnotations. Son las propiedades las que tienen que tener el attibuto MaxLength. El attributo AttributeUsage es un attributo que se les pone a los atributos para saber a qué es aplicable un atributo:

    Aquí tienes un ejemplo:

    using System;
    using System.Collections.Generic;
    using System.ComponentModel.DataAnnotations;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;
    
    namespace ConsoleApplication3
    {
        public class CiaEntity
        {
            [MaxLength(20)]
            public string Cia_Id { get; set; }
    
            [MaxLength(40)]
            public string RUC { get; set; }
    
            [MaxLength(40)]
            public string RS { get; set; }
            [MaxLength(40)]
            public string Nom_Com { get; set; }
            [MaxLength(80)]
            public string RepLegal { get; set; }
    
            [MaxLength(80)]
            public string Direccion { get; set; }
    
            [MaxLength(20)]
            public string Ubigeo_Id { get; set; }
    
            [MaxLength(20)]
            public string Grp_Id { get; set; }
    
            [MaxLength(20)]
            public string GE_Id { get; set; }
    
            [MaxLength(12)]
            public string Telefono { get; set; }
    
            [MaxLength(40)]
            public string Enc_1 { get; set; }
    
            [MaxLength(40)]
            public string Enc_2 { get; set; }
    
            [MaxLength(40)]
            public string Enc_3 { get; set; }
    
            [MaxLength(40)]
            public string UserSNT { get; set; }
    
            [MaxLength(40)]
            public string ClaveSOL { get; set; }
    
            [MaxLength(40)]
            public string CodCiaOrig { get; set; }
    
            [MaxLength(40)]
            public string DBOrig { get; set; }
            [MaxLength(40)]
            public Int16 Estado { get; set; }
        }
    
        public static class TypeExtensions
        {
    
            public static int GetMaxLength(this Type type, string propertyName)
            {
                var attrs = type.GetProperty(propertyName).GetCustomAttributes(typeof(MaxLengthAttribute), true);
                if (attrs.Length > 0)
                {
                    return ((MaxLengthAttribute)attrs[0]).Length;
                }
                return -1;
            }
        }
    
        class Program
        {
            static void Main(string[] args)
            {
                Console.WriteLine("MaxLength de dirección {0}", typeof(CiaEntity).GetMaxLength("Direccion"));
            }
        }
    }
    


    "No darás tropezón ni desatino que no te haga adelantar camino" Bernardo Balbuena

    miércoles, 2 de abril de 2014 13:41
  • using (SqlConnection cn = new SqlConnection(ConfigurationManager.ConnectionStrings["default"].ToString()))
    {
        cn.Open();
        SqlCommand cmd = cn.CreateCommand();
        cmd.CommandText = "SELECT * FROM Cias";
        var reader = cmd.ExecuteReader(CommandBehavior.SchemaOnly);
        var schema = reader.GetSchemaTable();
        foreach (DataRow row in schema.Rows)
        {
            // Muesta nombre del campo y la longitud
            Console.WriteLine("{0}: {1}", row["ColumnName"], row["ColumnSize"]);
        }
    }
    Si lo único que quieres es la estructura de la tabla, lo mejor es CommandBehavior.SchemaOnly ya que así no se devuelve ninguna fila, sólo metadatos.

    "No darás tropezón ni desatino que no te haga adelantar camino" Bernardo Balbuena

    miércoles, 2 de abril de 2014 13:55
  • Pedro

    Te recomiendo visitar este enlace. 

    http://technet.microsoft.com/es-es/library/ms189082(v=sql.105).aspx

    En éste se menciona como leer el esquema de la base de datos

    SELECT TABLE_NAME, COLUMN_NAME, COLUMNPROPERTY(OBJECT_ID(TABLE_SCHEMA + '.' + TABLE_NAME), COLUMN_NAME, 'ColumnID') AS COLUMN_ID
    FROM AdventureWorks2008R2.INFORMATION_SCHEMA.COLUMNS
    WHERE TABLE_NAME = 'Person';

    Con esto, puedes fácilmente consultar el tamaño de cada campo y aplicarlo a los elementos de tu interfaz.

    Saludos


    Viper.NET

    jueves, 3 de abril de 2014 15:53

Todas las respuestas

  • Hola:

    El textbox tiene la propiedad .MaxLength, y si el campo de tu tabla también tiene una propiedad .MaxLength:

    MyTxtBox.MaxLength = MyDataTable.Columns("QueCampo").MaxLength

    Saludos

    miércoles, 2 de abril de 2014 7:28
  • hola

    podrias consultar el schema de la definicion de la tabla

     

    accediendo al schema podrias consultar como esta definido la db y las tablas

    saludos


    Leandro Tuttini

    Blog
    Buenos Aires
    Argentina

    miércoles, 2 de abril de 2014 10:32
  • Hola LG DES, el problemita que no trabajo con DataSet.

    Pedro Ávila
    "El hombre sabio querrá estar siempre con quien sea mejor que él."
    Lima - Perú

    miércoles, 2 de abril de 2014 11:13
  • ¿ Y con qué trabajas? ese pequeño detalle parece tiene bastante importancia.

    Yo trabajo con EntityLite y en ese caso lo haría de la siguiente manera, sin hacer consulta a la base de datos, puesto que esa información la tengo en los metadatos de mis entidades.

    Obtener el tamaño de la propiedad "CategoryName" de la entidad "Category":

    int sizeOfCategoryName = typeof(Category).GetEntityMetadata().Properties["CategoryName"].SqlField.Size;


    "No darás tropezón ni desatino que no te haga adelantar camino" Bernardo Balbuena

    miércoles, 2 de abril de 2014 11:25
  • Hola Jesus

    Trabajo con listas cuando se trata de grillas(DGV) pero en este caso cuando me carga el formulario Personal por ejemplo ya necesito establecer el tamaño del maxleng de la caja de texto, para luego seguir ingresar los datos al formulario, para las operaciones CRUD solo uso ADO.NET


    Pedro Ávila
    "El hombre sabio querrá estar siempre con quien sea mejor que él."
    Lima - Perú

    miércoles, 2 de abril de 2014 11:32
  • Listas de qué?

    ¿Creas tú mismo las clases que representan las entidades?

    Si es así podrías decorar las propiedades con en atributo MaxLength y leerlo en tiempo de ejecución. Así evitarías consultas a la base de datos. Esa información ya está disponible en tiempo de diseño y por tanto debería evitarse hacer consultas a la base de datos para determinarlo en tiempo de ejecución.


    "No darás tropezón ni desatino que no te haga adelantar camino" Bernardo Balbuena


    miércoles, 2 de abril de 2014 11:42
  • Cuando cargo datos en un DGV uso lista, pero aprender un ORM por ahora no puedo por cuestion de tiempo pero estoy aprendiendo EF en mis ratos libres, por donde puedo comenzar para lograr mi objetivo, necesito hacer un programita que esa información de la imagen me lo lleve a un txt? para luego leer desde ahí los datos?



    Pedro Ávila
    "El hombre sabio querrá estar siempre con quien sea mejor que él."
    Lima - Perú

    miércoles, 2 de abril de 2014 11:46
  • Hola:

    ¿Y cómo/con qué trabajas?

    Dices más abajo que haces CRUD con ADO.NET, pues en el momento de hacer la R(ead) de los datos, ahí tienes la información de todos los campos de tu tabla.

    Saludos

    miércoles, 2 de abril de 2014 11:51
  • Mi problema se centra en que necesito obtener el tamaño del campo de la tabla, se me ocurrió usar este SP_columns como muestro al inicio del hilo, para que quiero obtener el tamaño del campo de la tabla es para ponerlo en el maxleng de las cajas de texto, como por ejemplo tengo una caja de te texto nombre en la cual me permite ingresar 80 caracteres, tengo un campo RUC que me permite ingresar solo 11 caracteres.

    Eso es lo que quiero lograr.


    Pedro Ávila
    "El hombre sabio querrá estar siempre con quien sea mejor que él."
    Lima - Perú

    miércoles, 2 de abril de 2014 11:58
  • Eso ya lo sabemos y ya te han respondido.

    ¿Tienes tus propias clases de negocio?

    Pues ponles el atributo MaxLength como te he dicho antes.

    ¿Cargas los datos a partir de un DataReader?

    El DataReader tiene un método GetSchemaTable que te da la información que pides.

    Pero no machaques la base de datos en tiempo de ejecución con sp_columns


    "No darás tropezón ni desatino que no te haga adelantar camino" Bernardo Balbuena

    miércoles, 2 de abril de 2014 12:03
  • ¿Tienes tus propias clases de negocio?

    Si trabajo en capas

    Gracias por las recomendaciones lo pondré en práctica y les cuento como me va.


    Pedro Ávila
    "El hombre sabio querrá estar siempre con quien sea mejor que él."
    Lima - Perú

    miércoles, 2 de abril de 2014 12:19
  • Que trabajes con capas no significa que tengas tus clases de negocio. En el año 2002 yo trabajaba con capas, pero usaba data adapters, datatables y datasets

    "No darás tropezón ni desatino que no te haga adelantar camino" Bernardo Balbuena

    miércoles, 2 de abril de 2014 12:24
  • Jesús, siguiendo el link que me recomiendas sería algo así

     /// <summary>
        /// Entidad de la compañia.
        /// </summary>
        [AttributeUsage(AttributeTargets.Property | AttributeTargets.Field | AttributeTargets.Parameter, AllowMultiple = false)]
        public class CiaEntity 
        {
            public string Cia_Id { get; set; }
            public string RUC { get; set; }
            public string RS { get; set; }
            public string Nom_Com { get; set; }
            public string RepLegal { get; set; }
            public string Direccion { get; set; }
            public string Ubigeo_Id { get; set; }
            public string Grp_Id {get; set;}
            public string GE_Id { get; set; }
            public string Telefono { get; set; }
            public string Enc_1 { get; set; }
            public string Enc_2 { get; set; }
            public string Enc_3 { get; set; }
            public string UserSNT { get; set; }
            public string ClaveSOL { get; set; }
            public string CodCiaOrig { get; set; }
            public string DBOrig { get; set; }
            public Int16 Estado { get; set; }
        }

    Tu me dices atributo te entiendo que le agregue a mi entidad uno mas con nombre MaxLength


    Pedro Ávila
    "El hombre sabio querrá estar siempre con quien sea mejor que él."
    Lima - Perú

    miércoles, 2 de abril de 2014 12:32
  • Este código lo estoy improvisando si me pueden corregir.

    private void frmMaestroCompañia_Load(object sender, EventArgs e)
            {
                CargarGrilla();
                FormatoGrilla();
    
                //DataTable schemaTable;
                SqlDataReader myReader;
    
    
                using (SqlConnection cn = new SqlConnection(ConfigurationManager.ConnectionStrings["default"].ToString()))
                {
                    cn.Open();
                    //cmd.CommandText = "SELECT * FROM Cias";
                    SqlCommand cmd = cn.CreateCommand();
                    cmd.CommandText = "SELECT * FROM Cias";
                    myReader = cmd.ExecuteReader(CommandBehavior.KeyInfo);
    
                    //Retrieve column schema into a DataTable.
                    schemaTable = myReader.GetSchemaTable();
    
                    //For each field in the table...
                    foreach (DataRow myField in schemaTable.Rows)
                    {
                        //For each property of the field...
                        foreach (DataColumn myProperty in schemaTable.Columns)
                        {
                        //    //Display the field name and value.
                            myProperty.ColumnName + " = " + myField[myProperty].ToString(); ==> Acá falta 
                        }
                        //Console.WriteLine();
    
                        ////Pause.
                        //Console.ReadLine();
                    }
                }
    
                txtRuc.MaxLength = schemaTable.Columns["RUC"].MaxLength; ==> Acá me pide un new
     
            }


    Pedro Ávila
    "El hombre sabio querrá estar siempre con quien sea mejor que él."
    Lima - Perú

    miércoles, 2 de abril de 2014 13:20
  • Este atributo el MaxLength es nuevo en .NET Framework 4.5. Con VS 2010 no lo tienes ¿Qué VS tienes?

    Primero tienes que añadir una referencia al ensamblado System.ComponentModel.DataAnnotations. Son las propiedades las que tienen que tener el attibuto MaxLength. El attributo AttributeUsage es un attributo que se les pone a los atributos para saber a qué es aplicable un atributo:

    Aquí tienes un ejemplo:

    using System;
    using System.Collections.Generic;
    using System.ComponentModel.DataAnnotations;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;
    
    namespace ConsoleApplication3
    {
        public class CiaEntity
        {
            [MaxLength(20)]
            public string Cia_Id { get; set; }
    
            [MaxLength(40)]
            public string RUC { get; set; }
    
            [MaxLength(40)]
            public string RS { get; set; }
            [MaxLength(40)]
            public string Nom_Com { get; set; }
            [MaxLength(80)]
            public string RepLegal { get; set; }
    
            [MaxLength(80)]
            public string Direccion { get; set; }
    
            [MaxLength(20)]
            public string Ubigeo_Id { get; set; }
    
            [MaxLength(20)]
            public string Grp_Id { get; set; }
    
            [MaxLength(20)]
            public string GE_Id { get; set; }
    
            [MaxLength(12)]
            public string Telefono { get; set; }
    
            [MaxLength(40)]
            public string Enc_1 { get; set; }
    
            [MaxLength(40)]
            public string Enc_2 { get; set; }
    
            [MaxLength(40)]
            public string Enc_3 { get; set; }
    
            [MaxLength(40)]
            public string UserSNT { get; set; }
    
            [MaxLength(40)]
            public string ClaveSOL { get; set; }
    
            [MaxLength(40)]
            public string CodCiaOrig { get; set; }
    
            [MaxLength(40)]
            public string DBOrig { get; set; }
            [MaxLength(40)]
            public Int16 Estado { get; set; }
        }
    
        public static class TypeExtensions
        {
    
            public static int GetMaxLength(this Type type, string propertyName)
            {
                var attrs = type.GetProperty(propertyName).GetCustomAttributes(typeof(MaxLengthAttribute), true);
                if (attrs.Length > 0)
                {
                    return ((MaxLengthAttribute)attrs[0]).Length;
                }
                return -1;
            }
        }
    
        class Program
        {
            static void Main(string[] args)
            {
                Console.WriteLine("MaxLength de dirección {0}", typeof(CiaEntity).GetMaxLength("Direccion"));
            }
        }
    }
    


    "No darás tropezón ni desatino que no te haga adelantar camino" Bernardo Balbuena

    miércoles, 2 de abril de 2014 13:41
  • using (SqlConnection cn = new SqlConnection(ConfigurationManager.ConnectionStrings["default"].ToString()))
    {
        cn.Open();
        SqlCommand cmd = cn.CreateCommand();
        cmd.CommandText = "SELECT * FROM Cias";
        var reader = cmd.ExecuteReader(CommandBehavior.SchemaOnly);
        var schema = reader.GetSchemaTable();
        foreach (DataRow row in schema.Rows)
        {
            // Muesta nombre del campo y la longitud
            Console.WriteLine("{0}: {1}", row["ColumnName"], row["ColumnSize"]);
        }
    }
    Si lo único que quieres es la estructura de la tabla, lo mejor es CommandBehavior.SchemaOnly ya que así no se devuelve ninguna fila, sólo metadatos.

    "No darás tropezón ni desatino que no te haga adelantar camino" Bernardo Balbuena

    miércoles, 2 de abril de 2014 13:55
  • Hola Jesús

    Trabajo con Visual Studio 2012, eso es lo que quiero aprender utilizar metadatos para ya no estar consultando en la DB.

    Pero si es que cambio el tamaño de un campo también tendría que cambiarlo en el código y eso sería compilar de nuevo(me refiero a un nuevo ejecutable - instalador).

    Que me aconsejas?

    Estoy trabajando en una app de escritorio WindowsForm y necesito pasarle los datos a las cajas de texto


    Pedro Ávila
    "El hombre sabio querrá estar siempre con quien sea mejor que él."
    Lima - Perú


    • Editado Pedro Ávila jueves, 3 de abril de 2014 2:32 xxxxxxxxx
    jueves, 3 de abril de 2014 2:21
  • Te aconsejaría que usaras un ORM como EntityLite por ejemplo :-). Si cambias algo en la base de datos, sólo tienes que darle al botón derecho del ratón en DataLayer.tt y seleccionar "Run Custom Tool", entonces todas la entidades se vuelven a generar a partir de la base de datos.

    Como estás trabajando ahora, si añades un campo a una tabla tienes que añadir la propiedad correspondiente en la entidad.

    Generalmente, cuando cambias el esquema de la base de datos, tienes que volver a compilar y desplegar la aplicación, eso no te lo quita nadie.

    Lo de los msi's intentaría evitarlo todo lo posible, sería mejor desplegar una aplicación de escritorio por ClickOnce.

    Cambiarle el tamaño a una columna una vez que ya estás en producción no es algo muy habitual, lo es más añadir columnas.

    Una cosa que no entiendo es por qué una aplicación Windows Forms. Windows Forms está prácticamente obsoleto. Yo sólo lo usaría (lo uso) para aplicaciones que tengan que ejecutarse en Windows XP con .NET Framewok 2.0. A partir de .NET Framework 3.0 tienes Windows Presentation Foundation, que es lo único que realmente tiene futuro para aplicaciones de escritorio.


    "No darás tropezón ni desatino que no te haga adelantar camino" Bernardo Balbuena




    jueves, 3 de abril de 2014 7:27
  • Lo de WindowsForm es pq en la empresa que laboro trabajan con esa tecnología, sobre WPF si lo estuve viendo pero su curva de aprendizaje es un poco elevada y me consumiría tiempo, no lo puedo proponer.

    En la empresa que trabajo el sistema esta hecho en vb6 en una sola capa, por ejemplo tengo el campo Dirección de varchar(50) y en el formulario la caja de texto solo permite ingresar 50 caracteres, pero si el cliente dice me puedes poner para que ingrese mas datos, entonces solo en la db le cambia el tamaño del campo a 60 y listo ya no tienes que compilar, es una tecnica que se inventaron aca.

    Yo quisiera hacer lo mismo, por ahora estoy trabajando con un 3 capas clásico, Presentación, Lógica, AccesoDatos, Entidades.

    Para el proximo proyecto quiero trabajar de esta manera Presentación, Lógica, AccesoDatos. Eliminar la capa Entidades poniendola en Lógica, poniendo sus atributos a cada Entidad de dominio.


    Pedro Ávila
    "El hombre sabio querrá estar siempre con quien sea mejor que él."
    Lima - Perú


    • Editado Pedro Ávila jueves, 3 de abril de 2014 13:17 xxxxxxxx
    jueves, 3 de abril de 2014 13:16
  • Utiliza este Script y condiciona el tamaño de los campos de textos por codigo con los datos que cargaras desde la BD.
    Select COLUMN_NAME,DATA_TYPE,CHARACTER_MAXIMUM_LENGTH from INFORMATION_SCHEMA.COLUMNS
    where COLUMN_NAME like 'NombreTabla'

    //Cargas estos campos mediante un StoreProcedure

    //Los Cargas en un DataTable y los utilizas asi

    textBox1.MaxLength = int.Parse(dt.Rows[0][1].ToString());


    Saludos desde Peru.
    jueves, 3 de abril de 2014 14:23
  • Estimado Pedro

    Creo que las respuestas que necesitas ya las tienes y más que suficientes. Pero tengo la ligera impresión que todavía no estás conforme con ellas.

    Y entiendo que lo que tú necesitas es un método que se ejecute al cargar el formulario y que automáticamente te configure tu grid con los tamaños máximos por cada campo "MaxLength" de acuerdo a lo que tienes definido en tu base de datos.

    Pero tengo una duda: ¿Por qué en lugar de jugar con tamaños de campos restringidos si sabemos que puede variar? ¿No sería mejor definir un tamaño de campo variable grande? Algo así como un varchar(max) y con eso te evitas de estar cambiando el tamaño de campo para cada requerimiento de cada cliente.

    Además, no creo que todos tus clientes quieran estar definiendo el tamaño de los campos de su aplicación, y de ser así deben ser pocos los campos que quieran restringir.

    Lo que te recomiendo es hacer lo que te menciono dos párrafos arriba y adicional a esto hacer una tabla de configuraciones donde especificas el tamaño personalizado de cada campo de tu grid para que se lo pueda cambiar en cualquier momento "usando un formulario para administrar esta configuración" y con esto tendrías solucionado el problema, sin re-compilar en cada personalización.

    Espero que esta sea la solución que necesitas.

    ____________________________

    Victor

    "Si lo puedes soñar, lo puedes lograr."    Walt Disney


    Viper.NET

    jueves, 3 de abril de 2014 15:14
  • Hola Victor el jefe no le gusta varchar(max) lo que se quiere es darle el tamaño a las textboxt de los formularios de tal manera que no se tenga que compilar pero suponiendo que el sistema tenga 80 formularios esa tabla sería trabajosa de hacer tendría una ventana con muchas cosas.

    Pedro Ávila
    "El hombre sabio querrá estar siempre con quien sea mejor que él."
    Lima - Perú

    jueves, 3 de abril de 2014 15:22
  • Pedro

    Te recomiendo visitar este enlace. 

    http://technet.microsoft.com/es-es/library/ms189082(v=sql.105).aspx

    En éste se menciona como leer el esquema de la base de datos

    SELECT TABLE_NAME, COLUMN_NAME, COLUMNPROPERTY(OBJECT_ID(TABLE_SCHEMA + '.' + TABLE_NAME), COLUMN_NAME, 'ColumnID') AS COLUMN_ID
    FROM AdventureWorks2008R2.INFORMATION_SCHEMA.COLUMNS
    WHERE TABLE_NAME = 'Person';

    Con esto, puedes fácilmente consultar el tamaño de cada campo y aplicarlo a los elementos de tu interfaz.

    Saludos


    Viper.NET

    jueves, 3 de abril de 2014 15:53
  • Mas tarde marco las respuestas estoy haciendo otro trabajo termino y comienzo con este.

    Pedro Ávila
    "El hombre sabio querrá estar siempre con quien sea mejor que él."
    Lima - Perú

    jueves, 3 de abril de 2014 18:06
  • Nosotros solemos ser bastante "generosos" con los tamaños de los campos. Normalmente no solemos poner una longitud de menos 128 caracteres en columnas de tipo cadena. Porque en realidad un cadena de, pongamos 36 caracteres de longitud, ocupa lo mismo si en la base de datos está definido como varchar(50) que si está como varchar(128). Así nos evitamos tener que cambiar el tamaño de las columnas. Empezamos a preocuparnos cuando la longitud es mayor que 900 bytes. Porque en SQL Server la clave de un índice no puede superar ese tamaño. En esos casos optamos por índices Full Text, o creamos un índice sobre el CHECKSUM de la columna.

    En cuanto a las capas usamos pocas:

    • Infraestuctura.
    • Datos
    • Interfaz de usuario.

    La entidades están definidas en la capa de Datos con el EntityLite, y allí está definida también la validación usando FluentValidation.

    A veces, cuando es necesario, tenemos una capa de negocio implementada por medio de Workflows basados en Windows Workflow Foundation, pero esto es sólo cuando tenermos procesos de larga duración del tipo BPM.

    La interfaz del usuario normalmente es ASP.NET MVC. Aunque últimamente hemos tenido que realizar algunas aplicaciones en Windows Forms como complemento a una aplicación. Lo hicimos en Windows Forms con .NET Fx 2.0 para llegar al mayor número posible de clientes. Esta aplicaciones Windows Forms son en realidad una especie de asistentes de descarga y subida de documentos al servidor web que luego guarda en SQL Server con FILESTREAM. Las aplicacioes Windows se comunican con el servidro web  por medio de servicios web REST.  Estas aplicaciones se activan y descargan por medio de ClickOne, aunque hemos tenido que proporcionar una alternativa en el caso de que la máquina del cliente esté detrás de un proxy con autenttificación básica. ClickOnce no soporta proxies con autetnificación básica, así que tuvimos que crear nuestro propio "Click Once" basándonos en asociación de URL con programa.  Nuestro "Click Once" debía instalarse con un msi, para crear el msi utilizamos WIX. toolset. El de descarga es también un sincronizador: si hay algún documento en el expediente nuevo o que haya cambiado entonces lo descarga del servidor web. Para acordase de qué documentos ha descargado ya, utilizamos una versión modificada de persistent dictionary


    "No darás tropezón ni desatino que no te haga adelantar camino" Bernardo Balbuena

    viernes, 4 de abril de 2014 19:00