Listado de .Net C#
Lenguaje con Visual Studio de Microsoft
- Compatibilidad en aplicaciones .Net con diferentes versiones del Framework .Net
Compatibilidad en aplicaciones .Net con diferentes versiones del Framework .Net
Cuando desarrollas utilizando un Framework .Net y la máquina destino tiene otra versión. Es decir, por ejemplo desarrollas utilizando VS2008 y Framework 3.5 y el Ordenador destino tiene instalado el Framework 4.0. Esto no quiere decir que tenga por obligación el Framework 3.5 instalado, y al arrancar la aplicación dará un error. Compatibilidad Versiones .Net Framework MSDNDe manera predeterminada, una aplicación se ejecuta en la versión de .NET Framework para la que se creó. Si esa versión no está presente y en el archivo de configuración de la aplicación no se han definido las versiones compatibles, puede producirse un error de inicialización de .NET Framework. En este caso, el intento de ejecutar la aplicación no tendrá éxito.
... - Diferencias entre Clases y Estructuras (Structs) C#
Diferencias entre Clases y Estructuras (Structs) C#
La principal Diferencia entre Classes y Structs es que una es por referencia y la otra por valor. Leyendo el artículo de Koalite comencé a sentir curiosidad sobre el tema, es por ese mismo motivo por el que me dirigí directamente al artículo de la MSDN que mencionaba.Una clase es un tipo de referencia. Cuando se crea un objeto de la clase, la variable a la que se asigna el objeto solo incluye una referencia a dicha memoria. Cuando la referencia a objeto se asigna a una nueva variable, la nueva variable hace referencia al objeto original. Los cambios realizados en una variable se reflejan en la otra variable porque ambas hacen referencia a los mismos datos.
... - TODO List o Task List Comments en Visual Studio 2010 Express Edition
TODO List o Task List Comments en Visual Studio 2010 Express Edition
Obtener una lista de Tareas "TODO" en Visual Studio 2010. Dada las necesidades, nos venía bien ir dejando una lista de Tareas pendientes en el código para ir solucionandolo después. El problema es que por defecto en Visual Studio 2010 no aparece la view Task List. Investigando un poco he encontrado un comentario en forum.asp.netTo make the Task List menu item shown, you need to enable Expert Settings by selecting Tools -> Settings -> Expert Settings.
Esto significa que podemos activar los settings del Visual Studio a nivel Experto, de esta forma aparece la vista de Tareas Pendientes. A continuación sólo tenemos que seguir las indicaciones de la msdn para ir creando TODO en los comentarios y como visualizarlos.... - .NET: Declarar Métodos y Clases como Obsoletas o Deprecates
.NET: Declarar Métodos y Clases como Obsoletas o Deprecates
Cuando queremos definir métodos y clases obsoletas o "deprecadas" en .Net. Es común que se generen nuevos métodos, mejores y más optimizados que los anteriores. Por eso es conveniente indicar de alguna forma que los métodos o clases antiguas son obsoletas, para que nadie las vuelva a utilizar. Esto se consigue con el atributo System.Obsolete (msdn)3 Maneras de Definir Obsoletos y Deprecados
Aunque recomiendo usar cualquiera de las dos últimas.... - Como publicar "Publish Web" con Visual Studio Express Edition
Como publicar "Publish Web" con Visual Studio Express Edition
Vamos a Explicar como publicar con aspnet_compiler.exe dado que en las versiones Express Edition no existe la opción "Publish Web". Aunque existen trucos para crear la opción de publicar un sitio web con algunas versiones del visual studio (VS2008 Express Edition), en la versión Web Developer VS2010 Express Edition no lo hemos logrado. Por ese motivo vamos a explicar como crear un método para publicar sitios web por línea de comando con aspnet_compiler.exe.Aspnet_compiler.exe
La herramienta de compilación de ASP.NET (Aspnet_compiler.exe) hace posible la compilación de una aplicación Web ASP.NET, en el propio lugar donde se encuentra o para implementarse en una ubicación de destino como un servidor de producción
... - C#: Diferencia entre (string), Operator as y ToString al leer de un IDataReader
C#: Diferencia entre (string), Operator as y ToString al leer de un IDataReader
Diferencias en la conversión de datos a String cuando trabajamos con bases de datos. Existen diferentes opciones como la conversión explícita o Cast o llamar al método ToString. El objetivo del artículos es entender las diferencias, así entenderemos porque ocurren algunos errores, y porque una opción es más rápida que la otra.Cast (String) and Operator As
(string)Reader[0] o el Operador as es un "cast", una conversión explícita "...if a conversion cannot be made without a risk of losing information,...". En base de datos se aplica cuando se sabe que el campo es de tipo String o puede ser convertido a String sin peligro.... - Ejecutar iisreset desde codigo y como saber si se ha reiniciado el iis
Ejecutar iisreset desde codigo y como saber si se ha reiniciado el iis
Para reiniciar el IIS sólo hay que ejecutar el Comando iisreset. El comando iisreset.exe se encuentra en "C:\Windows\System32\". Cada vez que se ejecute parará todos los servicios web y los volverá a iniciar. Para saber y conocer el registro del servicio IIS hay que ir al "Visor de Sucesos" subapartado "Sistema". El origen del log es IISCTLS. Al ejecutar el comando iisreset veremos dos logs del tipo:Recibido comando de detención de IIS del usuario NT AUTHORITY\SYSTEM. El dato registrado es el código de estado.
Recibido comando de inicio de IIS del usuario NT AUTHORITY\SYSTEM. El dato registrado es el código de estado.
Código para Ejecutar el Comando iisreset desde C# .Net
... - Reflection: Utilidades para Crear y Ejecutar Metodos de clases Dinamicas
Reflection: Utilidades para Crear y Ejecutar Metodos de clases Dinamicas
Como podemos crear o invocar métodos de clases dinámicas en C# .NET. La clave se encuentra en el espacio de nombres (namespace) System.Reflection del Framework de .Net para crear y utilizar métodos o propiedades dinámicas. Este "namespace" nos permite crear Clases dinámicamente, obtener sus propiedades o invocar a métodos concretos, entre otras cosas. Cuando deseamos realizar alguna operación dinámica con alguna Class o Type concreto es muy posible que acabemos en este espacio de nombres.... - Unrecognized attribute 'targetFramework'. Note that attribute names are case-sensitive.
Unrecognized attribute 'targetFramework'. Note that attribute names are case-sensitive.
La configuración del IIS es incorrecta. En las propiedades del Sitio Web configurado en el ISS, configurar en la pestaña ASP.NET el Framework 4.0 en lugar de la versión 2.0. Para las soluciones sencillas y rápidas. Que todo sea esto.... - C#: Convert DbType to SqlDBType
C#: Convert DbType to SqlDBType
Clase para convertir de tipos de datos .net (dbType) a tipos de datos de base de datos (SqlDbType). La clase esta extraída de dotnetpulse que es quien realmente ha realizado todo el trabajo, por lo que el mérito es de ellos. Pero como es una clase realmente interesante y muy útil, he decidido que también quería guardarla en los apuntes de tectonilogia.com. El uso es realmente sencillo para convertir entre tipos de datos .Net Type , SqlDbType and DbType._DbType = DbConverter.ToDbType(mySqldbType); _SqlDbType = DbConverter.ToSqlDbType(myDbType);Clase para convertir datos de base de datos
... - Application Configuration File: App.Config para una Class Library
Application Configuration File: App.Config para una Class Library
Fichero de configuración de la aplicación para una librería de clases c#. Se puede cargar el fichero App.Config de un Assembly cualquiera. También tenemos la libertad de crear y definir nuestra propia section en el fichero de configuración, para poder cargar la información en una clase propia. Sabiendo que una librería puede tener su propio fichero de configuración y que podemos crear clases personalizadas ¿Que nos queda? ¿Saber donde se ubicará el fichero? Tenemos que pensar donde estará ubicado y como gestionaremos la información de este fichero. La elección es nuestra. Es decir, si tenemos un sitio web con su fichero de configuración web.config y una librería con un app.config ¿Donde ubicaremos la información de la librería y como la cargamos? ¿porque no utilizamos el fichero de la aplicación?.... - C#: Crear Secciones Personalizadas en el Fichero de Configuracion app.config,web.config
C#: Crear Secciones Personalizadas en el Fichero de Configuracion app.config,web.config
El app.config o el web.config son ficheros de configuración que ofrece .Net., aparte del fichero de recursos de Settings. Por defecto estos ficheros ya posen secciones para almacenar diferentes settings sencillos (appSettings) y para las cadenas de conexión (connectionstrings). Pero en algunos casos podemos personalizar y crear nuestra propia section y su clase asociada para poder trabajar con los datos.Crear una Section Personalizada siguiendo un ejemplo
Comezaremos mostrando una seccion personalizada que iría dentro del app.config o web.config del proyecto.... - C# .NET: Sobrecarga,Polimorfismo y Reutilizar Constructores
C# .NET: Sobrecarga,Polimorfismo y Reutilizar Constructores
Clase escrita en C# .Net con diferentes constructores. Llamar de un constructor de una clase a otro constructor de la misma clase o al constructor del padre. Este caso es más común de lo que parece y el Polimorfismo de métodos (Aunque sean constructores) es recomendable.... - No se puede cargar el archivo o ensamblado System.Web.Extensions Version=1.0.61025.0
No se puede cargar el archivo o ensamblado System.Web.Extensions Version=1.0.61025.0
Error No se puede cargar el archivo o ensamblado System.Web.Extensions Version=1.0.61025.0. En Servidor Windows 2003 Server con aplicaciones Web Asp.Net. En un entorno donde la version instalada de la aplicación web funcionaba, ha comenzado ha dar error en el fichero Web.config, indicando que no se puede cargar el ensamblado System.Web.Extensions.Problema
... - Remember: Find en las Listas Genéricas
Remember: Find en las Listas Genéricas
Utilizar el Find Predicate<T> con delegate en una sola línea. Cuando utilizamos Listas genéricas e posible que en algún momento tengamos que Buscar Elemento para obtener el elemento concreto de la lista. Realizar operaciones y continuar con nuestro proceso. Dado que no es un código que se esté "picando" cada día, recordemos como se hace el Find de un Elemento en una Lista Genérica y con una sóla línea.function MyClass FindByKey(List<MyClass> list, string key) { return list.Find(delegate(MyClass item) {return (item.Key == key);} ); }Estudiamos el Código
Delegate(MyClass item), define el método de búsqueda. Podría crearse un método nuevo con los parámetros adecuados tal como se explica en la MSDN. {return (item.Key == key)}, es el código del método de búsqueda, que parámetros y propiedades se van a utilizar para la comparación.Referencias
List <T> Generic Predicate <T> Delegate... - Crear Templates de Clases para Listas Genericas
Crear Templates de Clases para Listas Genericas
El Uso de Genéricos en el desarrollo de aplicaciones es ir un paso adelante en el uso de la herencia, polimorfismo y la programación orientada a objetos. Consiste en definir operaciones, usos y métodos para tipos de datos genéricos. El uso de Templates y Genéricos en el futuro hace ahorrar tiempo de construcción y rendimiento en algunas operaciones (Sobretodo porque no hay que hacer Cast ni Converts). A continuación vamos a explicar las bases para crear clases aplicables a listas genéricas.Código clases Templates de Genéricos
Al Definir MyList<T>, estamos definiendo una lista Genérica tipo List<T>, pero además le indicamos que la clase T tiene que ser del tipo TemplateBase....public abstract class TemplateBase { //Constructor public TemplateBase() {} public void SomeMethod() { //Do Some Code } public abstract void OtherMethod(); } public class Item : TemplateBase { public override void OtherMethod() { //Do Special Item Code } } public class MyList<T> : List<T> where T : TemplateBase, new() { public void SpecialCode() { //Special List Code //... } } - Rendimiento y Diferencia entre ArrayList y GenericList
Rendimiento y Diferencia entre ArrayList y GenericList
Buscando información me encontré con El uso de Genéricos (List) es mucho más eficaz que el uso de Arrays. El Uso de genéricos List<T> es superior al uso de ArrayList cuando: Con ArrayList hay que realizar Cast, Convert al Agregar y al Obtener el valor. (value = (ObjetType)Lista[i]; ) En operaciones de Equals o Compare Con tipos de datos primitivos, ya que se realizan operaciones de conversion definidas por nosotros, o implicitas por la naturaleza del tipo de dato. Con el Uso de Genéricos y las interfaces IEquatable y IComparable, el tipo de datos es el definido por la clase T, por lo que ya no es necesario realizar Cast ni Converts. El Aumento de Rendimiento viene dado por ahorrarse esta operación. Para información mucho más detallada ver Comprobación del Rendimiento de los Genéricos... - Uso Interfaces IEquatable y IComparable con Equal, CompareTo, Contains y Sort
Uso Interfaces IEquatable y IComparable con Equal, CompareTo, Contains y Sort
Cuando tenemos que hacer comparaciones y ordenaciones entre elementos de una lista. IEquatable y IComparable son las interfaces que ofrece el Framework de .Net para que podamos comparar y ordenar nuestras listas genéricas. Imaginad que tenemos una lista List<T>, donde T es una clase Propia. Tenemos una Lista con varios elementos.¿Que necesitamos de una Lista Genérica?
¿Poder Comparar Elementos? ¿Poder Ordenar la lista? Para poder comparar elementos es la interfaz IEquatable y para poder Ordenar la lista la interfaz IComparable.... - Diferencia entre Session y ViewState
Diferencia entre Session y ViewState
Las diferencias más importantes entre Session y ViewState en ASP.NET. El ViewState es más limitado y es para información sencilla. Incluso te puedes encontrar que almacenas información que se guarda o actualiza a través de otros procesos y que no se refresca correctamente. Creo que es debido a que el ViewState viaja del cliente al servidor, se procesa y vuelve, y si no existe un PostBack por medio, por mucho que actualices la información no se mantendrán los cambios, ya que la próxima vez que se genere un PostBack la información se reiniciará con la que tenía guardada en la parte del Cliente. La Session suele utilizarse para compartir información entre páginas, de más envergadura y con procesos más complejos.... - Como hacer el Update de una Pagina aspx con un UpdatePanel, un Thread y un Timer
Como hacer el Update de una Pagina aspx con un UpdatePanel, un Thread y un Timer
Generar un proceso largo que actualice el contenido de la página desde un Thread y a través de un UpdatePanel. Cuando queremos generar un proceso muy largo desde una aplicación web, y queremos que el progreso del proceso actualice información de la página web, podemos hacerlo con un UpdatePanel y un poco más. Cuando el proceso que queremos ejecutar es tan pesado que decidimos ponerlo dentro de un Thread, aún complicamos más el refresco de pantalla, por eso vamos a exponer los pasos y los conceptos.Update Panel
El UpdatePanel utiliza tecnología Ajax para actualizar una parte de la página web, y no forzar el refresco de la página entera. Una técnica muy utilizada en aplicaciones asp.net. Imaginemos que tenemos el siguiente UpdatePanel.
Cuando pulsamos sobre el botón "BtnExecute1" podemos actualizar la label "lblActualizar" y refresacará sólo el UpdatePanel. Para ello podemos utilizar el método Update del UpdatePanel.<asp:UpdatePanel ID="updProgreso" runat="server" UpdateMode="conditional"> <ContentTemplate> <asp:Label ID="lblActualizar" runat="server" Text=""></asp:Label> </ContentTemplate> <Triggers> <asp:AsyncPostBackTrigger ControlID="BtnExecute1"/> </Triggers> </asp:UpdatePanel>
Desde la parte del cliente viaja a la parte del Servidor, y cuando regresa es cuando actualiza el contenido de la etiqueta....lblActualizar.Text = "Actualizamos la etiqueta"; updProgreso.Update(); - Como Permitir Acentos en la URL con .NET
Como Permitir Acentos en la URL con .NET
¿Acentos en la URL? en ocasiones se generan urls automáticas con parámetros, los cuales tienen acentos. Esto puede dar problemas con el encoding a la hora de recuperar la información. Dependiendo de la aplicación y las necesidades de cada uno pueden solucionarse el problema de diferentes formas. Si por el ejemplo son dos aplicaciones que se envían información mediante "http", lo más normal es utilizar las clases "System.Web.HttpUtility.UrlEncode" o "System.Web.HttpUtility.UrlDecode", definiendo previamente el "Encoding" que se va a utilizar. Pero esta solución en ocasiones no es posible aplicarla. En mi caso particular, cuando la url se genera desde un Word. El Documento Word llama a una página web la cual recibe una serie de parámetros. Los parámetros que recibe la página web pueden llegar a tener acentos. En este caso no puedo utilizar las clases encode y decode y es necesaria otra solución.Configurando el Encoding en el Web.Config
El problema se ha solucionado configurando las url de entrada y salidas con un encoding capaz de soportar acentos.
De esta forma cuando se quiere recuperar un parámetro a través del QueryString["campo"], da igual que el valor del parámetro tenaga o no acento, porque lo recupera correctamente....<system.web> ... <globalization requestEncoding="windows-1252" responseEncoding="windows-1252" culture="es-ES"/> ... </system.web> - Mejorando el Convert.ToBoolean(String) del Framework .Net
Mejorando el Convert.ToBoolean(String) del Framework .Net
Convertir diferentes tipos de valores Lógicos de String a Boolean, por ejemplo "true", "TRUE", "1", "Si". La mejora de crear un nuevo Convert.ToBoolean nace porque el método Convert.ToBoolean(String) se basa en los valores Boolean.TrueString ("True") y Boolean.FalseString ("False"), que en realidad son constantes, así que si no utilizas estos valores específicamente el método no devolverá el resultado esperado. Pero en ocasiones el String que pasamos como valor Lógico puede ser un "0" o un "1", o más específicamente un "Si" o un "No".Comentarios del MSDN
En el MSDN nos comentan que si los valores tipo String del parámetro no son los correctos, nos lanzará una excepción. Por lo que una opción sería utilizar el Método Boolean.TryParse si no queremos tener que tratar las excepciones.Para que la conversión se realice correctamente, el parámetro value debe ser igual a una constante Boolean.TrueString, cuyo valor es True, a una constante Boolean.FalseString, cuyo valor es False o debe ser null. Para comparar value con Boolean.TrueString y Boolean.FalseString, el método omite el uso de mayúsculas y minúsculas, así como los espacios en blanco iniciales y finales. Si prefiere no controlar una excepción si la conversión da error, puede llamar al método Boolean.TryParse en su lugar. Devuelve un valor Boolean que indica si la conversión finalizó correctamente o no.
Mejora Convert.ToBoolean
Dado que el método Convert.ToBoolean no me servía para las conversiones que necesitaba realizar, además de que quería dejar el código más legible. He creado una nueva clase para Convertir de String a Boolean.public class ConvertBoolean { /// <summary> /// Convert to Boolean from String True if is "true", "1", "si" /// </summary> /// <param name="value">String (true, TRUE, 1, si,</param> /// <returns>Boolean</returns> public static bool FromString(string value) { try { string aux = value.ToLower(); if ((aux == "true") || (aux == "1") || (aux == "si")) { return true; } else { return false; } } catch { //por defecto return false; } } }Conclusiones
Que os aproveche!!!... - Encoded Word Encoding con .Net C#
Encoded Word Encoding con .Net C#
Como Obtener el Valor del Encoding de Palabras definido en el MIME Encoded-Word. En la comunicación SMTP, desde el RFC 2822, todos los nombres y valores de la cabecera (Header) del mensaje deben enviarse con el Encoding ASCII. Pero si se desean enviar carácteres con valores no-ASCII se debe codificar el valor del Header usando la sintaxi indicada en el MIME encoded-word (RFC 2047). La sintaxis usa un string con carácteres ASCII que indica el encoding "charset" y el "content-transfer-encoding", para poder obtener el valor correcto. Es Decir, en el mismo valor se manda la información, el charset y el encoding en un formato concreto.El formato de MIME encoded-word es
El Encoding podría contener dos valores. "Q" y "B", "Q" denota Q-encoding que es lo mismo que quoted-printable, y "B" denota base64. Por lo que si sabemos el charset y el encoding, podemos decodificar el texto que marcado como "encoded-text"=?charset?encoding?encoded text?=Codigo Decode Encoded-Word en .Net C#
using System.Text.RegularExpressions; using System.Net.Mail;
via vsevolodp Actualización 09/01/2011 No funciona en todos los Casos, pero si que resuelve la gran cantidad de mis necesidades...public class EncodedWordEncoding { public static string Decode(string encodedText) { if (encodedText == null) return null; Regex regex = new Regex(@"=\?(?<charset>.*?)\?(?<encoding>[qQbB])\?(?<value>.*?)\?="); string encodedString = encodedText; string decodedString = string.Empty; bool encodedWordBefore = false; while (encodedString.Length > 0) { Match match = regex.Match(encodedString); if (match.Success) { // If the match isn't at the start of the string, copy the initial few chars to the output string beforeMatch = encodedString.Substring(0, match.Index); // Filter out space chars between encoded words if (encodedWordBefore) { Regex regex2 = new Regex(@"(\r?\n|\r)*[ \t]+"); Match match2 = regex2.Match(beforeMatch); if (match2.Success && match2.Value == beforeMatch) beforeMatch = ""; } decodedString += beforeMatch; string charset = match.Groups["charset"].Value; string encoding = match.Groups["encoding"].Value.ToUpper(); string value = match.Groups["value"].Value; if (encoding.Equals("B")) { // Encoded value is Base-64 byte[] bytes = Convert.FromBase64String(value); decodedString += Encoding.GetEncoding(charset).GetString(bytes); } else if (encoding.Equals("Q")) { // Use .NET library to decode decodedString += Attachment.CreateAttachmentFromString("", match.Value).Name; } else { // Encoded value not known, return original string // (Match should not be successful in this case, so this code may never get hit) decodedString += encodedString; break; } // Trim off up to and including the match, then we'll loop and try matching again. encodedString = encodedString.Substring(match.Index + match.Length); encodedWordBefore = true; } else { // No match, not encoded, return original string decodedString += encodedString; break; } } return decodedString; } } - Error de Analizador. Application ASP.NET, Web Site y Virtual Directory
Error de Analizador. Application ASP.NET, Web Site y Virtual Directory
Error de Analizador. No se puede cargar el Compilado al Publicar una Aplicación Web en ASP.NET. Hace poco he tenido un problemilla que me ha tenido ocupado un tiempo. El problema surge al publicar una aplicación web con ASP.NET precompilada al Servidor. Cuando le das a Publicar una Aplicación Web (Publish Web Site) desde el Visual Studio 2005, y cuando decides instalar la aplicación en el servidor da error (Recomiendo no esperar al último momento para hacer este paso. Por suerte no era este mi caso). Al poner la aplicación publicada (Compilada) aparecía el siguiente error.Error del analizador Descripción: Error al analizar el recurso requerido para dar servicio a esta solicitud. Revise los detalles de error de análisis específicos y modifique el archivo de código fuente en consecuencia. Mensaje de error del analizador: No se puede cargar el ensamblado 'App_Web_jok6qv5y'. Asegúrese de que está compilado antes de obtener acceso a la página.
Si por el contrario copiaba una página en particular con el fichero .aspx y .cs, la página se compilaba sin ningún problema y se cargaba sin error. Al Publicar una Aplicación Web con el Visual Studio, lo que hace es compilar todas las páginas para que el código .cs no quede a la vista, y copia el o los ficheros compilados dentro de la carpeta "Bin". Así que el problema que tenía era debido a la compilación, o porque la configuración del IIS no era correcta.Definiciones para Tener Claro los Conceptos
Web Site: Por defecto "Default Web Site" ubicado en "C:\inetpub\wwwroot\". Si creamos un nuevo sitio web, es donde se definirá la Ruta Base de la nueva aplicación Web. Es Decir, un dominio o ip ubicado en una carpeta física, en donde se encontrará la página principal de la aplicación. Virtual Directory: Un directorio virtual es crear dentro de un sitio web una carpeta en un determinado nivel de directorios, pero que en realidad, físicamente esta ubicada en cualquier otro lugar del disco. Normalmente utilizado para indicar donde se encuentran las imágenes, scripts, ... Aplication Web: Es como un directorio virtual, pero con la capacidad de poder ejecutar código ASP.NET. Se pueden crear tantas aplicaciones web asp.net como se quieran dentro de un Web SitePosibles Soluciones
Hemos encontrado 2 posibles opciones para solucionar el Error del Analizador, pero ambas son debido a la configuración realizada en el IIS 1: La más probable es que la versión del ASP.NET configurada en la Aplicación Web no este definida. Si nos fijamos en la parte inferior de la página de Error encontramos un mensaje tipo
La mayoría de los problemas encontrados por Error del Analizador es porque la version del Framework utilizado es la 1.1 y no la 2.0. Se soluciona accediendo a "Propiedades" de la Aplicación Web, y definir la versión del Framework .NET en la pestaña ASP.NET 2: Una Aplicación Web específica se crea dentro de un Sitio Web, pero primero se crea como un Directorio Virtual. Si no le indicamos en las propiedades de la aplicación web, en la pestaña "Virtual Directory", en el apartado "Application Settings" la opción de "Create". No configurará la aplicación como Aplicación ASP.NET. Aunque podrá ejecutar código html o scripts, no podrá ejecutar código precompilado asp.net. Esto es lo que creo, siguiendo estos pasos el problema del Error de Analizador al Publicar una Aplicación Web ASP.NET se ha solucionado. ¿Cual creéis que era mi problema? ¡Menudo Despiste!...Información de versión: Versión de Microsoft .NET Framework:2.0.50727.3615; Versión ASP.NET:2.0.50727.3618 - Seguimiento en las Transacciones Usando SQLTransaction y un TableAdapter Helper
Seguimiento en las Transacciones Usando SQLTransaction y un TableAdapter Helper
Cuando se quieren utilizar Transacciones en las Base de Datos, es porque se necesitan realizar una serie de Operaciones de forma Atómica. Las operaciones son indivisibles, lo que significa que o se ejecutan todas las operaciones o no se ejecuta ninguna. En el Caso de las Transacciones con las Bases de Datos, si la Transacción ha dado error se hace un "Rollback" para deshacer todos los cambios. El problema escrito en el artículo principal Transaction Tracking Using SQLTransaction, es que necesitaba realizar una serie de Operaciones entre 2 Base de Datos que se encuentran en 2 Servidores diferentes. Por este mismo motivo ha tenido que realizar un Seguimiento de las Transacciones, para saber que si algo ha funcionado mal, deshacer los cambios. No puedes Hacer "Rollback" y deshacer todos los cambios de 2 Bases de Datos Diferentes, tienes que deshacer de forma semimanual. Me parece tan Interesante, que por este mismo motivo vamos a escribir un artículo con los Apuntes necesarios, por si en futuro necesitamos algo parecido con las transacciones.Pasos para los Problemas Y las Soluciones
Se crea un objeto SqlTransaction para la conexión que se conectará a la base de datos. Los objetos Command en los TableAdapter comparten las conexiones. De esta forma no nos preocupamos de asignar el objeto Connection. El objeto Transaction necesita ser asignados a cualquier objeto Command que se utilizará como parte de la transacción para esa conexión. Los objetos Commands no son públic en los Table Adapter. Aquí tenemos el Problema Si queremos que el objeto Connection permanezca abierta en la Transacción, es necesario abrirlo antes de llamar a cualquier método que utilice el Table Adapter.Código .NET
El Código asigna a todos los comandos la Transacción pertinente, justo en el BeginTransaction. De esta forma en los Comandos Update, Insert y Delete ya tienen asignado el Objeto Transaction y podremos hacerle su control de Error.
Pensad que podéis adaptar la clase a vuestras necesidades.using System; using System.Data; using System.Data.SqlClient; using System.Reflection; public class TableAdapterHelper { /// <summary> /// Enlists the table adapter in a transaction. /// </summary> public static System.Data.SqlClient.SqlTransaction BeginTransaction(object tableAdapter) { System.Data.SqlClient.SqlConnection connection = GetConnection(tableAdapter); connection.Open(); SqlTransaction transaction = connection.BeginTransaction(); // get the table adapter's type Type type = tableAdapter.GetType(); // set the transaction on each command // in the adapter PropertyInfo commandsProperty = type.GetProperty("CommandCollection", BindingFlags.NonPublic | BindingFlags.Instance); SqlCommand[] commands = (SqlCommand[])commandsProperty .GetValue(tableAdapter, null); foreach (SqlCommand _command in commands) _command.Transaction = transaction; PropertyInfo adapterPI = type.GetProperty("Adapter", BindingFlags.NonPublic | BindingFlags.Instance); if (adapterPI != null) { object innerAdapter = adapterPI.GetValue(tableAdapter, null); if (((SqlDataAdapter)innerAdapter) .UpdateCommand != null) ((SqlDataAdapter)innerAdapter) .UpdateCommand.Transaction = transaction; if(((SqlDataAdapter)innerAdapter) .InsertCommand != null) ((SqlDataAdapter)innerAdapter) .InsertCommand.Transaction = transaction; if (((SqlDataAdapter)innerAdapter) .DeleteCommand != null) ((SqlDataAdapter)innerAdapter) .DeleteCommand.Transaction = transaction; } return transaction; } private static SqlConnection GetConnection(object tableAdapter) { Type type = tableAdapter.GetType(); PropertyInfo connectionProperty = type.GetProperty("Connection", BindingFlags.NonPublic | BindingFlags.Instance); SqlConnection connection = (SqlConnection)connectionProperty .GetValue(tableAdapter, null); return connection; } }Ejemplo de Uso con las Transacciones
SqlTransaction transaction = TableAdapterHelper.BeginTransaction(Adapter); try { Adapter.Delete(id); } catch (Exception e) { transaction.Rollback(); Adapter.Connection.Close(); throw e; } transaction.Commit(); Adapter.Connection.Close();Conclusión
Código en .Net para gestionar las Transactions de las Bases de Datos. Seguro que existen formas y maneras más sencillas para trabajar con Transacciones en .NET, pero esto da un paso más para esos casos en los el Seguimiento de las Transacciones es vital. Como por ejemplo cuando se necesita realizar entre 2 bases de Datos y encima alojadas en 2 Servidores Diferentes. ¿Os Ayudará este TableAdapter Helper?... - Como Saber la Version del IIS instalada
Como Saber la Version del IIS instalada
Para saber la versión del Internet Information Services instalada, lo común es ir a "Ayuda" - "Acerca de...", pero en algunas versiones es más difícil encontrarlo.Como Ver la Version del IIS (Internet Information Service)
Existen diferentes formas para saber la versión del IIS instalada Abrir el navegador y poner "http://localhost/iishelp", aparece la ayuda del IIS con la versión Ir al registro para saber la versión instalada "HKEY_LOCAL_MACHINE\ SYSTEM\ CurrentControlSet\ Services\ W3SVC\ Parameters\ MajorVersion" También se comenta que desde "Programas - Accesorios - Herramientas del Sistema - Información del Sistema", dentro de Servicios el llamador "Servición de Publicación World Wide Web" con nombre "W3SVC". En mi caso no me ha servido Vía ForoselWebVersión IIS Desde Páginas ASP
También podemos saberlo por código (vía babelias)<%=System.Diagnostics.FileVersionInfo.GetVersionInfo(System.Environment.SystemDirectory + "\\inetsrv\\inetinfo.exe")%>
Mostrando una información tipo
...File: C:\WINDOWS\system32\inetsrv\inetinfo.exe InternalName: INETINFO.EXE OriginalFilename: INETINFO.EXE FileVersion: 5.1.2600.2180 (xpsp_sp2_rtm.040803-2158) FileDescription: Internet Information Services Product: Internet Information Services ProductVersion: 5.1.2600.2180 Debug: False Patched: False PreRelease: False PrivateBuild: False SpecialBuild: False Language: English (United States)
- Eliminar Acentos con .Net Utilizando Expresiones Regulares
Eliminar Acentos con .Net Utilizando Expresiones Regulares
Como eliminar acentos de los strings con RegEx (Expresiones Regulares). Lo primero que se nos ocurre es realizar un "Replace" del String para modificar todos aquellos carácteres específicos. Por ejemplo como subgurim.net nos expone, un código sencillo y fácil utilizando un simple "Replace", Pero ¿no sería mejor utilizar una Expresión Regular?. ADeshoras nos proporciona dos métodos Eficientes para quitar acentos, de los que podemos incluso descargar el código y ver como funciona. Utilizando RegEx (System.Text.RegularExpressions) Utilizando Normalización Unicode (System.Text.Encoding) De las dos opciones he utilizado la primera, por sencillez y claridad, además de que donde pensaba utilizarla era un proceso de Importación que se ejecutará una sola vez.
El Método funciona correctamente, utilizando Expresiones Regulares hemos podido eliminar los acentos de las vocales que en ocasiones no tienen ningún sentido. Además tenemos la versión de javascript para quitar acentos con Expresiones Regulares, tal como explican en proinf.net en el artículo Generar Permalinks directamente desde Javascript, donde tuvieron que eliminar los acentos....public static string RemoveAccentsWithRegEx(string inputString) { Regex replace_a_Accents = new Regex("[á|à|ä|â]", RegexOptions.Compiled); Regex replace_e_Accents = new Regex("[é|è|ë|ê]", RegexOptions.Compiled); Regex replace_i_Accents = new Regex("[í|ì|ï|î]", RegexOptions.Compiled); Regex replace_o_Accents = new Regex("[ó|ò|ö|ô]", RegexOptions.Compiled); Regex replace_u_Accents = new Regex("[ú|ù|ü|û]", RegexOptions.Compiled); inputString = replace_a_Accents.Replace(inputString, "a"); inputString = replace_e_Accents.Replace(inputString, "e"); inputString = replace_i_Accents.Replace(inputString, "i"); inputString = replace_o_Accents.Replace(inputString, "o"); inputString = replace_u_Accents.Replace(inputString, "u"); return inputString; } - Librerias para gestionar Ficheros TAR en .NET
Librerias para gestionar Ficheros TAR en .NET
Librerías y Herramientas para trabajar con ficheros TAR, ZIP, GZIP con .Net. Es cierto que el Framework de .net nos ofrece el Namespace
Las clases GZipStream y DeflateStream, para poder trabajar con ficheros comprimidos, pero el caso del Tar es un poco diferente, y puede ser algo complicado gestionarlos sólo con estas clases.System.IO.CompressionLibrerías
Existen varias librerías para trabajar con este tipo de ficheros, pero os voy a proponer dos ICSharpCode, una librería que en mi opinión utiliza la gran mayoría de gente. Además de ser Gratuita, puedes descargarte el código y modificarlo si fuera necesario. Tar-cs, Librería de google para trabajar con ficheros Tar. De las dos opciones y después de probarlas, me quedo con la primera, ya que la segunda tiene un pequeño problema que comentaré después.Herramientas para Generar ficheros Tar
El más fácil de utilizar es el famoso programa 7Zip, que te permite generar ficheros Tar sin ningún problema. También podemos usar el GnuWin32 en línea de comandos para trabajar con los ficheros, pero es un poco más incómodo.Conclusión
El problema con la librería Tar-cs que comentaba antes, es que da error con los ficheros generados a partir del 7zip, no así con los generados con el GnuWin32. Por eso recomiendo el uso de la librería SharpZipLib de ICSharpCode, por su facilidad y la gran cantidad de ayuda que podrás encontrar.... - Auto Eventos del PostBack en Paginas aspx
Auto Eventos del PostBack en Paginas aspx
Configurar que la página o controles específicos realicen un PostBack automático, es decir, cuando queremos relacionar que los eventos de la página o de los controles produzca una devolución de datos desde el Servidor. Por eso, ado que el entorno de Microsoft te ofrece una gran facilidad para programar páginas web, es normal que casi sin darnos cuenta, nos encontramos con que la página ya pose una propiedad llamada AutoEventWireup, lo que hace es definir si queremos que los eventos de la página se gestionen automáticamente desde el Servidor o no. Pero más profundamente, podemos configurar la propiedad AutoPostBack en controles como un CheckBox o un TextBox, de esta manera podemos hacer que los eventos típicos de estos controles se ejectuten en el servidor. Aunque hay que reflexionar si realmente lo necesitamos o si es debido a que de esta manera es más fácil para desarrollar. Tenemos que preguntarnos ¿Puedo hacerlo con Javascript? Esta propiedad nos viene bien, por ejemplo, cuando tenemos un GridView con CheckBoxes, es probable que cuando configuremos el evento Click o CheckChanged del CheckBox no pase nada, para eso tenemos que configurar la propiedad AutoPostBack=True para solucionar el problema. Vía GeeksWithBlogs Más información en Propiedad AutoEventWireUp de la Página y los AutoPostBack de un TextBox o un CheckBox.... - Usos con LDAP del Active Directory desde .NET
Usos con LDAP del Active Directory desde .NET
Utilizar el protocolo LDAP para interactuar con el Active Directory del Servidor. Una de las herramientas más utilizadas para el control de usuarios es utilizar el Active Directory, por lo que Acceder, Crear o Importar datos puede ser una tarea común entre los desarrolladores. Para más información ver las Referencias al final del Artículo. Dado que el artículo es bastante extenso, sólo aquellos usuarios interesados lo visualizaran al completo.Introducción
El Artículo da las herramientas para que un usuario con conocimientos pueda crear funciones para: Autenticar (o Autentificar) usuarios contra el Active Directory Configurar la constraseña desde Código Habilitar una cuenta de Usuario Crear un usuario desde .Net Agregar un usuario a un grupo específico Lista de referencias donde podremos encontrar la información que este artículo no ofrece. Si te interesa el artículo... - Como aplicar estilos CSS o Themes a paginas o Skins a controles en asp.net
Como aplicar estilos CSS o Themes a paginas o Skins a controles en asp.net
Aplicar estilos "Themes" al proyecto, páginas y controles individualmente en ASP.Net. En ocasiones nos encontramos con que las cosas más sencillas son a las que no les prestamos atención. El entorno de Microsoft te incluye varias líneas de código a tus proyectos web, y si tenemos bien definidos los estilos también te incluye el código necesario para incluir el CSS. Los Temas de Estilos en un proyecto web ASP.NET se situan en una carpeta llamada "App_Themes", y dentro creamos todos los temas que queramos. La estructura del proyecto asp.net será parecido a ...Configurar el Proyecto Entero
Para configurar que theme queremos utilizar, sólo tenemos que modificar el web.config del proyecto web.
Si el Theme que creamos se llama "Default", no hace falta que incluyamos el código necesario porque aplica ese Theme por defecto<configuration> <system.web> <pages theme="ThemeName" /> </system.web> </configuration>Aplicar un estilo concreto a una Página
Para aplicar estilos concretos a una página determinada, tenemos que utilizar las siguientes directivas en el fichero .aspx
Si queremos saber más sobre las directivas de las páginas .aspx, tenemos más información en la MSDN Page Attibutes.<%@ Page Theme="ThemeName" %> <%@ Page StyleSheetTheme="ThemeName" %>Aplicar estilo a un WebControl
Podemos aplicar estilos específicos a nuestros WebControls utilizando Skins. Cuando utilizamos los controles asp, podemos configurarlos y aplicarles estilos personalizados y definir la funcionalidad que deseamos. Esta tarea probablemente la repitamos para que todos los controles del mismo tipo tengan el mismo aspecto y configuración. Los Skins lo que hacen es definir una configuración, estilo y comportamiento para un tipo de control, el cual podemos aplicarlo en donde queramos. Los Skins forman parte del Theme, por lo que se aplican directamente por defecto. Dentro del theme "botón Derecho" - "Add New Item" - "Skin File". Creamos el Skin y definimos el estilo de los controles que vamos a utilizar. Por Ejemplo (dentro del fichero .skin)
Y en la página que aplique este Theme, todos los botones tendrán un aspecto como este Pero si lo que queremos es personalizar un Control, tenemos que identificar el estilo del Control con el SkinID<asp:button runat="server" BackColor="lightblue" BorderColor="AliceBlue" Font-Bold ="true" ForeColor="black"/>
y para utilizarlo definimos que tipo de Skin queremos<asp:button runat="server" SkinID="mySkin" BackColor="Brown" BorderColor="AntiqueWhite" Font-Bold ="true" ForeColor="black"/><asp:Button ID="btnMySkinButton" runat="server" SkinID="mySkin" />Referencias
La base del artículo esta en Como Aplicar Themes de la MSDN.... - Llamadas al servidor desde el cliente con DoCallBack y DoPostBack ASP.NET
Llamadas al servidor desde el cliente con DoCallBack y DoPostBack ASP.NET
Microsoft incluye por defecto librerías Javascript para poder realizar DoPostBack y DoCallback. Llamadas a métodos del Servidor desde el lado Cliente. Esta posibilidad es interesante, y en ocasiones es realmente útil, aunque hay que tener bien controlado el repintado de pantalla sino queremos volvernos locos. Por definición el DoPostBack es síncrono y el CallBack es asíncrono, aunque es configurable. De ambas manera podemos llamar a métodos de la parte Servidor desde Javascript.Ejemplo DoCallBack
DoCallBack utiliza la tecnología Ajax para llamar al Servidor y retorna el flujo del proceso a un método CallBack de Javascript. Para conseguirlo debemos implementar la Interface ICallbackEventHandler
Código necesario de la Interfazpublic partial class mipage : System.Web.UI.Page, System.Web.UI.ICallbackEventHandler
El código que realiza la llamada doCallBack desde Javascript es#region ICallbackEventHandler private string respuestaCallBack = string.Empty; void ICallbackEventHandler.RaiseCallbackEvent(string eventArg) { respuestaCallBack = "Es posible "+eventArg; } String ICallbackEventHandler.GetCallbackResult() { return respuestaCallBack; } #endregion
Aunque podemos utilizar el método Page.ClientScript.GetCallbackEventReference(this,...) para generar el código javascript y almacenarlo en alguna variable o atributo de nuestra página. Nosotros nos guardamos en una variable el Control que implementa la Interfaz para llamarlo desde Javascript, aunque se puede hacer más directo.WebForm_DoCallback(controlImplementInterfaz,datosenvio,funcionJScallback,idllamada,funcionJSerror, esAsincrono);
Ejemplo del Código Javascript//Llamamos al siguiente método desde el PageLoad protected void RegisterScriptVariables() { System.Text.StringBuilder sbJS = new System.Text.StringBuilder(); sbJS.Append("var controlImplementInterfaz = '" + this.UniqueID + "';"); // registrar en la página el código JavaScript Page.ClientScript.RegisterClientScriptBlock(this.GetType(),"ScriptVariablesJS", sbJS.ToString(), true); }function CallServer() { WebForm_DoCallback(controlImplementInterfaz, datosenvio, CallServerCallBack, null, null, false); } function CallServerCallBack(result, idLlamada) { alert(result); }Referencias de Ayuda Callbacks
oscarsotorrio.com, ejemplo 1 en castellano. dotnetslackers.com, ejemplo 2 en ingles. edndoc.esri.com, ejemplo 3 en ingles. Los tres ejemplos son complementarios entre sí.Ejemplo DoPostBack
Últimamente el DoPostBack se genera automáticamente por regla general al pulsar cualquier botón o evento en la página, donde el control tenga puesto el "runat=server". Pero podemos utilizar un truco con esta tecnología para llamar a métodos concretos. Aunque no es muy recomendable porque existen otras opciones que con un poco más de tiempo les sacaremos más rentabilidad y a la larga nos vendrá mejor. Los parámetros son: eventTarget: Control que provocará el evento eventArgument: Los parámetros que se desean mandar Para controlar los eventos de las páginas, Microsoft añade dos cajas de texto por cada página ASP.NET que tengamos.
Después cuando realizamos el envío del formulario al servidor, utiliza estos campos para enviar la información del objeto y los parámetros.<input type="hidden" name="__EVENTTARGET" value="" /> <input type="hidden" name="__EVENTARGUMENT" value="" />
Sabiendo esto podemos generar un código en momentos de "crisis" para llamar al método que queramos.function __doPostBack(eventTarget, eventArgument) { if (!theForm.onsubmit || (theForm.onsubmit() != false)) { theForm.__EVENTTARGET.value = eventTarget; theForm.__EVENTARGUMENT.value = eventArgument; theForm.submit(); } }
Referencia en ForosDelWeb....//Javascript function CallServerMethod() { __doPostBack('OpcionA',''); } //Código Servidor protected void Page_Load(object sender, EventArgs e) { if (Request.Params["__EVENTTARGET"] == "OpcionA") ServerMethod(); else //ServerMethodWithParameters(Request.Params["__EVENTARGUMENT"]); if (!Page.IsPostBack) { //... } } protected void ServerMethod() { //Ponemos el código que necesitamos en el lado Servidor } - Las Claves del ModalPopupExtender ASP.NET
Las Claves del ModalPopupExtender ASP.NET
Cosas a tener en cuenta cuando creamos un Modal Popup Extender de las librerias Ajax Control Kit. En ocasiones nos decidimos a mostrar información tipo "PopUp" pero sin que sea directamente un PopUp. El Control ModalPopupExtender nos ayudará para mostrar información tipo PopUp y desactivar el resto de la pantalla. (Que los usuarios tiene el ratón muy suelto).
Este Código hay que completarlo con código Javascript para terminar de cuadrar nuestro Panel Modal.<asp:Button ID="btnModal" runat="server" Text="Consultar 1" CausesValidation="False" OnClientClick="javascript:showmpe();"/> <ajaxToolkit:ModalPopupExtender runat="server" ID="mpeSelec" BehaviorID="mpeSelec" TargetControlID="btnModal" PopupControlID="pnlModal" BackgroundCssClass="modalBackground" OkControlID="btnAceptarModal" OnOkScript="Aceptar()" CancelControlID="btnCancelarModal" OnCancelScript="Cancelar()"> </ajaxToolkit:ModalPopupExtender> <asp:Panel ID="pnlModal" runat="server" style="margin:auto; text-align:center;" Width="400px" class="panel1" BackColor="white" Height="400px"> <!--Aqui el Código que queremos tipo PopUp--> <asp:Panel ID="pnlInfo" runat="server" ScrollBars="Vertical" Height="80%"> <!--Más Código--> </asp:Panel> <div style="text-align: center; margin:auto;"> <asp:Button id="btnAceptarModal" runat="server" Text="Aceptar" CssClass="boton" CausesValidation="False" ></asp:Button> <asp:Button id="btnCancelarModal" runat="server" Text="Cancelar" CssClass="boton" CausesValidation="False" ></asp:Button> </div> </asp:Panel> </asp:Panel>
Este Ejemplo consta de: Un Botón para provocar el evento y mostrar el Panel tipo Modal. La configuración del Control ModalPopupExtender Un Panel que utilizaremos para mostrar la información tipo PopUp en modo Modal Código Javascript para establecer el comportamiento y pasar informaciónfunction showmpe() { var modal=$find('mpeSelec'); if (modal!=null) { modal.show(); } } function Aceptar() { alert('Ok'); } function Cancelar() { alert('Cancel'); }A tener en Cuenta
El ModalPopupExtender se cerrará siempre y cuando se produzca un PostBack. Esta restricción es la clave para controlar correctamente la información que mostramos, ya que si no veremos una especie de parpadeo, o que el PopUp se abre y se cierra sin ningún tipo de control.Posibles Problemas
Aparece y desaparece: escribir style="display:none;" en el Control que identifica la propiedad "PopupControlID" del ModalPopupExtender. Como Recuperar información del Servidor cuando estamos en el lado Cliente. Existen algunas técnicas para realizar llamadas al Servidor sin provocar un PostBack. Webservices, Ajax o utilizando CallBacks, todo requiere de un esfuerzo, así que primero valorar si realmente hace falta. (más adelante explicaremos los "dopostback" y los "docallbacks")Referencias y ayudas
asp.net Ayuda de Referencia sobre las opciones disponibles geeks, excelente ejemplo de como montar el ModalPopupExtender. elrincon de aspnet y ajax ejemplo que incluye el uso de un WebServices.... - Crear clases serializables a partir de un Esquema XML (.XSD)
Crear clases serializables a partir de un Esquema XML (.XSD)
Herramienta y ejemplo para crear clases a partir de una definición de clases XSD. En algunas ocasiones necesitamos definir XML de comunicación o para almacenar información, entre otros usos. Lo interesante es que dado un XML podamos generar el código automáticamente a partir de la definición del Schema XML. El Esquema XML es un lenguaje escrito en XML, normalmente con extensión .XSD, el cual nos ayudará a definir estructuras más complejas de los documentos XML, en comparación con el antiguo DTD (definición de Tipos del documento).Generar Clases a partir del fichero .xsd
Por eso es importante poder obtener y generar el código automático que se encargará de procesar el XML basado en el .xsd (esquema xml). Utilizar la herramienta xsd que proporciona el visual Studio (Por ejemplo ubicado en)
La forma de utilizarlo es Invocando al xsd.exe con los parámetros: Fichero.xsd Generación de clases Lenguaje de genraciónC:\Archivos de programa\Microsoft Visual Studio 8\SDK\v2.0\Binxsd.exe esquema.xsd /classes /language:csReferencias
Programandoen.net Msdn.Microsoft... - No puede cargar Assembly microsoft.office.interop.word
No puede cargar Assembly microsoft.office.interop.word
Problemas con el Assembly microsoft.office.interop.word en un proyecto web asp.net. Si cuando estamos preparando una aplicación web en un servidor IIS nos aparece un error indicando que no puede cargar o no encuentra la librería, lo más problable es porque no esté instalada. Aunque tengamos el Office instalado, puede que la versión que se encuentra en el servidor no tenga las librerias de interoperabilidad del Offices. Las librerías de interoperabilidad del Office, son componentes COM que nos ayudarán a manejar los ficheros Word, Excel desde nuestras aplicaciones .NET. (en teoría desde otros lenguajes también, puesto que son componentes COM).Solución
Descargar O2003PIA Redistributable Primary Interoperability Assemblies e instalarlas en el Servidor.... - Como renderizar un WebControl, por ejemplo un GridView
Como renderizar un WebControl, por ejemplo un GridView
Cuando se utiliza Ajax, es muy posible que necesitemos renderizar o serializar un objeto (convertir a texto/html/xml), para poder utilizarlo desde Javascript en el lado del cliente. En este caso en particular, vamos a ver como renderizar un WebControl desde C#.private string myRenderWebControl(System.Web.UI.WebControls.WebControl ctrl) { StringWriter stringWrite = new StringWriter(); HtmlTextWriter htmlWrite = new HtmlTextWriter(stringWrite); ctrl.RenderControl(htmlWrite); string strHTML = stringWrite.ToString(); return strHTML; }Para que puede servirnos
Imaginaros que tenemos que refrescar una parte de la página con una tabla, una forma sencilla es rellenar un GridView, pero claro los datos los tenemos en el Servidor y no queremos refrescar la página entera. Pues bien, si realizamos una petición al servidor utilizando la tecnología Ajax y tenemos un manejador (.ashx, aspx, ...) que nos construya dinámicamente el GridView. Lo único que tendríamos que hacer es renderizar el GridView y devolverlo hacia el cliente. El cliente solo debería insertar este "string" dentro de un DIV bien situado.
...var ctrl = document.getElementById('elementoId'); ctrl.innerHTML = respuestaAjax; - Conectarse y cargar a un Fichero Excel desde .Net c#
Conectarse y cargar a un Fichero Excel desde .Net c#
Al hacer esto, tenemos que pensar en el fichero Excel como en una Base de Datos, con sus tablas (Sheets), con su Esquema, a quien le podemos realizar una serie de consultas Selects, updates, inserts, aunque por regla general lo normal es leer datos, por lo que nos centraremos en el Select por necesidad. Podemos utilizar un dataset, como se ve en el Ejemplo del ODBC o un IDataReader para leer los datos, todo depende de lo que realmente necesitemos.ConnectionString para Conectarse a una Base de Datos Excel
Gracias a connectionstring.com podemos conectarnos como si de una base de datos se tratara, por ODBC o OLEDBstring connectionString = "Driver={Microsoft Excel Driver (*.xls)};DriverId=790;Dbq="+ExcelPath+";DefaultDir="+System.IO.Path.GetDirectoryName(ExcelPath); string connectionString = "Provider=Microsoft.Jet.OLEDB.4.0;" + "Data Source=" + ExcelPath + ";Extended Properties=\"Excel 8.0;IMEX=1\"";ODBC
OdbcConnection _connection = new OdbcConnection(connectionString); OdbcDataAdapter _adapter = new OdbcDataAdapter(); OdbcCommand _cmd = new OdbcCommand(); DataSet _data = new DataSet(); _connection.Open(); _cmd.CommandText = "SELECT * FROM "+EXCEL_NOMBRESHEET; _cmd.Connection = _connection; _adapter.SelectCommand = _cmd; //Llenar el DataSet _adapter.Fill(_data, EXCEL_NOMBRESHEET); _connection.Close(); return _data;OleDB
Pero esta vez completamos un poco el algoritmo, para que se cierre siempre la conexión y no deje el fichero Excel "enganchado".OleDbConnection _connection = new OleDbConnection(connectionString); OleDbDataAdapter _adapter = new OleDbDataAdapter(); OleDbCommand _cmd = new OleDbCommand(); DataTable _dataTable = null; System.Collections.ArrayList list = new System.Collections.ArrayList(); try { _connection.Open(); _cmd.CommandText = "SELECT * FROM "+EXCEL_NOMBRESHEET; _cmd.Connection = _connection; OleDbDataReader reader = _cmd.ExecuteReader(); while (reader.Read()) { //myDataObjectAdapter fila = new myDataObjectAdapter(); fila.dato1 = reader[COL_1].ToString().Trim(); //list.Add(fila); } } finally { if (_connection.State != System.Data.ConnectionState.Closed) { _connection.Close(); } } return list;Problema DBNull al recuperar de una Hoja Excel
Por defecto al recuperar los datos del Excel, se cogen los primeros 8 valores y se calcula el tipo de la columna, por lo que si automáticamente se define la columna de tipo numérico y viene una celda de tipo texto, lo que nos retornará será DBNull. A mi se me ha solucionado el problema de la siguiente forma. En Lugar de utilizar el "SELECT * FROM "+EXCEL_NOMBRESHEET podemos definir las columnas que queremos devolver del Excel.
Además de incluir en el connectionstring por OLEDB la propiedad IMEX=1, que indica que puede venir cualquier valor, el problema es que para que funcione correctamente hay que modificar el registro para decirle al Excel que utilice 0 columnas para autodetectar el tipo de la columna. Forzando las columnas a devolver de la consulta se me ha solucionado el problema.string SQLColumns = string.Empty; SQLColumns = "["+COL_1+"], ["+COL_2+"], ["+COL_3+"] "; "SELECT "+SQLColumns+" FROM "+EXCEL_NOMBRESHEETObtener el nombre de la Sheet (Hoja) Excel por Posición.
//OleDB Incluido en el Framework 1.1 _dataTable = _connection.GetOleDbSchemaTable(OleDbSchemaGuid.Tables, null); //Odbc _dataTable = _connection.GetSchema(); //Sólo válido con Framework 2.0 o superior if (_dataTable == null) { SheetName = EXCEL_NOMBRESHEET; } else { //con OleDB, en Odbc será parecido sino igual SheetName = "["+_dataTable.Rows[0]["TABLE_NAME"].ToString()+"]"; }Leyenda
EXCEL_NOMBRESHEET = "[Hoja1$]"; COL_1, COL_2, COL_3 = "Columna que permite espacios"Conclusión
Espero que os sirva y que os sea de ayuda este "mini" apunte de problemas y soluciones a la carga de un Excel desde .Net C#...