tag:blogger.com,1999:blog-88993314773975360592024-03-06T00:08:33.749-05:00C# AL EXTREMOEl Conocimiento es un Don Divino que se incrementa a medida que se COMPARTE.Jairo Ortizhttp://www.blogger.com/profile/15511019924919091246noreply@blogger.comBlogger59125tag:blogger.com,1999:blog-8899331477397536059.post-42440206075086514952021-07-10T14:27:00.003-05:002021-07-10T14:28:58.324-05:00Varchar o nvarchar, ese era el dilema<br /><div><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh1OLoFWqjhWYIq443GWnCoHkPjS1X3TlabV9u2F6IbFftYAQL3BB1YuisEvNTjUTlB-HVvFAg1JiOL8MJu1k-dS2h6Nzh3UJ53a-EYN4E4Nh0t3YJgwNmiFFzoLPQ59nV4TziWzpwvB6o/s799/Difference-Between-varchar-and-nvarchar-Comparison-Summary%255B1%255D.jpg" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" data-original-height="725" data-original-width="799" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh1OLoFWqjhWYIq443GWnCoHkPjS1X3TlabV9u2F6IbFftYAQL3BB1YuisEvNTjUTlB-HVvFAg1JiOL8MJu1k-dS2h6Nzh3UJ53a-EYN4E4Nh0t3YJgwNmiFFzoLPQ59nV4TziWzpwvB6o/s320/Difference-Between-varchar-and-nvarchar-Comparison-Summary%255B1%255D.jpg" width="320" /></a></div><br /><span face="-apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen, Ubuntu, Cantarell, "Fira Sans", "Droid Sans", "Helvetica Neue", sans-serif" style="background-color: #fefefe; color: #0a0a0a; font-size: 16px;"><br /></span></div><div><span face="-apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen, Ubuntu, Cantarell, "Fira Sans", "Droid Sans", "Helvetica Neue", sans-serif" style="background-color: #fefefe; color: #0a0a0a; font-size: 16px;"><br /></span></div><div><span face="-apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen, Ubuntu, Cantarell, "Fira Sans", "Droid Sans", "Helvetica Neue", sans-serif" style="background-color: #fefefe; color: #0a0a0a; font-size: 16px;">SQL Server dispone de varios tipos de datos, cada tipo de datos nos va servir para almacenar un dato que después podemos convertir en información, pero hay dos tipos de datos que generan dudas entre desarrolladores : VARCHAR y NVARCHAR: ¿Cuál es la diferencia entre ambos tipos de datos?</span></div><div><p style="background-color: #fefefe; box-sizing: inherit; color: #0a0a0a; font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen, Ubuntu, Cantarell, "Fira Sans", "Droid Sans", "Helvetica Neue", sans-serif; font-size: 16px; line-height: 1.6; margin: 0px 0px 1rem; padding: 0px; text-rendering: optimizelegibility;"><span id="more-153" style="box-sizing: inherit;"></span></p><p style="background-color: #fefefe; box-sizing: inherit; color: #0a0a0a; font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen, Ubuntu, Cantarell, "Fira Sans", "Droid Sans", "Helvetica Neue", sans-serif; font-size: 16px; line-height: 1.6; margin: 0px 0px 1rem; padding: 0px; text-rendering: optimizelegibility;"><span style="box-sizing: inherit; font-weight: 700; line-height: inherit;">VARCHAR</span> es una abreviatura de cadena de caracteres de longitud variable (del inglés VARiable CHARacter). Puede almacenar una cadena de caracteres que puede ser tan grande como el tamaño de página de la tabla. El tamaño de una página de una tabla en SQL Server es 8.196 bytes, ninguna fila de una tabla en SQL Server puede ser más de 8.060 caracteres. <span style="box-sizing: inherit; color: blue;">Esto a su vez limita el tamaño máximo de un VARCHAR a 8.000 bytes</span>.</p><p style="background-color: #fefefe; box-sizing: inherit; color: #0a0a0a; font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen, Ubuntu, Cantarell, "Fira Sans", "Droid Sans", "Helvetica Neue", sans-serif; font-size: 16px; line-height: 1.6; margin: 0px 0px 1rem; padding: 0px; text-rendering: optimizelegibility;"><span style="box-sizing: inherit; font-weight: 700; line-height: inherit;">NVARCHAR</span> significa «casi» lo mismo, con la diferencia que se puede almacenar datos en formato unicode, de ahí proviene la N (uNicode).</p><p style="background-color: #fefefe; box-sizing: inherit; color: #0a0a0a; font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen, Ubuntu, Cantarell, "Fira Sans", "Droid Sans", "Helvetica Neue", sans-serif; font-size: 16px; line-height: 1.6; margin: 0px 0px 1rem; padding: 0px; text-rendering: optimizelegibility;">¿Y para que sirve almacenar datos en Unicode? Si la columna donde almacenamos el texto es Unicode quiere decir que no tendremos problemas para guardar y recuperar caracteres que se usan en otros idiomas como el español (á é í ó ú ñ) o el chino, pero con el español los problemas de visualización no son muy frecuentes, con el resto de idiomas sí.</p><p style="background-color: #fefefe; box-sizing: inherit; color: #0a0a0a; font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen, Ubuntu, Cantarell, "Fira Sans", "Droid Sans", "Helvetica Neue", sans-serif; font-size: 16px; line-height: 1.6; margin: 0px 0px 1rem; padding: 0px; text-rendering: optimizelegibility;">La diferencia principal entre los dos tipos de datos es la forma en que están almacenados. Cada carácter del tipo de dato VARCHAR se almacena en 8 bits (1 byte). Pero las cadenas NVARCHAR se almacenan en la base al estándar UTF-16 – de 16 bits o dos bytes por carácter, eso quiere decir que con el tipo de dato NVARCHAR sólo podremos almacenar la mitad: 4000 caracteres.</p><p style="background-color: #fefefe; box-sizing: inherit; color: #0a0a0a; font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen, Ubuntu, Cantarell, "Fira Sans", "Droid Sans", "Helvetica Neue", sans-serif; font-size: 16px; line-height: 1.6; margin: 0px 0px 1rem; padding: 0px; text-rendering: optimizelegibility;">Esta es ser la razón por la que los usuarios que no cuentan con caracteres especiales en su alfabeto prefieren guardar la información en campos VARCHAR. Ahora mismo ya no es una tendencia el ahorro de espacio ya que existe muchísimo disponible incluso en la nube sin mucho costo, la cosa cambia en dispositivos móviles pero esa es otra historia. Sin embargo depende de nosotros cuando y donde usar la combinación de ambos tipos de datos.</p>
<br />
<br />
Espero que lo disfruten, compartan y comenten. ;)
<br />
<br />
<div style="color: #741b47;">
<b>"Si se puede imaginar... se puede programar."</b></div>
</div><div class="blogger-post-footer">“Primero resuelve el problema. Entonces, escribe el código.”
— John Johnson</div>Jairo Ortizhttp://www.blogger.com/profile/15511019924919091246noreply@blogger.com0tag:blogger.com,1999:blog-8899331477397536059.post-78228235113960881952018-06-01T08:00:00.000-05:002018-06-01T08:00:03.843-05:00Como trabajar con LinQ C # Lambda Expression<br />
Si está utilizando LinQ como ORM y haciendo que su personal termine de forma orientada a objetos simples, ¡eso es bueno! ¿Has visto algún código mágico de un trazador de líneas que no parece muy familiar para nuestro código C # habitual? Esas son expresiones lambda, una forma genial de hacer las cosas de una manera simple y fácil. En el tutorial de hoy discutiremos sobre la comprensión básica de la expresión lambda C #, que juega un papel muy importante en .NET LinQ , una tecnología muy fácil, eficiente y efectiva para manejar datos.<br />
<br />
<h2>
¿Qué son expresiones Lambda?</h2>
<br />
<pre class="brush: csharp">(Input Parameters) => Method Expression
</pre>
<br />
No te enojes con solo echar un vistazo a la declaración de expresión de lambda, no es un idioma extraño. ¡Es simplemente una función (o delegado)! Bueno, podemos llamarlo función anónima . Es una función sin nombre. Pero tiene un parámetro y un valor de retorno, pero son dinámicos, lo que significa que podemos poner cualquier cosa por ellos, está sobre nosotros. ¡Guauu! Que flexible Sí lo es.<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhxU2zCv7OdqXIl2sPFOHNDvjYoS2L4UWUL72V1XH3X6Dl0z9jK7beoOt_pBcN7dDWxp5ktcVgfT2GKaYOaTz4gpIZE8ogGuJMV-RexJQS_3EbX39PBHpsidPNdG4rQr3evsEwdTA7KybQ/s1600/Lambda-300x199%255B1%255D.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" data-original-height="199" data-original-width="300" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhxU2zCv7OdqXIl2sPFOHNDvjYoS2L4UWUL72V1XH3X6Dl0z9jK7beoOt_pBcN7dDWxp5ktcVgfT2GKaYOaTz4gpIZE8ogGuJMV-RexJQS_3EbX39PBHpsidPNdG4rQr3evsEwdTA7KybQ/s1600/Lambda-300x199%255B1%255D.png" /></a></div>
Sin embargo, tendrás que recordar una cosa, tan pronto como la usemos en el código, donde sea que esté, su alcance termina allí mismo, no hay forma de reutilizarlo más, ¡ya que hay un nombre asignado a él! Por lo tanto, en su mayoría, utilizaremos esto en algunas tareas que necesitarán algunos cálculos y queremos escribir de manera fácil y eficiente, pero no es necesario volver a utilizarlo a menudo. Si es necesario, debe asignarse a un delegado o tipo 'Func'.<br />
<br />
<br />
<h2>
Uso general de C # Lambda Expression:</h2>
En general, la expresión lambda es útil al usar la consulta LinQ en su aplicación y aplicarla en una lista de datos, ya sea desde la base de datos, desde XML o dinámico. En otras palabras, lo usamos habitualmente para filtrar algunos datos específicos de una lista de datos que cumple con los criterios y usarlos en una operación LinQ. La expresión lambda se puede usar en un amplio rango de área como linq a sql, linq a xml, linq a entidad (marco de entidad), datos de matriz / lista, etc.<br />
<h2>
Un ejemplo simple:</h2>
Por favor, eche un vistazo a la siguiente expresión:<br />
<br />
<pre class="brush: csharp">x => x >10
</pre>
<br />
Este es un ejemplo muy simple de cómo puede ser una expresión lambda. La primera parte, antes del símbolo '=>', se considera como el parámetro de entrada. No necesita ser definido previamente, es dinámico. Decide el tipo de forma inteligente, incluso en tiempo de compilación, cuando lo está escribiendo, en función de la operación que se realiza en él.<br />
<br />
Como dijimos, queremos filtrar algunos datos específicos de una lista de datos, este parámetro de entrada representa el tipo de cada elemento de la lista. Digamos, estamos tratando con una lista de datos enteros, entonces x es un número entero. Si estamos tratando con una lista de objetos 'A', entonces x también será del tipo 'A' y obtendrás soporte completo del estudio visual inteligente para ello.<br />
<br />
Entonces veamos la declaración completa de la expresión anterior:<br />
<br />
<pre class="brush: csharp">int[] somevalues = { 10, 20, 5, 2, 40, 1 };
int numberOfExpectedValues = somevalues.Count(x => x >10);
</pre>
<br />
Como puede ver, la expresión lambda es un valor de retorno que se está aplicando en el método 'Cuenta' de la matriz de enteros de 'algunos valores'. Entonces, mencioné, ahora x será tratado como un número entero. Y la expresión devolverá un valor verdadero / falso al probar cada elemento de la matriz 'some values' y se usará como método delegado de recuento. finalmente, en la variable 'numberOfExpectedValues', recibiremos cuántos datos cumplen los criterios de ser mayores que 10.<br />
<br />
<h2>
Otro ejemplo de pseudo código:</h2>
¿Cómo podemos usarlo en una lista de objetos y qué tan útil sería? Veamos un pseudo código en c # (tienes que escribir algunos códigos más para hacerlo compilar):<br />
<br />
<pre class="brush: csharp">List<user> myUsers = New List<user>();
//llene la lista myUsers con algún objeto User
List<user> activeUsers = myUsers.Where(u => u.Active == True);
//la lista de Usuarios activos contendrá solo usuarios activos filtrados de la lista de todos los usuarios
<span style="font-family: Times New Roman;"><span style="white-space: normal;">
</span></span></user></user></user></pre>
<br />
<br />
Entonces, sin usar ninguna consulta SQL fea o pocas líneas de códigos para que una función lo haga manualmente, estamos teniendo esto en una sola línea de código práctico. ¿No es asombroso?<br />
<br />
Espero que lo disfruten, compartan y comenten. ;)
<br />
<br />
<div style="color: #741b47;">
<b>"Si se puede imaginar... se puede programar."</b></div>
<div class="blogger-post-footer">“Primero resuelve el problema. Entonces, escribe el código.”
— John Johnson</div>Jairo Ortizhttp://www.blogger.com/profile/15511019924919091246noreply@blogger.com0tag:blogger.com,1999:blog-8899331477397536059.post-81130172043942614902018-05-31T08:00:00.000-05:002018-05-31T08:00:09.639-05:00Como a usar la colección de diccionarios en C#<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiogebiJnU7hdQeXIRgQPL9vg7wHEhjfeQ0o03lSRiSbLXeF7wqAvQo1C3rbfoht1J8YGqtS1FE_b8SemWJ4fYPynBYObrOk1zBQk7ZzZajKrLXFFhC1zjvm1ja1uLrsyGz2nG1N0ppbCY/s1600/csharp-250x250%255B1%255D.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" data-original-height="250" data-original-width="250" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiogebiJnU7hdQeXIRgQPL9vg7wHEhjfeQ0o03lSRiSbLXeF7wqAvQo1C3rbfoht1J8YGqtS1FE_b8SemWJ4fYPynBYObrOk1zBQk7ZzZajKrLXFFhC1zjvm1ja1uLrsyGz2nG1N0ppbCY/s1600/csharp-250x250%255B1%255D.png" /></a></div>
<br />
El término 'Diccionario' en C # programación, tiene algunos otros sinónimos para referirse a él como "matriz asociativa", "<span style="background-color: white; color: #444444; font-family: "pt sans" , sans-serif; font-size: 16px;">key-value pair</span>", "<span style="background-color: white; color: #444444; font-family: "pt sans" , sans-serif; font-size: 16px;">index-value pair</span>", etc. Diccionario utiliza la estructura de datos ' tabla hash ' para construir subir el <span style="background-color: white; color: #444444; font-family: "pt sans" , sans-serif; font-size: 16px;">index/value pair</span>. En realidad, este es un sistema de matriz extendida / avanzada donde puede definir el índice con otros tipos de datos que no sean int y configurar su estructura de datos de una manera más significativa. En este tutorial, veremos el uso básico de la clase de diccionario c#.<br />
<br />
<br />
<br />
<br />
<br />
<blockquote class="tr_bq">
<i>¡Espere! ¿Sabía que, por defecto, los objetos de diccionario en c # no se pueden serializar? Aquí, además de la introducción a la clase de diccionario c #, también le mostraré cómo puede hacer que su objeto de diccionario sea serializado / deserializado a / desde XML también. </i></blockquote>
<br />
<h2>
Inicializar un objeto de diccionario en C#:</h2>
Como el diccionario funciona con dos tipos de datos (uno para 'clave' y otro para 'valor'), requiere ambos tipos de datos para ser definidos en el momento de la inicialización. Además, se requiere el espacio de nombre "System.Collections.Generic" para usar el diccionario en su aplicación.<br />
<br />
El siguiente fragmento inicializará un diccionario simple con cadena como ambos tipos de datos:<br />
<br />
<pre class="brush: csharp">Dictionary<string string=""> myDictionaryData
= new Dictionary<string string="">();
</string></string></pre>
<br />
<br />
También podemos definir algunos valores iniciales predeterminados en el momento de la inicialización. Los siguientes ejemplos agregarán dos pares de datos en el objeto en el momento de la inicialización:<br />
<br />
<pre class="brush: csharp">Dictionary<string string=""> myDictionaryData
= new Dictionary<string string="">() {
{"testDictionaryIndex1","Test Dictionary Data Value 1"},
{"testDictionaryIndex2","Test Dictionary Data Value 2"}};
</string></string></pre>
<br />
<br />
<h2>
Agregar / eliminar pares en el objeto del diccionario:</h2>
Insertar y eliminar operaciones es bastante fácil con un objeto de diccionario. Para agregar un nuevo par, deberá pasar la clave y el valor como parámetro en el método "Agregar" en el objeto. La eliminación del objeto solo se realiza mediante la parte 'clave'. Solo tiene que pasarlo al método "Eliminar" del objeto. Compruebe los siguientes ejemplos de código c # para agregar / eliminar par de datos del diccionario al objeto:<br />
<br />
<pre class="brush: csharp">//pasar tanto la clave como el valor para agregar un nuevo par
myDictionaryData.Add("test1", "test value 1");
//pasar solo la clave para eliminar un par
myDictionaryData.Remove("test1");
</pre>
<br />
<h2>
Atraviesa los pares en un objeto de diccionario:</h2>
También hay una versión de par de valor único para la clase de diccionario C #. Es la clase 'KeyValuePair' que puede contener un solo par. Cuando realizamos un desplazamiento con o para el bucle foreach , esta variable de clase se puede usar para mantener cada par y procesarlo más si es necesario.<br />
<br />
<pre class="brush: csharp">foreach (KeyValuePair<string string=""> myItem in myDictionaryData)
{
//Hacer lo necesario con myItem
Console.WriteLine(myItem.Key + " : " + myItem.Value);
}
</string></pre>
<br />
<h2>
Fusionar dos diccionario:</h2>
¿Qué sucede si tenemos que fusionar dos diccionarios diferentes en un solo objeto de diccionario? Sí, podemos hacerlo. El siguiente ejemplo utiliza la técnica de expresión C # LinQ Lambda para fusionar dos diccionarios diferentes en un tercero diferente:<br />
<br />
<pre class="brush: csharp">Dictionary<string string=""> myDictionaryData1
= new Dictionary<string string="">() {
{"testDictionary1Index1","Test Dictionary1 Data Value 1"},
{"testDictionary1Index2","Test Dictionary1 Data Value 2"}};
Dictionary<string string=""> myDictionaryData2
= new Dictionary<string string="">() {
{"testDictionary2Index1","Test Dictionary2 Data Value 1"},
{"testDictionary2Index2","Test Dictionary2 Data Value 2"}};
Dictionary<string string=""> mergedDictionary = new Dictionary<string string="">();
myDictionaryData1.ToList().ForEach(x => mergedDictionary.Add(x.Key, x.Value));
myDictionaryData1.ToList().ForEach(x => mergedDictionary.Add(x.Key, x.Value));
<span style="font-family: "times new roman";"><span style="white-space: normal;">
</span></span></string></string></string></string></string></string></pre>
<br />
<br />
<h2>
Implementar diccionario serializable en C #:</h2>
Como por defecto .NET Framework no proporciona la facilidad de la serialización c # xml para los objetos del Diccionario, tendremos que implementarlo nosotros mismos. podemos hacerlo implementando la interfaz "IXMLSerializable". La siguiente clase personalizada debe hacer su trabajo bien:<br />
<br />
<pre class="brush: csharp">using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Xml.Serialization;
[XmlRoot("dictionary")]
public class SerializableDictionary<tkey tvalue=""> :
Dictionary<tkey tvalue="">, IXmlSerializable
{
#region IXmlSerializable Members
public System.Xml.Schema.XmlSchema GetSchema()
{
return null;
}
/// <summary>
/// Custom implementation to read xml data and assign into dictionary
/// </summary>
/// <param name="reader" />XmlReader object to be used
public void ReadXml(System.Xml.XmlReader reader)
{
XmlSerializer keySerializer = new XmlSerializer(typeof(TKey));
XmlSerializer valueSerializer = new XmlSerializer(typeof(TValue));
bool wasEmpty = reader.IsEmptyElement;
reader.Read();
if (wasEmpty)
{
return;
}
while (reader.NodeType != System.Xml.XmlNodeType.EndElement)
{
reader.ReadStartElement("item");
reader.ReadStartElement("key");
TKey key = (TKey)keySerializer.Deserialize(reader);
reader.ReadEndElement();
reader.ReadStartElement("value");
TValue value = (TValue)valueSerializer.Deserialize(reader);
reader.ReadEndElement();
this.Add(key, value);
reader.ReadEndElement();
reader.MoveToContent();
}
reader.ReadEndElement();
}
/// <summary>
/// Custom implementation to write dictionary into xml file
/// </summary>
/// <param name="writer" />XmlWriter object to be used
public void WriteXml(System.Xml.XmlWriter writer)
{
XmlSerializer keySerializer = new XmlSerializer(typeof(TKey));
XmlSerializer valueSerializer = new XmlSerializer(typeof(TValue));
foreach (TKey key in this.Keys)
{
writer.WriteStartElement("item");
writer.WriteStartElement("key");
keySerializer.Serialize(writer, key);
writer.WriteEndElement();
writer.WriteStartElement("value");
TValue value = this[key];
valueSerializer.Serialize(writer, value);
writer.WriteEndElement();
writer.WriteEndElement();
}
}
#endregion
}
</tkey></tkey></pre>
<br />
Y esto es todo amigos!<br />
<br />
Espero que lo disfruten, compartan y comenten. ;)
<br />
<br />
<div style="color: #741b47;">
<b>"Si se puede imaginar... se puede programar."</b></div>
<div class="blogger-post-footer">“Primero resuelve el problema. Entonces, escribe el código.”
— John Johnson</div>Jairo Ortizhttp://www.blogger.com/profile/15511019924919091246noreply@blogger.com0tag:blogger.com,1999:blog-8899331477397536059.post-3455316498930776462018-05-30T08:27:00.000-05:002018-05-30T08:40:54.601-05:00Aplicar LinQ a datos XML usando C#<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjg2GVgAe88NC2lkUu1f__-GBuaOxk5j8WssTtKZOnjjRAIER6j-tzfSVStVNLxrLik4NHALn3NjQGRIMLHFmxPXer3kvObvKPv2dQ09siDm7zak3QVCujHC5NWADUab5VP9JrZrljU-CU/s1600/linq%255B1%255D.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" data-original-height="249" data-original-width="259" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjg2GVgAe88NC2lkUu1f__-GBuaOxk5j8WssTtKZOnjjRAIER6j-tzfSVStVNLxrLik4NHALn3NjQGRIMLHFmxPXer3kvObvKPv2dQ09siDm7zak3QVCujHC5NWADUab5VP9JrZrljU-CU/s1600/linq%255B1%255D.png" /></a></div>
<br />
<br />
Hoy voy a mostrar cómo se puede aplicar linq en datos XML junto con ejemplos de código c #. Esto se conoce como 'Linq To XML'. Supongo que ya está familiarizado con el uso básico de Linq. Si no, mi sugerencia será estudiar los conceptos básicos de Linq primero. Aquí, en este tutorial, mostraré las operaciones más básicas, como recuperar datos (seleccionar), insertar datos, borrar datos y modificar datos existentes desde y hacia el archivo xml utilizando linq.<br />
<br />
<br />
<br />
<br />
<h2 style="background-color: white; box-sizing: border-box; color: #333333; font-family: "PT Sans", sans-serif; font-size: 30px; line-height: 1.2; margin: 0px 0px 16px;">
Data de muestra:</h2>
Para este ejercicio simple, utilizaremos una estructura de archivo xml muy básica de la siguiente manera:<br />
<br />
<br />
<pre class="brush: csharp"><students>
<student id="1">
<name>Test1</name>
</student>
<student id="2">
<name>Test2</name>
</student>
<student id="3">
<name>Test3 </name>
</student>
</students>
</pre>
<br />
Este archivo tiene un elemento raíz llamado 'estudiantes' que contiene un conjunto de elementos con la etiqueta 'estudiante', se refiere a cada estudiante en el conjunto de datos. Cada 'estudiante' tiene un atributo 'id' y un elemento interno 'nombre'. Para una estructura más compleja, podemos agregar tantos atributos / elementos internos que deseemos.<br />
<br />
<br />
<h2 style="background-color: white; box-sizing: border-box; color: #333333; font-family: "pt sans", sans-serif; font-size: 30px; line-height: 1.2; margin: 0px 0px 16px;">
Recuperación de datos utilizando linq To XML:</h2>
Primero voy a poner un fragmento de código que realmente hará ese trabajo de recuperar datos del archivo xml. Luego explicaré cómo funciona en cada paso.<br />
<pre class="brush: csharp">private string path = "TestData.xml";
private void GetXMLData()
{
try
{
XDocument testXML = XDocument.Load(path);
var students = from student in testXML.Descendants("Student")
select new
{
ID = Convert.ToInt32(student.Attribute("ID").Value),
Name = student.Element("Name").Value
};
foreach (var student in students)
{
// Do other operations with each student object
}
}
catch (Exception err)
{
MessageBox.Show(err.Message);
}
}
</pre>
<br />
<br />
Al principio, necesitaremos crear un objeto "XDocument" del archivo xml. Simplemente pasar la ubicación del archivo como parámetro del constructor funcionará bien. Aquí, dos cosas deben recordarse cuidadosamente:<br />
<br />
<ul>
<li>Si el archivo xml no está en formato xml válido, arrojará una excepción.</li>
<li>El ejemplo anterior es para el formato de aplicación de escritorio, donde se requiere que el archivo xml esté en el directorio actual desde donde se ejecuta la aplicación. Si necesita especificar alguna otra ubicación, debe ser necesario especificar el URI absoluto para ese archivo. Si se trata de una aplicación web, es posible que deba utilizar el método Server.MapPath () para especificar el uri correctamente.</li>
</ul>
<br />
Ahora, tan pronto como obtengamos un objeto XDocument válido, estamos listos para aplicar la operación linq sobre él. Para especificar los elementos que se consultarán, necesitamos usar el patrón "xDocObject.Descendants (elementTagName)". Puede ver que hemos utilizado expresiones similares en la consulta de linq. Mientras selecciona, puede crear un objeto dinámico con las propiedades que necesita. O puede declarar de antemano, una clase con miembros y crear un objeto de esa clase. En el código anterior, hemos utilizado el enfoque de objeto dinámico simplificado.<br />
<br />
<br />
<h2 style="background-color: white; box-sizing: border-box; color: #333333; font-family: "PT Sans", sans-serif; font-size: 30px; line-height: 1.2; margin: 0px 0px 16px;">
Insertar datos usando Linq a XML:</h2>
Insertar datos en un archivo xml usando linq es bastante directo. primero necesitaremos preparar un objeto XElement apropiado que se insertará. De nuevo, hay que tener cuidado de que el XElement construido esté completamente sincronizado con el formato del archivo xml. Y luego, tenemos que agregarlo a la colección de elementos correspondientes de los objetos 'Xdocument' y finalmente sobrescribir el archivo xml existente. Aquí está el ejemplo de código para esto:<br />
<pre class="brush: csharp">private void InsertXMLData(string name)
{
try
{
XDocument testXML = XDocument.Load(path);
XElement newStudent = new XElement("Student",
new XElement("Name", name)
);
var lastStudent = testXML.Descendants("Student").Last();
int newID = Convert.ToInt32(lastStudent.Attribute("ID").Value);
newStudent.SetAttributeValue("ID",4);
testXML.Element("Students").Add(newStudent);
testXML.Save(path);
}
catch (Exception err)
{
MessageBox.Show(err.Message);
}
}
</pre>
<br />
<h2 style="background-color: white; box-sizing: border-box; color: #333333; font-family: "PT Sans", sans-serif; font-size: 30px; line-height: 1.2; margin: 0px 0px 16px;">
Modify Existing Data Using Linq To XML:</h2>
Para cambiar el registro existente en el archivo xml, primero necesitaremos recuperar el registro que coincida con algunas restricciones, como la coincidencia del atributo id o la coincidencia del valor del nombre. Guarde los datos recuperados en XElement, luego realice los cambios necesarios y finalmente aplique la operación de salvar en la clase de objeto XDocument. Tenga en cuenta que no es necesario reasignar el objeto XElement modificado como referencia interna desde el objeto XDocument y aplicar los cambios necesarios mientras se guarda. Lo siguiente es la muestra del código para hacer la modificación:<br />
<br />
<pre class="brush: csharp">private void UpdateXMLData(string name,int id)
{
try
{
XDocument testXML = XDocument.Load(path);
XElement cStudent = testXML.Descendants("Student").Where(c => c.Attribute("ID").Value.Equals(id.ToString())).FirstOrDefault();
cStudent.Element("Name").Value = name;
testXML.Save(path);
}
catch (Exception err)
{
MessageBox.Show(err.Message);
}
}
</pre>
<br />
<br />
<h2 style="background-color: white; box-sizing: border-box; color: #333333; font-family: "PT Sans", sans-serif; font-size: 30px; line-height: 1.2; margin: 0px 0px 16px;">
Eliminar un registro del archivo XML utilizando Linq:</h2>
Para eliminar un registro, simplemente tenemos que recuperarlo y luego llamar al método "Eliminar" de este Objeto XElement. que hará la eliminación necesaria en el objeto XDocument y finalmente aplicará los cambios al sobreescribir el archivo xml. A continuación se muestra el ejemplo del código que eliminará un registro:<br />
<br />
<br />
<pre class="brush: csharp">private void DeleteXMLData(int id)
{
try
{
XDocument testXML = XDocument.Load(path);
XElement cStudent = testXML.Descendants("Student").Where(c => c.Attribute("ID").Value.Equals(id.ToString())).FirstOrDefault();
cStudent.Remove();
testXML.Save(path);
}
catch (Exception err)
{
MessageBox.Show(err.Message);
}
}
</pre>
<br />
<br />
Eso es todo por hoy, espero que sea clara la información, si tienen alguna duda, escríbanme en los comentarios y pronto responderé!<br />
<br />
Espero que lo disfruten, compartan y comenten. ;)
<br />
<br />
<div style="color: #741b47;">
<b>"Si se puede imaginar... se puede programar."</b></div>
<div class="blogger-post-footer">“Primero resuelve el problema. Entonces, escribe el código.”
— John Johnson</div>Jairo Ortizhttp://www.blogger.com/profile/15511019924919091246noreply@blogger.com0tag:blogger.com,1999:blog-8899331477397536059.post-72925227682892392442018-04-11T12:11:00.000-05:002018-05-29T17:28:44.538-05:00Como trabajar con multiproceso en C # .NET<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgKx69v7EPBUTcDJ_Z4QnCCYwsZClfWqne1IPgZMv0gIVCozMvr04MxR0wjaM34jQQ7ao6FtZmzMnzhPu8HbWDKjNNbD3zPODSYWae3ORyAGQDjCG-nvlJMG4lbHB8H_SE3UVOv2lEB6HQ/s1600/multithreaded-programming%255B1%255D.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" data-original-height="208" data-original-width="220" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgKx69v7EPBUTcDJ_Z4QnCCYwsZClfWqne1IPgZMv0gIVCozMvr04MxR0wjaM34jQQ7ao6FtZmzMnzhPu8HbWDKjNNbD3zPODSYWae3ORyAGQDjCG-nvlJMG4lbHB8H_SE3UVOv2lEB6HQ/s1600/multithreaded-programming%255B1%255D.png" /></a></div>
<span class="notranslate" style="background-color: white; box-sizing: border-box; color: #444444; font-family: "pt sans" , sans-serif; font-size: 16px;"><br /></span>
<span class="notranslate" style="background-color: white; box-sizing: border-box; color: #444444; font-family: "pt sans" , sans-serif; font-size: 16px;">Al trabajar con el desarrollo de aplicaciones de escritorio, a veces es posible que tengamos que trabajar con programación multiproceso.</span><span style="background-color: white; color: #444444; font-family: "pt sans" , sans-serif; font-size: 16px;"> </span><span class="notranslate" style="background-color: white; box-sizing: border-box; color: #444444; font-family: "pt sans" , sans-serif; font-size: 16px;">También puede ayudar a optimizar el rendimiento del software ya que hace la mayor parte del uso de los núcleos de la CPU y, por lo tanto, proporciona un mejor rendimiento / resultados.</span><span style="background-color: white; color: #444444; font-family: "pt sans" , sans-serif; font-size: 16px;"> </span><span class="notranslate" style="background-color: white; box-sizing: border-box; color: #444444; font-family: "pt sans" , sans-serif; font-size: 16px;">Nos referimos a este tipo de implementación como 'multitarea' también.</span><span style="background-color: white; color: #444444; font-family: "pt sans" , sans-serif; font-size: 16px;"></span><span class="notranslate" style="background-color: white; box-sizing: border-box; color: #444444; font-family: "pt sans" , sans-serif; font-size: 16px;">Como en tal caso, nuestra aplicación podrá realizar diferentes tipos de tareas al mismo tiempo, en paralelo.</span><br />
<span class="notranslate" style="background-color: white; box-sizing: border-box; color: #444444; font-family: "pt sans" , sans-serif; font-size: 16px;"><br /></span><span class="notranslate" style="background-color: white; box-sizing: border-box; color: #444444; font-family: "pt sans" , sans-serif; font-size: 16px;"><br /></span>
<span class="notranslate" style="background-color: white; box-sizing: border-box;"><span style="color: #444444; font-family: "pt sans" , sans-serif;">Por ejemplo, solo considere un escenario de desarrollo de aplicaciones de escritorio basado en una base de datos simple, donde su aplicación recuperará una serie de datos y mostrará al usuario. Ahora, si la conectividad de la base de datos es lenta por alguna razón, su aplicación normalmente se atascará. El usuario no podrá hacer nada más que esperar a que el proceso finalice. En tales casos, podemos diseñar muy bien una implementación basada en subprocesos, que permitirá al usuario realizar otras acciones mientras la aplicación recupera datos de una base de datos, y mejora la usabilidad a gran escala.</span></span><br />
<span class="notranslate" style="background-color: white; box-sizing: border-box; color: #444444; font-family: "pt sans" , sans-serif; font-size: 16px;"><br /></span>
<span class="notranslate" style="background-color: white; box-sizing: border-box; color: #444444; font-family: "pt sans" , sans-serif; font-size: 16px;"><br /></span>
<span class="notranslate" style="background-color: white; box-sizing: border-box; color: #444444; font-family: "pt sans" , sans-serif; font-size: 16px;"></span><br />
<h2 style="background-color: white; box-sizing: border-box; color: #333333; font-family: "PT Sans", sans-serif; font-size: 30px; line-height: 1.2; margin: 0px 0px 16px;">
<span class="notranslate" style="box-sizing: border-box;">Un simple hilo, clásico Ejemplo:</span></h2>
<span class="notranslate" style="background-color: white; box-sizing: border-box; color: #444444; font-family: "pt sans" , sans-serif; font-size: 16px;"><span class="notranslate" style="box-sizing: border-box;">Comencemos con un ejemplo simple de un solo hilo. Los siguientes ejemplos de código mostrarán una estrategia simple de ejecución de hilos.</span> <span class="notranslate" style="box-sizing: border-box;">El subproceso se ejecutará 50 veces con un intervalo de 500 milisegundos entre cada ejecución.</span></span><br />
<span class="notranslate" style="background-color: white; box-sizing: border-box; color: #444444; font-family: "pt sans" , sans-serif; font-size: 16px;"><span class="notranslate" style="box-sizing: border-box;"><br /></span></span>
<span class="notranslate" style="background-color: white; box-sizing: border-box; color: #444444; font-family: "pt sans" , sans-serif; font-size: 16px;"><span class="notranslate" style="box-sizing: border-box;"><br /></span></span>
<br />
<pre class="brush: csharp">using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
namespace TestConsoleApp
{
class Program
{
static void Main(string[] args)
{
ThreadStart testThreadStart = new ThreadStart(new Program().testThread);
Thread testThread = new Thread(testThreadStart);
testThread.Start();
Console.ReadLine();
}
public void testThread()
{
//executing in thread
int count = 0;
while (count++ < 50)
{
Console.WriteLine("Thread Executed "+count+" times");
Thread.Sleep(500);
}
}
}
}
</pre>
<br />
<br />
<div style="background-color: white; box-sizing: border-box; color: #444444; font-family: "PT Sans", sans-serif; font-size: 16px; margin-bottom: 26px; padding: 0px;">
<span class="notranslate" style="box-sizing: border-box;">Como puede ver, primero tenemos que definir una instancia 'ThreadStart' con la función que necesitaremos ejecutar en el hilo.</span> <span class="notranslate" style="box-sizing: border-box;">Entonces, esta instancia se requiere como parámetro en nuestra inicialización de la clase 'Thread'.</span> <span class="notranslate" style="box-sizing: border-box;">Después de llamar al método 'start', la función se ejecutará en paralelo a otros procesos.</span></div>
<div style="background-color: white; box-sizing: border-box; color: #444444; font-family: "PT Sans", sans-serif; font-size: 16px; margin-bottom: 26px; padding: 0px;">
<span class="notranslate" style="box-sizing: border-box;">Además, recuerde que la función se llamará solo una vez.</span> <span class="notranslate" style="box-sizing: border-box;">mantenerlo vivo es nuestra propia responsabilidad.</span> <span class="notranslate" style="box-sizing: border-box;">Eso significa que tendremos que ejecutarlo dentro de un ciclo for hasta que satisfaga ciertos criterios.</span> <span class="notranslate" style="box-sizing: border-box;">El método 'Sleep' espera ese hilo en particular durante la cantidad de tiempo dada (en milisegundos) antes de ejecutar la siguiente instrucción.</span></div>
<h2 style="background-color: white; box-sizing: border-box; color: #333333; font-family: "PT Sans", sans-serif; font-size: 30px; line-height: 1.2; margin: 0px 0px 16px;">
<span class="notranslate" style="box-sizing: border-box;">Programación multiproceso con hilos clásicos:</span></h2>
<div style="background-color: white; box-sizing: border-box; color: #444444; font-family: "PT Sans", sans-serif; font-size: 16px; margin-bottom: 26px; padding: 0px;">
<span class="notranslate" style="box-sizing: border-box;">Vamos a avanzar un paso para ver cómo se pueden ejecutar más de un hilo en paralelo.</span> <span class="notranslate" style="box-sizing: border-box;">El siguiente fragmento de código demostrará dicho escenario.</span> <span class="notranslate" style="box-sizing: border-box;">Sin embargo, estoy usando dos hilos solo aquí, puede agregar tantos como desee según su necesidad.</span></div>
<pre class="brush: csharp">using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
namespace TestConsoleApp
{
class Program
{
static void Main(string[] args)
{
ThreadStart testThread1Start = new ThreadStart(new Program().testThread1);
ThreadStart testThread2Start = new ThreadStart(new Program().testThread2);
Thread[] testThread = new Thread[2];
testThread[0] = new Thread(testThread1Start);
testThread[1] = new Thread(testThread2Start);
foreach (Thread myThread in testThread)
{
myThread.Start();
}
Console.ReadLine();
}
public void testThread1()
{
//executing in thread
int count = 0;
while (count++ < 10)
{
Console.WriteLine("Thread 1 Executed "+count+" times");
Thread.Sleep(1);
}
}
public void testThread2()
{
//executing in thread
int count = 0;
while (count++ < 10)
{
Console.WriteLine("Thread 2 Executed " + count + " times");
Thread.Sleep(1);
}
}
}
}
</pre>
<br />
<br />
<span class="notranslate" style="background-color: white; box-sizing: border-box; color: #444444; font-family: "pt sans" , sans-serif; font-size: 16px;">Después de ejecutar la aplicación, debería ver un resultado como el siguiente:</span><span style="background-color: white; color: #444444; font-family: "pt sans" , sans-serif; font-size: 16px;"> </span><br />
<span style="background-color: white; color: #444444; font-family: "pt sans" , sans-serif; font-size: 16px;"><br /></span>
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgteH4IR-OPUKf4nAIJu3I-Pcf7rka4W8H-_nBU5fAr65TUeI5_dJIXZP9rmbDjutbmaenUhrrMFsFpduzzE8hsVDu_Zoi4f7QF4vJuTxi3XGFXEsb2xcxOalby61usrwjfLLuQ43cpC6s/s1600/multiple-classic-thread-example%255B1%255D.png" imageanchor="1" style="clear: left; display: inline !important; margin-bottom: 1em; margin-right: 1em; text-align: center;"><img border="0" data-original-height="256" data-original-width="647" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgteH4IR-OPUKf4nAIJu3I-Pcf7rka4W8H-_nBU5fAr65TUeI5_dJIXZP9rmbDjutbmaenUhrrMFsFpduzzE8hsVDu_Zoi4f7QF4vJuTxi3XGFXEsb2xcxOalby61usrwjfLLuQ43cpC6s/s1600/multiple-classic-thread-example%255B1%255D.png" /></a><br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgteH4IR-OPUKf4nAIJu3I-Pcf7rka4W8H-_nBU5fAr65TUeI5_dJIXZP9rmbDjutbmaenUhrrMFsFpduzzE8hsVDu_Zoi4f7QF4vJuTxi3XGFXEsb2xcxOalby61usrwjfLLuQ43cpC6s/s1600/multiple-classic-thread-example%255B1%255D.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><br /></a><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgteH4IR-OPUKf4nAIJu3I-Pcf7rka4W8H-_nBU5fAr65TUeI5_dJIXZP9rmbDjutbmaenUhrrMFsFpduzzE8hsVDu_Zoi4f7QF4vJuTxi3XGFXEsb2xcxOalby61usrwjfLLuQ43cpC6s/s1600/multiple-classic-thread-example%255B1%255D.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><br /></a><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgteH4IR-OPUKf4nAIJu3I-Pcf7rka4W8H-_nBU5fAr65TUeI5_dJIXZP9rmbDjutbmaenUhrrMFsFpduzzE8hsVDu_Zoi4f7QF4vJuTxi3XGFXEsb2xcxOalby61usrwjfLLuQ43cpC6s/s1600/multiple-classic-thread-example%255B1%255D.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><br /></a></div>
<br />
<span style="background-color: white; color: #444444; font-family: "pt sans" , sans-serif; font-size: 16px;">Tenga en cuenta que, la salida no será siempre exacta, depende completamente de cómo el sistema operativo proporciona las programaciones a la CPU para la ejecución de la secuencia.</span><br />
<span style="background-color: white; color: #444444; font-family: "pt sans" , sans-serif; font-size: 16px;"><br /></span>
<span style="background-color: white; color: #444444; font-family: "pt sans" , sans-serif; font-size: 16px;"><br /></span>
<br />
<h2 style="background-color: white; box-sizing: border-box; color: #333333; font-family: "PT Sans", sans-serif; font-size: 30px; line-height: 1.2; margin: 0px 0px 16px;">
<span class="notranslate" style="box-sizing: border-box;">Trabajando con ThreadPool:</span></h2>
<div style="background-color: white; box-sizing: border-box; color: #444444; font-family: "PT Sans", sans-serif; font-size: 16px; margin-bottom: 26px; padding: 0px;">
<span class="notranslate" style="box-sizing: border-box;">Entonces, como hemos visto hasta ahora en los ejemplos de código anteriores, usa 'Thread' en modo raw.</span> <span class="notranslate" style="box-sizing: border-box;">Sin embargo, podemos simplificar el proceso de ejecución de subprocesos con el uso de la clase 'ThreadPool' que proporciona .NET framework y es muy útil para la implementación rápida de la programación multiproceso.</span> <span class="notranslate" style="box-sizing: border-box;">Todo lo que tenemos que hacer es poner en cola la función que queremos ejecutar en el hilo.</span> <span class="notranslate" style="box-sizing: border-box;">Y automáticamente comenzará a ejecutarlos.</span> <span class="notranslate" style="box-sizing: border-box;">El siguiente código demostrará este uso simplificado de 'ThreadPool'.</span></div>
<br />
<br />
<pre class="brush: csharp">using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
namespace TestConsoleApp
{
class Program
{
static void Main(string[] args)
{
ThreadPool.QueueUserWorkItem(new Program().testThread1);
ThreadPool.QueueUserWorkItem(new Program().testThread2);
Console.ReadLine();
}
public void testThread1(Object threadContext)
{
//executing in thread
int count = 0;
while (count++ < 10)
{
Console.WriteLine("Thread 1 Executed "+count+" times");
Thread.Sleep(100);
}
}
public void testThread2(Object threadContext)
{
//executing in thread
int count = 0;
while (count++ < 10)
{
Console.WriteLine("Thread 2 Executed " + count + " times");
Thread.Sleep(100);
}
}
}
}
</pre>
<br />
<br />
Espero que lo disfruten, compartan y comenten. ;)<br />
<br />
<div style="color: #741b47;">
<b>"Si se puede imaginar... se puede programar."</b></div>
<div class="blogger-post-footer">“Primero resuelve el problema. Entonces, escribe el código.”
— John Johnson</div>Jairo Ortizhttp://www.blogger.com/profile/15511019924919091246noreply@blogger.com0tag:blogger.com,1999:blog-8899331477397536059.post-15771505487788878642018-04-09T08:29:00.000-05:002018-04-09T08:29:17.467-05:00Como crear e implementar una interfaz en C#<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhlylobNUlarxB1mgGRzdk4L7GPQ_fNnS99042v-z632KKD_apkOhs8H8jzBYOnfowjGqoaYVGi57MouMgNIe-C0FsbNoRN3kkBy1mEClO-lP-Rx6GhtOkpBUS79UAwr3n9uz1xoRoTMZc/s1600/27_c-sharp-logo-filled.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" data-original-height="1600" data-original-width="1600" height="200" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhlylobNUlarxB1mgGRzdk4L7GPQ_fNnS99042v-z632KKD_apkOhs8H8jzBYOnfowjGqoaYVGi57MouMgNIe-C0FsbNoRN3kkBy1mEClO-lP-Rx6GhtOkpBUS79UAwr3n9uz1xoRoTMZc/s200/27_c-sharp-logo-filled.png" width="200" /></a></div>
<br />
<br />
El día de hoy les compartiré un concepto muy interesante y se trata nada mas y nada menos que de las interfaces en C#, por lo cual comenzaremos con su concepto y pasaremos a un sencillo ejemplo:
<br />
<br />
Hablando en llano, una interfaz no es más que una estructura de datos que muestra únicamente las firmas de los métodos de una clase. A partir de ahí, una clase que herede de la interfaz estará obligada a “rellenar” la implementación de dichos métodos. De forma simple, una interfaz sería algo así:
<br />
<br />
<br />
<br />
<pre class="brush: csharp"> interface IPruebaInterfaz
{
void MetodoHola();
}
</pre>
<br />
<br />
Esta interfaz únicamente dice QUÉ acciones se van a realizar, pero no CÓMO se realizarán. Para saber cómo realizarlas, crearemos clases que implementen esta interfaz, obligando a “rellenar” el contenido de los métodos que declaramos previamente.
<br />
<br />
Primero definimos la interfaz:
<br />
<pre class="brush: csharp"> interface IPruebaInterfaz
{
void MetodoHola();
}
</pre>
<br />
La clase anterior muestra una interfaz con el método “MetodoHola” el cual aun no esta implementado, el paso siguiente sera definir la clase que implemente dicho método:
<br />
<pre class="brush: csharp"> class ClaseImplementa : IPruebaInterfaz
{
void IPruebaInterfaz.MetodoHola()
{
Console.WriteLine("Hola TheCodingCookBook!!!");
}
}
</pre>
<br />
<br />
Finalmente para ocupar nuestra interfaz, definimos una instancia de la misma e invocamos al método.<br />
<pre class="brush: csharp"> static void Principal()
{
IPruebaInterfaz obj = new ClaseImplementa();
obj.MetodoHola();
}
</pre>
<br />
<br />
Y esta una forma simple de definir una interfaz
<br />
Espero que lo disfruten, compartan y comenten. ;)
<br />
<br />
<div style="color: #741b47;">
<b>"Si se puede imaginar... se puede programar."</b></div>
<div class="blogger-post-footer">“Primero resuelve el problema. Entonces, escribe el código.”
— John Johnson</div>Jairo Ortizhttp://www.blogger.com/profile/15511019924919091246noreply@blogger.com0tag:blogger.com,1999:blog-8899331477397536059.post-83606822488988630012018-04-06T00:00:00.000-05:002018-04-06T00:00:28.256-05:00Que es asterisk y con que se come?<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgV9eF75NAsLApjdhPVo_86D7ch2ZsnolnXlqJ_5nAZJm-QSsfnKQ1_jbH0TGnVduFqyWzoqRFU5Bd63liyhNR57VCrrbmBdYPVc0Qjk8-4_UOqeClxRj0q6iH6-j3lgBVkfphIMh8J7l0/s1600/1200px-Asterisk_Logo.svg.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img alt="Curso de asterisk y .NET C#" border="0" data-original-height="708" data-original-width="1200" height="188" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgV9eF75NAsLApjdhPVo_86D7ch2ZsnolnXlqJ_5nAZJm-QSsfnKQ1_jbH0TGnVduFqyWzoqRFU5Bd63liyhNR57VCrrbmBdYPVc0Qjk8-4_UOqeClxRj0q6iH6-j3lgBVkfphIMh8J7l0/s320/1200px-Asterisk_Logo.svg.png" title="Curso de asterisk y .NET C#" width="320" /></a></div>
<br />
Queridos csharpedianos, estamos aquí reunidos para ser testigos de la integración de .NET en su máximo esplendor con LINUX, en algunas épocas esto parecería imposible, pero hoy comenzaremos una travesía que terminara en un software capaz de acceder a un equipo LINUX y realizar modificaciones en nuestro sistema de comunicaciones personal. Para esto es indispensable que aprendamos primeramente que es asterisk, para que lo usaremos, en que nos ayudara y con que nos lo comemos, aquí vamos:<br />
<br />
<br />
Asterisk, es una plataforma de tecnología de código abierto y gratuito que puede convertir tu casi obsoleto pc en un sistema de comunicaciones VoIP que te permitirá desde intercomunicar por extensiones los cuartos de tu casa, hasta crear complejos sistemas de marcadores automáticos con Text To Speech e IVR Transaccionales.<br />
<br />
Asterisk es básicamente un programa que trabaja bajo linux CENTOS el cual proporciona funcionalidades de central telefónica (PBX), se puede conectar a teléfonos para hacer llamadas entre si y hacer llamadas externas, recibir llamadas, conectar softphones, contestar llamadas, crear IVR, y todo lo que se te pueda ocurrir con una centralita telefonica.<br />
<br />
No les hablare acerca de la historia de asterisk ya que para ser sinceros en este curso eso no nos importa en lo absoluto, seremos prácticos para hacer el curso lo mas entendible posible y que podamos sentar las bases para crear nuestro propio sistema de comunicación.<br />
<br />
Antes de comenzar necesitaremos descargar la imagen de Linux, para asterisk debemos usar CentOS, la versión con la que trabajaremos aquí sera la 7. La imagen de <a href="https://www.centos.org/download/" rel="nofollow" target="_blank">linux CentOS 7</a> la puede descargar desde la <a href="https://www.centos.org/download/" target="_blank">web oficial.</a><br />
<br />
La instalacion de CentOS escapa de los fines de este curso. Pero hare un tutorial de como instalarlo.<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
Espero que lo disfruten, compartan y comenten. ;)
<br />
<br />
<div style="color: #741b47;">
<b>"Si se puede imaginar... se puede programar."</b></div>
<div class="blogger-post-footer">“Primero resuelve el problema. Entonces, escribe el código.”
— John Johnson</div>Jairo Ortizhttp://www.blogger.com/profile/15511019924919091246noreply@blogger.com0tag:blogger.com,1999:blog-8899331477397536059.post-72865315929702569752018-04-03T15:18:00.000-05:002018-04-03T15:23:18.913-05:00Crear Extensiones para chrome con bootstrap y HTML<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgT043d-S-OwHHn3hMgvpDfT5orMaFTc12wmXhir60intkEnr5Wzog8GQNzdLFFJDy2lmLT3YeveLzxsOEDxpo2OEknVA1m5aoJaHsy06MTvyo3HToIFLgglkgX5Kaiv7h-JC96y1VSy58/s1600/Chrome-Web-Store.jpg" imageanchor="1" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em;"><img border="0" data-original-height="288" data-original-width="575" height="160" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgT043d-S-OwHHn3hMgvpDfT5orMaFTc12wmXhir60intkEnr5Wzog8GQNzdLFFJDy2lmLT3YeveLzxsOEDxpo2OEknVA1m5aoJaHsy06MTvyo3HToIFLgglkgX5Kaiv7h-JC96y1VSy58/s320/Chrome-Web-Store.jpg" width="320" /></a></div>
Bienvenidos nuevamente, he estado un poco ausente (Esta bien, bastante ausente) del blog por temas laborales y personales pero hoy es un día glorioso para escribir un nuevo articulo y que se unan algunas neuronas para formar nuevo conocimiento, y que mejor forma de retomar el blog que con nuestro gran amigo google Chrome, y es que hoy aprenderemos a crear extensiones para chrome con HTML, BOOTSTRAP, JQUERY Y CSS.<br />
<br />
Hay varios puntos que debemos seguir para crear estas extensiones, tratare de ser breve y que podamos lograr nuestro objetivo, el ejemplo que plateo es crear una barra de búsqueda, que al escribir algo, abra una pestaña nueva con la búsqueda en nuestro glorioso blog de <b>C# AL EXTREMO</b>. Es algo muy simple a nuestro parecer pero sentara las bases para que puedas hacer lo que quieras con estas extensiones.<br />
<br />
Cabe mencionar que puedes usar el editor de código que quieras, desde notepad hasta visual estudio si te apetece. Ahora sin mas chachara y sin mas cuento, comencemos:<br />
<br />
<ol>
<li> Comenzaremos creando una carpeta en la que guardaremos los archivos de nuestra extensión y el primer archivo que guardaremos sera uno llamado manifest.json, el cual crearemos y le agregaremos el siguiente código:
<br /><br />
<pre class="brush: csharp">{
"manifest_version": 2,
"name": "Búsqueda en C# AL EXTREMO",
"short_name": "Busquedacsharpalextremo",
"description": "Most",
"version": "0.0.1",
"minimum_chrome_version": "38",
"permissions": ["topSites"],
"browser_action": {
"default_icon": "icon.png",
"default_popup": "popup.html"
},
"content_scripts": [
{
"matches": ["<all_urls>"],
"css": ["assets/bootstrap.min.css"],
"js": ["assets/jquery.js", "main.js"],
"run_at": "document_start"
}
]
}
</pre>
<br />
Vale recalcar que la información que se ingresa aquí es muy sencilla, tales como el nombre, la versión de la extensión y la mínima versión del chrome. En nuestra carpeta también debemos agregar el icono que usara nuestra extensión, este debe ser de 19px X 19px y es el que llamaremos icon.png. El resto de información agréguenla tal cual esta en el ejemplo y luego iremos desenmarañando el archivo.</li>
<li>POPUP: Ahora explicaremos esta session del manifest, y es la que se encarga de que salga una ventana emergente al presionar click sobre la extension:<br /><br /><pre class="brush: csharp">"browser_action": {
"default_icon": "icon.png",
"default_popup": "popup.html"
},</pre>
<br /><br />
Crearemos un archivo llamado popup.html y pegaremos el siguiente fragmento de código: <br /><br />
<pre class="brush: html"> <!doctype html>
<html>
<head>
<title>Buscar en c sharp al extremo</title>
<link rel="stylesheet" href="assets/bootstrap.min.css">
<link href='https://fonts.googleapis.com/css?family=Lato' rel='stylesheet' type='text/css'>
<script src="assets/jquery.js"></script>
<script src="main.js"></script>
<style>
body {
overflow: hidden;
margin: 0px;
padding: 0px;
width: 400px;
height: 35px;
}
.body {
padding: 15px;
}
.footer {
background-color: #f0f0f0;
color: #636363;
font-size: 13px;
margin-top: 9px;
padding: 10px;
text-align: center;
}
.footer img {
margin-right: 20px;
width: 90px;
text-align: left;
}
</style>
</head>
<body>
<div class="row body">
<div class="col-lg-12">
<div class="input-group">
<input type="text" id="txtbuscar" class="form-control" placeholder="Buscar">
<span class="input-group-btn">
<button id="btnbuscar" class="btn btn-primary" type="button">Buscar</button>
</span>
</div>
</div>
</div>
<div class="row">
<div class="col-lg-12 footer">
<img src="logo.png" />
<small><a href="http://csharpalextremo.blogspot.com.co" target"_blank">http://csharpalextremo.blogspot.com.co</a></small>
</div>
</div>
</body>
</html>
</pre>
</li>
<li>Crearemos una carpeta llamada assets en la que estaran nuestros archivos js y css, dentro de esta carpeta guardaremos el archivo css de bootstrap y el js de jquery, los cuales encontraran dentro de los archivos de ejemplo de este proyecto.<br /><br />En la carpeta raiz, crearemos un archivo llamda main.js y pegaremos el siguiente fragmento de codigo<br /><br />
<pre class="brush: js">$(document).ready(function(){
$("#txtbuscar").focus();
$('#txtbuscar').keyup(function(e){
if(e.keyCode == 13)
{
$("#btnbuscar").click();
}
});
$("#btnbuscar").click(function(){
var search = $("#txtbuscar").val();
chrome.tabs.create({ url: "http://csharpalextremo.blogspot.com.co/search?q="+search });
});
});
</pre>
<br /><br />
Instalemos la extensión en tu computador para verificar que todo va bien. Escribe en la barra de navegación chrome://extensions y si está inactivo, activa el modo programador del lado derecho de la página. Aparecerán inmediatamente abajo tres botones, haz clic en el primero Cargar extensión sin empaquetar y navega hasta seleccionar la carpeta donde tienes la extensión que estás desarrollando. Si lo has hecho bien, aparecerá en la parte superior de tu navegador el icono de tu extensión, el cual en estos momentos no hace función alguna.</li>
<li>
Publicar en la tienda de chrome store:<br />Ahora que tenemos las bases de la aplicacion, seguramente quieres montarlo en la chrome store para que todos puedan descargarla, pues hagamoslo:<br /><br />Primero, escoge todos los archivos y comprímelos en un zip. Después, ingresa al Dashboard de <a href="https://chrome.google.com/webstore/developer/dashboard">Google Chrome</a> y sigue los pasos para publicarla, si no te has registrado antes, te pedirá en este momento que lo hagas. Te pedirá información y unos screenshots de tu extensión para una mejor visualización a los usuario, es recomendable llenar toda la información y adjuntar todos los screenshot posibles, esto ayudara a raquear tu app y a que mas usuarios la descarguen. </li>
</ol>
<br />
Ahora que has hecho esta sencilla aplicación para google chrome, puedes comenzar a explorar agregándole mas código al jquery o al html, puedes agregar los estilos que quieras y disfrutar las maravillas que te ofrece internet.<br />
Recomiendo que recibes la documentación oficial de chrome store y que no le pongas limites a tu imaginación ;).<br />
<br />
A continuación les dejo el videotutorial, suscribanse al canal para recibir mas contenido como este:<br />
<br />
<br />
<br />
Si quieres consultar el codigo, puedes descargar todo el html, css, js y todo el fuente usado en este proyecto desde aqui:<br />
<br />
Espero que lo disfruten, compartan y comenten. ;)
<br />
<br />
<div style="color: #741b47;">
<b>"Si se puede imaginar... se puede programar."</b></div>
<div class="blogger-post-footer">“Primero resuelve el problema. Entonces, escribe el código.”
— John Johnson</div>Jairo Ortizhttp://www.blogger.com/profile/15511019924919091246noreply@blogger.com0tag:blogger.com,1999:blog-8899331477397536059.post-52139474132983142052017-10-13T10:50:00.001-05:002018-04-04T08:35:42.678-05:00Guardar y obtener Texto dentro de imagen como propiedad<br />
<div style="text-align: left;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgpMrxlS1nQYxrSU3do3izx_dvVI9TGf8xx4U5EAP3RHx7a2i_hnkcv0XD_I_CAVoVnv9s4ye6gLgpXEfVqGX0q72POha2Zwh-Cfg0uercPHGdzDu4N2DYQ-jGz8-hrl084ox3aL8Niijg/s1600/maxresdefault.jpg" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img alt="Criptografia con C# - Guardar y obtener Texto dentro de imagen como propiedad" border="0" data-original-height="900" data-original-width="1600" height="180" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgpMrxlS1nQYxrSU3do3izx_dvVI9TGf8xx4U5EAP3RHx7a2i_hnkcv0XD_I_CAVoVnv9s4ye6gLgpXEfVqGX0q72POha2Zwh-Cfg0uercPHGdzDu4N2DYQ-jGz8-hrl084ox3aL8Niijg/s320/maxresdefault.jpg" title="Criptografia con C# - Guardar y obtener Texto dentro de imagen como propiedad" width="320" /></a></div>
<br />
Hoy les traigo dos funciones interesantes, que les servira mucho a aquellos que trabajan mucho con procesamiento de imagenes (jpg;jpeg;png;bmp;etc), sobre todo cuando necesitamos guardar descripciones o comentarios para cada imagen que queremos procesar.<br />
<br />
Imaginense que tenemos una pagina web que ofrece productos y tenemos imagenes para cada uno de los productos, realizar rutinas que guarden la descripcion para cada imagen de cada producto nos puede acarrear mucho trabajo, sobre todo al momento de crear la logica para que se guarde en la base de datos y luego para leer cada registro y relacionarlo con cada una de las imagenes.<br />
<br />
Pues bien, les traigo una solución fácil y practica con la que nos evitaremos horas de desarrollo y consiste en guardar la descripción de cada imagen dentro de la misma imagen como un metatag o mas bien una propiedad.<br />
<br />
El enlace para descargar el código de ejemplo, se encuentra al final del post.<br />
<br />
Con este primer método puedes agregarle la descripción a una imagen creando una propiedad con la información deseada:<br />
<pre class="brush: csharp">
/// <summary>
/// Método usado para entrar a las propiedades de una imagen
/// y crear una nueva propiedad con información personalizada
/// </summary> /// <param name="Pic" />
/// <param name="NewDescription" />
private void SetDescription(Image Pic, string NewDescription)
{
byte[] bDescription = new Byte[NewDescription.Length];
// Se copia la descripcion dentro de un byte array
for (int i = 0; i < NewDescription.Length; i++) bDescription[i] = (byte)NewDescription[i];
//Descomentar para cargar la imgen como stream
//System.Drawing.Image Pic = Image.FromStream(Filename);
//Descomentar la siguiente linea si se desea trabajar con rutas de archivos
// System.Drawing.Image Pic = Image.FromFile(Filename);
//Si la imagen ya tiene la propiedad con el id especificado, se elimina esta propiedad de la imagen
//para crearla nuevamente
if (Pic.PropertyItems.Any(p => p.Id == NuevaPropiedad)) Pic.RemovePropertyItem(NuevaPropiedad);
//Se genera la nueva propiedad
PropertyItem PropertyItems = (PropertyItem)FormatterServices.GetUninitializedObject(typeof(PropertyItem));
//0815 es el código de la nueva propiedad, puedes usar cualquiera
//siempre y cuando la imagen no tenga otra propiedad con ese código
PropertyItems.Id = 0815;
PropertyItems.Type = 2;
PropertyItems.Len = bDescription.Length;
PropertyItems.Value = bDescription;
Pic.SetPropertyItem(PropertyItems);
NombreImagen = Guid.NewGuid().ToString() + Ext;
Pic.Save(NombreImagen, ImageFormat.Jpeg);
//pbload es el nombre de un picture box que tengo en la aplicación,
//al que le voy a asignar la imagen para mostrarla
pbload.Image = Image.FromFile(NombreImagen);
pbload.SizeMode = PictureBoxSizeMode.StretchImage;
//Limpio los recursos usados
Pic.Dispose();
Pic = null;
}
</pre>
<br />
Este otro método, obtiene el texto guardado en la imagen:<br />
<pre class="brush: csharp">
/// <summary>
/// Metodo usado para leer cualquier propiedad de una imagen
/// </summary>
/// <param name="img" />
/// <returns></returns>
static public string GetDescription(Image img)
{
string text = string.Empty;
System.Text.ASCIIEncoding encoding = new System.Text.ASCIIEncoding();
try
{
//Descomentar esta linea si se desea cargar la imagen por medio de path
//System.Drawing.Image img = new System.Drawing.Bitmap(ImgPath);
//Se lee la propiedad donde se almaceno la informacion. 0815 es el identificador que le asignamos a la propiedad
PropertyItem item = img.GetPropertyItem(0815);
//Se lee el valor y se almacena en una variable para ser devuelto.
text = encoding.GetString(item.Value);
//Se liberan los recursos usados.
img.Dispose();
GC.SuppressFinalize(img);
return text;
}
catch { return ""; }
}
</pre>
<br />
Muy pronto agregare el ejemplo de un proyecto detallado junto con un vídeo de explicación: Esperenlo...<br />
<br />
Por ahora, les dejo el código de un ejemplo: <a href="https://drive.google.com/file/d/0B0Mi5kSyMwVna1Z6Y1pDbkFRQ0E/view" target="_blank">Descargarlo aqui</a><br />
<br />
Espero que lo disfruten, compartan y comenten. ;)
<br />
<br />
<div style="color: #741b47;">
<b>"Si se puede imaginar... se puede programar."</b></div>
<div class="blogger-post-footer">“Primero resuelve el problema. Entonces, escribe el código.”
— John Johnson</div>Jairo Ortizhttp://www.blogger.com/profile/15511019924919091246noreply@blogger.com0tag:blogger.com,1999:blog-8899331477397536059.post-45660935386640299382017-10-12T09:01:00.002-05:002018-04-04T08:18:22.986-05:00Curso asterisk con .NET<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgUVYk36V_ghzYWSUV8_JXfOndk11Rwfwlsx_eS-5qI-g0XdYGTAilFzZYg4pfHwlAymZCY7z6uzW2yL3tu6BBeEcx-u-uicxX1RbLb2H7OwKabJl9AMNIU7hAm_nemlGbu3ZS-Ous12nU/s1600/1200px-Asterisk_Logo.svg.png" imageanchor="1" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em;"><img border="0" data-original-height="708" data-original-width="1200" height="188" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgUVYk36V_ghzYWSUV8_JXfOndk11Rwfwlsx_eS-5qI-g0XdYGTAilFzZYg4pfHwlAymZCY7z6uzW2yL3tu6BBeEcx-u-uicxX1RbLb2H7OwKabJl9AMNIU7hAm_nemlGbu3ZS-Ous12nU/s320/1200px-Asterisk_Logo.svg.png" width="320" /></a></div>
En estos tiempos donde la comunicación y las telecomunicaciones hacen parte de nuestro diario vivir, es importante que como desarrolladores nos vallamos de frente hacia estos campos.<br />
<br />
En ocasiones al ser desarrollador .NET nos enfocamos en solo estas tecnologías y dejamos de lado cualquier cosa que no haga parte del universo microsoft, pero hoy les traigo algo divertido, donde converge el universo pago de microsoft y .NET con lo libre, gratuito y mágico de Linux.<br />
<br />
Se trata de unir C# con Asterisk para crear un marcador que desde windows pueda llamar a través de CentOS y Asterisk a cualquier numero.<br />
<br />
Los temas de este pequeño pero sustancioso curso son:<br />
<ol>
<li>Que es asterisk y con que se come?</li>
<li>Montar y configurar servidor con asterisk y CentOS 1</li>
<li>Montar y configurar servidor con asterisk y CentOS 2</li>
<li>Configurar Manager de asterisk</li>
<li>Conectando asterisk con C#</li>
</ol>
<br />
En este curso, aprenderemos como montar y configurar un servidor Asterisk en CentOS 7 para luego conectarnos desde C# y desde aquí poder ejecutar comandos o hacer llamadas en Aterisk.<br />
<br />
Semanalmente se subirá una nueva publicación de este super curso! Manténganse atentos y cualquier inquietud, no duden en comentarla!<br />
<br />
<br />
Espero que lo disfruten, compartan y comenten. ;)
<br />
<br />
<div style="color: #741b47;">
<b>"Si se puede imaginar... se puede programar."</b></div>
<div class="blogger-post-footer">“Primero resuelve el problema. Entonces, escribe el código.”
— John Johnson</div>Jairo Ortizhttp://www.blogger.com/profile/15511019924919091246noreply@blogger.com0tag:blogger.com,1999:blog-8899331477397536059.post-39965158003078847512017-10-10T10:23:00.000-05:002017-10-10T10:28:27.155-05:00Hora Militar o Formato 24 Horas en SQL SERVER<br />
Es curioso los problemas que nos encontramos a diario al desarrollar, siempre resulta que hay algo nuevo y algo que no sabemos, aprendemos día a día con cada cosa que hacemos, y cada código que escribimos.
<br />
El día de hoy les traigo una instrucción que si bien es muy sencilla, puede ahorrarnos varias horas de búsqueda infructuosa en san google. Se trata de convertir una hora en sql server al formato militar o formato de 24 horas.<br />
Para esto tenemos varias formas:<br />
<br />
<br />
<pre class="brush: sql">SELECT CONVERT(VARCHAR(8), dateadd(HOUR,12, cast('2017-01-01 10:15:00' as datetime)), 108) </pre>
<pre class="brush: sql">AS HoraMilitar
</pre>
<br />
Veamos lo que se hace en la instrucción anterior:<br />
<br />
Tenemos la fecha y hora: 2017-01-01 10:15:00 la cual convertimos a datetime cast('2017-01-01 10:15:00' as datetime) luego le sumamos 12 horas para ejemplificar el ejercicio "dateadd(HOUR,12," y por ultimo pasamos a varchar para darle formato militar<br />
<br />
CONVERT(VARCHAR(8), "Aquí la fecha",108)<br />
<br />
Notese que uso el código 108 de conversión, este le indica al motor de base de datos que queremos la hora militar.<br />
<br />
Otra forma mas sencilla es convirtiendo a datetime la fecha y hora agregandole AM/PM segun el formato que necesitemos:<br />
<br />
<pre class="brush: sql">SELECT cast('2017-01-01 10:15:00PM' as datetime) AS HoraMilitar
</pre>
<br />
<br />
La diferencia radica en el resultado devuelto, mientras que el primer ejemplo, nos devuelve solo el formato fecha: 22:15:00 el segundo ejemplo nos devuelve el formato completo: 2017-01-01 22:15:00.000<br />
<br />
Si tienen una forma mas sencilla o simplemente quieren expresar su opinión, por favor dejen sus comentarios!<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEidiEp6NabI7rgZsH1FNkkJ8jg9Cniehr4K-XpNeh44L8R-DDF2qTuk3OKoNpbRoxd242vzQvVu2Co2l-4CIWtkxl_aal-8lsr6XepSnpXnnxR5OtwkvCLuwgE-Cpzd8TeR7uqmWAkWUaI/s1600/Image+24.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="233" data-original-width="860" height="173" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEidiEp6NabI7rgZsH1FNkkJ8jg9Cniehr4K-XpNeh44L8R-DDF2qTuk3OKoNpbRoxd242vzQvVu2Co2l-4CIWtkxl_aal-8lsr6XepSnpXnnxR5OtwkvCLuwgE-Cpzd8TeR7uqmWAkWUaI/s640/Image+24.jpg" width="640" /></a></div>
<br />
Espero que lo disfruten, compartan y comenten. ;)
<br />
<br />
<div style="color: #741b47;">
<b>"Si se puede imaginar... se puede programar."</b></div>
<div class="blogger-post-footer">“Primero resuelve el problema. Entonces, escribe el código.”
— John Johnson</div>Jairo Ortizhttp://www.blogger.com/profile/15511019924919091246noreply@blogger.com0tag:blogger.com,1999:blog-8899331477397536059.post-12557437261175104402017-10-10T09:49:00.002-05:002017-10-10T09:49:20.506-05:00Goto Inicio<br />
<br />
He estado un poco ausente del blog (Bueno en verdad mucho) pero ya es momento de ponernos al día con todas las nuevas tecnologías que han aparecido y que se están convirtiendo poco a poco en el diario vivir de los que estamos inmersos en este mundo del desarrollo y la programación, incluso aquellos que están aprendiendo y quieren llegar mas allá.<br />
Espero que dejen sus comentarios y nos indiquen que les gustaría escribir, recibimos sus códigos y posts para publicarlos!!
<br />
Espero que lo disfruten, compartan y comenten. ;)
<br />
<br />
<div style="color: #741b47;">
<b>"Si se puede imaginar... se puede programar."</b></div>
<div class="blogger-post-footer">“Primero resuelve el problema. Entonces, escribe el código.”
— John Johnson</div>Jairo Ortizhttp://www.blogger.com/profile/15511019924919091246noreply@blogger.com0tag:blogger.com,1999:blog-8899331477397536059.post-85054065376574862662015-02-12T17:26:00.000-05:002015-02-12T17:26:14.906-05:00Desencriptar cadena de texto con C#<span style="background-color: white; color: grey; font-family: Helvetica, Arial, sans-serif; font-size: 16px; line-height: 22.3999996185303px;">Podemos desencriptar cualquier cadena de texto con C# en base a una key de encriptación. El siguiente código espera un parámetro texto del que queremos desencriptar, la key secreta de encriptación, y el CyphMode).</span><br />
<br />
<strong style="background-color: white; font-family: Helvetica, Arial, sans-serif; font-size: 16px; line-height: 22.3999996185303px;">Podemos desencriptar</strong><span style="background-color: white; font-family: Helvetica, Arial, sans-serif; font-size: 16px; line-height: 22.3999996185303px;"> cualquier cadena de texto con</span><strong style="background-color: white; font-family: Helvetica, Arial, sans-serif; font-size: 16px; line-height: 22.3999996185303px;"> C#</strong><span style="background-color: white; font-family: Helvetica, Arial, sans-serif; font-size: 16px; line-height: 22.3999996185303px;"> en base a una </span><strong style="background-color: white; font-family: Helvetica, Arial, sans-serif; font-size: 16px; line-height: 22.3999996185303px;">key de encriptación</strong><span style="background-color: white; font-family: Helvetica, Arial, sans-serif; font-size: 16px; line-height: 22.3999996185303px;">. El siguiente código espera un parámetro texto del que queremos desencriptar, la key secreta de encriptación, y el CyphMode).</span><br />
<span style="background-color: white; font-family: Helvetica, Arial, sans-serif; font-size: 16px; line-height: 22.3999996185303px;"><br /></span>
<span style="background-color: white; font-family: Helvetica, Arial, sans-serif; font-size: 16px; line-height: 22.3999996185303px;">La función devolverá el valor </span><strong style="background-color: white; font-family: Helvetica, Arial, sans-serif; font-size: 16px; line-height: 22.3999996185303px;">desencriptado</strong><span style="background-color: white; font-family: Helvetica, Arial, sans-serif; font-size: 16px; line-height: 22.3999996185303px;">. Nos puede venir bien si queremos desencriptar id's de valores, por ejemplo...</span><br />
<span style="background-color: white; font-family: Helvetica, Arial, sans-serif; font-size: 16px; line-height: 22.3999996185303px;"><br /></span>
<br />
<pre class="brush: csharp">public static string Decrypt(string p_InputString, string p_SecretKey, CipherMode p_CyphMode)
{
if (String.IsNullOrEmpty(p_InputString)) {
return String.Empty;
} else {
StringBuilder ret = new StringBuilder();
byte[] InputbyteArray = new byte[Convert.ToInt32(p_InputString.Length) / 2];
TripleDESCryptoServiceProvider Des = new TripleDESCryptoServiceProvider();
MD5CryptoServiceProvider hashMD5 = new MD5CryptoServiceProvider();
try {
Des.Key = hashMD5.ComputeHash(ASCIIEncoding.ASCII.GetBytes(p_SecretKey));
Des.Mode = p_CyphMode;
for (int X = 0; X <;= InputbyteArray.Length - 1; X++) {
Int32 IJ = (Convert.ToInt32(p_InputString.Substring(X * 2, 2), 16));
ByteConverter BT = new ByteConverter();
InputbyteArray[X] = new byte();
InputbyteArray[X] = Convert.ToByte(BT.ConvertTo(IJ, typeof(byte)));
}
MemoryStream ms = new MemoryStream();
CryptoStream cs = new CryptoStream(ms, Des.CreateDecryptor(), CryptoStreamMode.Write);
//Flush the data through the crypto stream into the memory stream
cs.Write(InputbyteArray, 0, InputbyteArray.Length);
cs.FlushFinalBlock();
//Get the decrypted data back from the memory stream
byte[] B = ms.ToArray();
ms.Close();
for (int I = 0; I <;= B.GetUpperBound(0); I++) {
ret.Append(Convert.ToChar(B[I]));
}
} catch (Exception ex) {
// ME.Publish("SF.Utils.Utils", "DecryptString", ex, ManageException_Enumerators.ErrorLevel.FatalError);
return String.Empty;
}
return ret.ToString();
}
}
</pre>
<br />
Espero que lo disfruten, compartan y comenten. ;)
<br />
<br />
<div style="color: #741b47;">
<b>"Si se puede imaginar... se puede programar."</b></div>
<div class="blogger-post-footer">“Primero resuelve el problema. Entonces, escribe el código.”
— John Johnson</div>Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-8899331477397536059.post-7581906770399495112015-02-10T16:08:00.000-05:002015-02-10T16:18:29.773-05:00Declaración de métodos en C#<div style="font-family: arial; font-size: 16.1333332061768px; line-height: 1.5; padding: 0px 15px 0.7em; text-align: justify;">
<br /></div>
<div style="font-family: arial; line-height: 1.5; padding: 0px 15px 0.7em; text-align: justify;">
Cuando uno plantea una clase en lugar de especificar todo el algoritmo en un único método es dividir todas las responsabilidades de las clase en un conjunto de métodos.</div>
<div style="font-family: arial; line-height: 1.5; padding: 0px 15px 0.7em; text-align: justify;">
Un método hemos visto que tiene la siguiente sintaxis:</div>
<pre style="text-align: justify;">public void [nombre del método]()
{
[algoritmo]
}
</pre>
<div style="font-family: arial; line-height: 1.5; padding: 0px 15px 0.7em; text-align: justify;">
Veremos que hay varios tipos de métodos:</div>
<h3 style="font-family: arial; text-align: justify;">
<span style="font-size: small;">Métodos con parámetros.</span></h3>
<div style="font-family: arial; line-height: 1.5; padding: 0px 15px 0.7em; text-align: justify;">
Un método puede tener parámetros:</div>
<pre style="text-align: justify;">public void [nombre del método]([parámetros])
{
[algoritmo]
}
</pre>
<div style="font-family: arial; line-height: 1.5; padding: 0px 15px 0.7em; text-align: justify;">
Los parámetros los podemos imaginar como variables locales al método, pero su valor se inicializa con datos que llegan cuando lo llamamos.</div>
<h3 style="font-family: arial; text-align: justify;">
<span style="font-size: small;">Problema 1:</span></h3>
<div style="font-family: arial; line-height: 1.5; padding: 0px 15px 0.7em; text-align: justify;">
Confeccionar una clase que permita ingresar valores enteros por teclado y nos muestre la tabla de multiplicar de dicho valor. Finalizar el programa al ingresar el -1.</div>
<h4 style="font-family: arial; text-align: justify;">
Programa:</h4>
<pre class="recuadro" style="background-color: #ffffcc; border: 1px dotted rgb(255, 170, 0); color: #333333; font-family: courier; padding: 5px;">using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace Tabla
{
class TablaMultiplicar
{
public void CargarValor()
{
int valor;
string linea;
do
{
Console.Write("Ingrese un valor (-1 para finalizar):");
linea = Console.ReadLine();
valor = int.Parse(linea);
if (valor != -1)
{
Calcular(valor);
}
} while (valor != -1);
}
public void Calcular(int v)
{
for(int f=v;f<=v*10;f=f+v)
{
Console.Write(f+"-");
}
Console.WriteLine();
}
static void Main(string[] args)
{
TablaMultiplicar tm = new TablaMultiplicar();
tm.CargarValor();
}
}
}
</pre>
<div style="color: #333333; font-family: arial; line-height: 1.5; padding: 0px 15px 0.7em; text-align: justify;">
<br /></div>
<div style="font-family: arial; line-height: 1.5; padding: 0px 15px 0.7em; text-align: justify;">
En esta clase no hemos definido ningún atributo.</div>
<div style="font-family: arial; line-height: 1.5; padding: 0px 15px 0.7em; text-align: justify;">
El método Calcular recibe un parámetro de tipo entero, luego lo utilizamos dentro del método para mostrar la tabla de multiplicar de dicho valor, para esto inicializamos la variable f con el valor que llega en el parámetro. Luego de cada ejecución del for incrementamos el contador f con el valor de v.</div>
<pre style="text-align: justify;"> public void Calcular(int v)
{
for(int f=v;f<=v*10;f=f+v)
{
Console.Write(f+"-");
}
Console.WriteLine();
}
</pre>
<div style="font-family: arial; line-height: 1.5; padding: 0px 15px 0.7em; text-align: justify;">
Un método puede no tener parámetros como hemos visto en problemas anteriores o puede tener uno o más parámetros (en caso de tener más de un parámetro los mismos se separan por coma)</div>
<div style="font-family: arial; line-height: 1.5; padding: 0px 15px 0.7em; text-align: justify;">
El método CargarValores no tiene parámetros y tiene por objetivo cargar un valor entero por teclado y llamar al método Calcular para que muestre la tabla de multiplicar del valor que le pasamos por teclado:</div>
<pre style="text-align: justify;"> public void CargarValor()
{
int valor;
string linea;
do
{
Console.Write("Ingrese un valor (-1 para finalizar):");
linea = Console.ReadLine();
valor = int.Parse(linea);
if (valor != -1)
{
Calcular(valor);
}
} while (valor != -1);
}
</pre>
<div style="font-family: arial; line-height: 1.5; padding: 0px 15px 0.7em; text-align: justify;">
Como vemos al método Calcular lo llamamos por su nombre y entre paréntesis le pasamos el dato a enviar (debe ser un valor o variable entera)</div>
<div style="font-family: arial; line-height: 1.5; padding: 0px 15px 0.7em; text-align: justify;">
En este problema en la Main solo llamamos al método CargarValor, ya que el método Calcular luego es llamado por el método CargarValor:</div>
<pre style="text-align: justify;"> static void Main(string[] args)
{
TablaMultiplicar tm = new TablaMultiplicar();
tm.CargarValor();
}
</pre>
<h3 style="font-family: arial; text-align: justify;">
<span style="font-size: small;">Métodos que retornan un dato.</span></h3>
<div style="font-family: arial; line-height: 1.5; padding: 0px 15px 0.7em; text-align: justify;">
Un método puede retornar un dato:</div>
<pre style="text-align: justify;">public [tipo de dato] [nombre del método]([parámetros])
{
[algoritmo]
return [tipo de dato]
}
</pre>
<div style="font-family: arial; line-height: 1.5; padding: 0px 15px 0.7em; text-align: justify;">
Cuando un método retorna un dato en vez de indicar la palabra clave void previo al nombre del método indicamos el tipo de dato que retorna. Luego dentro del algoritmo en el momento que queremos que finalice el mismo y retorne el dato empleamos la palabra clave return con el valor respectivo.</div>
<h3 style="font-family: arial; text-align: justify;">
<span style="font-size: small;">Problema 2:</span></h3>
<div style="font-family: arial; line-height: 1.5; padding: 0px 15px 0.7em; text-align: justify;">
Confeccionar una clase que permita ingresar tres valores por teclado. Luego mostrar el mayor y el menor.</div>
<h4 style="font-family: arial; text-align: justify;">
Programa:</h4>
<pre class="recuadro" style="background-color: #ffffcc; border: 1px dotted rgb(255, 170, 0); font-family: courier; padding: 5px;">using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace EspacioMayorMenor
{
class MayorMenor
{
public void cargarValores()
{
string linea;
Console.Write("Ingrese primer valor:");
linea = Console.ReadLine();
int valor1 = int.Parse(linea);
Console.Write("Ingrese segundo valor:");
linea = Console.ReadLine();
int valor2 = int.Parse(linea);
Console.Write("Ingrese tercer valor:");
linea = Console.ReadLine();
int valor3 = int.Parse(linea);
int mayor, menor;
mayor = CalcularMayor(valor1, valor2, valor3);
menor = CalcularMenor(valor1, valor2, valor3);
Console.WriteLine("El valor mayor de los tres es:" + mayor);
Console.WriteLine("El valor menor de los tres es:" + menor);
}
public int CalcularMayor(int v1, int v2, int v3)
{
int m;
if (v1 > v2 && v1 > v3)
{
m = v1;
}
else
{
if (v2 > v3)
{
m = v2;
}
else
{
m = v3;
}
}
return m;
}
public int CalcularMenor(int v1, int v2, int v3)
{
int m;
if (v1 < v2 && v1 < v3)
{
m = v1;
}
else
{
if (v2 < v3)
{
m = v2;
}
else
{
m = v3;
}
}
return m;
}
static void Main(string[] args)
{
MayorMenor mm = new MayorMenor();
mm.cargarValores();
Console.ReadKey();
}
}
}
</pre>
<div style="font-family: arial; line-height: 1.5; padding: 0px 15px 0.7em; text-align: justify;">
Si vemos la sintaxis que calcula el mayor de tres valores enteros es similar al algoritmo visto en conceptos anteriores:</div>
<pre style="text-align: justify;"></pre>
<div style="font-family: arial; line-height: 1.5; padding: 0px 15px 0.7em; text-align: justify;">
Lo primero que podemos observar que el método retorna un entero y recibe tres parámetros:</div>
<pre style="text-align: justify;"> public int CalcularMayor(int v1, int v2, int v3)
</pre>
<pre style="text-align: justify;"></pre>
<div style="font-family: arial; line-height: 1.5; padding: 0px 15px 0.7em; text-align: justify;">
Dentro del método verificamos cual de los tres parámetros almacena un valor mayor, a este valor lo almacenamos en una variable local llamada "m", al valor almacenado en esta variable lo retornamos al final con un return.</div>
<div style="font-family: arial; line-height: 1.5; padding: 0px 15px 0.7em; text-align: justify;">
La llamada al método calcularMayor lo hacemos desde dentro del método CargarCalores:</div>
<pre style="text-align: justify;"> mayor=CalcularMayor(valor1,valor2,valor3);
</pre>
<pre style="text-align: justify;"></pre>
<div style="font-family: arial; line-height: 1.5; padding: 0px 15px 0.7em; text-align: justify;">
Debemos asignar a una variable el valor devuelto por el método CalcularMayor. Luego el contenido de la variable mayor lo mostramos:</div>
<pre style="text-align: justify;"> Console.WriteLine("El valor mayor de los tres es:"+mayor);
Console.WriteLine("El valor menor de los tres es:"+menor);
</pre>
<pre style="text-align: justify;"></pre>
<div style="font-family: arial; line-height: 1.5; padding: 0px 15px 0.7em; text-align: justify;">
La lógica es similar para el cálculo del menor.</div>
<div class="blogger-post-footer">“Primero resuelve el problema. Entonces, escribe el código.”
— John Johnson</div>Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-8899331477397536059.post-52152830231264904142013-04-11T11:11:00.000-05:002014-07-10T09:11:40.287-05:00Hacer una peticion Ajax con Jquery<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="http://1.bp.blogspot.com/-EjkncltwzGE/UWbg9q0iqsI/AAAAAAAAEps/4_IU8YEy58o/s1600/23-01_jquery_ajax_ld_img%5B1%5D.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="http://1.bp.blogspot.com/-EjkncltwzGE/UWbg9q0iqsI/AAAAAAAAEps/4_IU8YEy58o/s1600/23-01_jquery_ajax_ld_img%5B1%5D.jpg" /></a></div>
<br />
Una vez mas les traemos un post acerca de las bondades de <a href="http://csharpalextremo.blogspot.com/2012/05/ajax-el-complemento-perfecto-parte-1.html" target="_blank">AJAX </a>el cual hemos hablado en posts anteriores...<br />
Hemos hablado de como hacer <a href="http://csharpalextremo.blogspot.com/2012/06/ajax-el-complemento-perfecto-parte-3.html" target="_blank">peticiones </a><a href="http://csharpalextremo.blogspot.com/2012/05/ajax-el-complemento-perfecto-parte-1.html" target="_blank">AJAX </a>con <a href="http://csharpalextremo.blogspot.com/2012/05/jquery-mi-amigo-del-alma.html" target="_blank">JQUERY </a>que es algo que nos facilita mucho la vida al momento de actualizar solo una parte de la web, ya que esto lo podemos realizar Asyncronamente.<br />
jQuery, como framework de <a href="http://csharpalextremo.blogspot.com/2012/05/javascript-concepto-y-ejemplos.html" target="_blank">JavaScript </a>nos permite realizar esta tarea de forma sencilla, evitando codificar directamente la petición <a href="http://csharpalextremo.blogspot.com/2012/05/ajax-el-complemento-perfecto-parte-1.html" target="_blank">AJAX </a>en <a href="http://csharpalextremo.blogspot.com/2012/05/javascript-concepto-y-ejemplos.html" target="_blank">JavaScript</a>.<br />
<br />
Hoy vamos a realizar una petición a una página para devolver el contenido, que incluiremos en una capa de nuestra
página. <br />
<br />
Lo primero será montar nuestra página <a href="http://csharpalextremo.blogspot.com/2012/05/tutorial-de-introduccion-html.html" target="_blank">HTML</a>. Con un <a href="http://w3api.com/wiki/HTML:BUTTON" title="button">button</a> y un <a href="http://w3api.com/wiki/HTML:DIV" title="div">div</a>.<br />
<br />
<pre class="brush: html">
<div id="mensaje"></div>
<button id="cargar">Cargar</button>
</pre>
<br />
<br />
Lo siguiente será inicializar <a href="http://csharpalextremo.blogspot.com/2012/05/jquery-mi-amigo-del-alma.html" target="_blank">jQuery </a>y empezar a generar el código.<br />
Cargamos la librería <a href="http://csharpalextremo.blogspot.com/2012/05/jquery-mi-amigo-del-alma.html" target="_blank">jQuery</a> mediante la etiqueta <a href="http://w3api.com/wiki/HTML:SCRIPT" title="script">SCRIPT</a>. <br />
<pre class="brush: html">
<script type="text/javascript" src="jquery.js"></script>
</pre>
<br />
O llamamos a un CDN que pueden encontrar mas información <a href="https://www.blogger.com/%3Cscript%20src=%22http://code.jquery.com/jquery-latest.min.js%22%20type=%22text/javascript%22%3E%3C/script%3E" target="_blank">Aqui</a>.<br />
<br />
<pre class="brush: html"><script src="http://code.jquery.com/jquery-latest.min.js" type="text/javascript"></script>
</pre>
<br />
Una vez configurado todo... Lo siguiente será capturar el evento click del botón con <a href="http://csharpalextremo.blogspot.com/2012/05/jquery-mi-amigo-del-alma.html" target="_blank">Jquery</a>. Para ello, sobre el <a href="http://w3api.com/wiki/HTML:Id" title="id">ID</a> cargar llamamos el evento Click de ese objeto.<br />
<br />
<pre class="brush: js">
<script type="text/javascript">
$(document).ready(function(){
$("#cargar").click(function(){
// Petición AJAX
});
});
</script></pre>
<br />
<br />
Para hacer la petición <a href="http://csharpalextremo.blogspot.com/2012/05/ajax-el-complemento-perfecto-parte-1.html" target="_blank">AJAX </a>nos apoyaremos en la función <a href="http://w3api.com/wiki/jQuery:Get%28%29" title="get()">.get(url,[data],[callback],[type])</a>. Esta función es muy sencilla y sus parámetros son:<br />
<ul>
<li><b>url</b>, es la URL que contendrá el fichero que nos devuelva los datos.</li>
<li><b>data</b>, son los datos a enviar a la URl de petición</li>
<li><b>callback</b>, es el método que se ejecutará cuando se realice la petición</li>
<li><b>type</b>, tipo de datos que se devolverán desde el servidor: text, xml, html, json,...</li>
</ul>
La peticion <a href="http://csharpalextremo.blogspot.com/2012/05/ajax-el-complemento-perfecto-parte-1.html" target="_blank">AJAX </a>seria:<br />
<br />
$.<span style="color: #006600;">get</span><span style="color: #66cc66;">(</span><span style="color: #3366cc;">"http://csharpalextremo.tk//ejemplos/datos.aspx"</span>, <span style="color: #003366; font-weight: bold;">function</span><span style="color: #66cc66;">(</span>data<span style="color: #66cc66;">)</span><span style="color: #66cc66;">{</span><br />
$<span style="color: #66cc66;">(</span><span style="color: #3366cc;">"#mensaje"</span><span style="color: #66cc66;">)</span>.<span style="color: #006600;">html</span><span style="color: #66cc66;">(</span>data<span style="color: #66cc66;">)</span>;<span style="color: #66cc66;"> </span><br />
<span style="color: #66cc66;">}</span><span style="color: #66cc66;">)</span>;<br />
<br />
En el metodo se puede apreciar varias cosas. La primera que datos.aspx es
el fichero que devuelve los datos (no entraremos en detalle de como se
compone, pero básicamente devuelve código <a href="http://csharpalextremo.blogspot.com/2012/05/tutorial-de-introduccion-html.html" target="_blank">HTML</a>).
La segunda es que la función de callback recibe como parámetro los
datos devueltos por el servidor... dentro de esta función lo que estamos
haciendo es añadir estos datos a la capa mediante el método <a href="http://w3api.com/wiki/jQuery:Html%28%29" title="html()">.html().</a><br />
<br />
Ahora solo nos queda el explotar las posibilidades del método <a href="http://w3api.com/wiki/jQuery:Get%28%29" title="get()">.get()</a> para dar potencia a nuestra web mediante peticiones <a href="http://csharpalextremo.blogspot.com/2012/05/ajax-el-complemento-perfecto-parte-1.html" target="_blank">AJAX </a>con <a href="http://csharpalextremo.blogspot.com/2012/05/jquery-mi-amigo-del-alma.html" target="_blank">jQuery</a>.<br />
<br />
Pueden <a href="https://sites.google.com/site/csharpalextremo/home/descargas/peticiones%20ajax%20con%20jquery.html?attredirects=0&d=1"><b>DESCARGAR </b></a>el código de ejemplo desde <a href="https://sites.google.com/site/csharpalextremo/home/descargas/peticiones%20ajax%20con%20jquery.html?attredirects=0&d=1">Aqui.</a> <br />
<br />
Espero que lo disfruten, compartan y comenten. ;)
<br />
<br />
Visita: <a href="http://rubitcorp.co/">http://rubitcorp.co/</a><br />
<br />
<div style="color: #741b47;">
<b>"Si se puede imaginar... se puede programar."</b></div>
<div class="blogger-post-footer">“Primero resuelve el problema. Entonces, escribe el código.”
— John Johnson</div>Jairo Ortizhttp://www.blogger.com/profile/15511019924919091246noreply@blogger.com0tag:blogger.com,1999:blog-8899331477397536059.post-28594151846170427832013-01-24T18:20:00.001-05:002014-07-10T09:12:19.729-05:00Imagen: Editar, Recortar, Redimencionar y Guardar en Carpeta<br />
<br />
En C #, puede ser agotador para hacer ciertas funciones de edición de imagen utilizando GDI +. Este blog tiene algunos métodos de edición divertidas que pueden ser útiles a veces. También he incluido un bonito y pequeño programa en C # para mostrar toda la funcionalidad de los siguientes métodos.<br />
Guardar un Jpeg dentro de una carpeta.<br />
<br />
Lo primero a hacer es configurar la firma del método con los parámetros de entrada. Se trata de la ruta de archivo de salvar (cadena), la imagen de guardar (System.Drawing.Bitmap), y un ajuste de calidad (largo). <br />
<pre class="brush: csharp">private void saveJpeg(string path, Bitamp img, long quality)
</pre>
<br />
Lo proximo a hacer es configurar la información del codificador para guardar el archivo. Esto incluye establecer un EncoderParameter para la calidad de la imagen JPEG. El siguiente paso es obtener la información codec de su equipo para jpegs. Hago esto con una función para recorrer las disponibles en el equipo y asegurarse que el codec jpeg está ahí. La línea de bajo se asegura de que el codec JPEG se encuentra en el equipo. Si no simplemente devuelve fuera del método.<br />
<br />
La última cosa a hacer es guardar el mapa de bits utilizando el codec y el infomation encoder.<br />
<br />
<pre class="brush: csharp">private void saveJpeg(string path, Bitmap img, long quality)
{
// Encoder parameter for image quality
EncoderParameter qualityParam = new EncoderParameter(Encoder.Quality, quality);
// Jpeg image codec
ImageCodecInfo jpegCodec = this.getEncoderInfo("image/jpeg");
if(jpegCodec == null)
return;
EncoderParameters encoderParams = new EncoderParameters(1);
encoderParams.Param[0] = qualityParam;
img.Save(path, jpegCodec, encoderParams);
}
private ImageCodecInfo getEncoderInfo(string mimeType)
{
// Get image codecs for all image formats
ImageCodecInfo[] codecs = ImageCodecInfo.GetImageEncoders();
// Find the correct image codec
for (int i = 0; i < codecs.Length; i++)
if (codecs[i].MimeType == mimeType)
return codecs[i];
return null;
}
</pre>
<br />
<h4>
Recorte </h4>
El método toma dos objetos - la imagen que desea recortar
(System.Drawing.Image) y el rectángulo para recortar
(System.Drawing.Rectangle). La siguiente cosa a hacer es crear un mapa de bits (System.Drawing.Bitmap) de la imagen. Lo único que queda por hacer es recortar la imagen. Esto se hace mediante la clonación de la imagen original, pero sólo teniendo un rectángulo de la original.<br />
<br />
<pre class="brush: csharp">private static Image cropImage(Image img, Rectangle cropArea)
{
Bitmap bmpImage = new Bitmap(img);
Bitmap bmpCrop = bmpImage.Clone(cropArea,
bmpImage.PixelFormat);
return (Image)(bmpCrop);
}
</pre>
<br />
<h4>
Cambiar el tamaño </h4>
El siguiente grupo de código es un poco más largo y más complejo.
La razón principal que este código es más largo es porque esta función al cambio de tamaño se mantendrá la altura y la anchura proporcional. <br />
Para empezar, vemos que los parámetros de entrada son la imagen para
cambiar el tamaño (System.Drawing.Image) y el tamaño
(System.Drawing.Size). También en este conjunto de código hay algunas variables que utilizamos. Los dos primeros son la altura y anchura original que se utiliza más adelante. Y hay 3 otras variables para calcular la información de proporción. <br />
<br />
<pre class="brush: csharp">private static Image resizeImage(Image imgToResize, Size size)
{
int sourceWidth = imgToResize.Width;
int sourceHeight = imgToResize.Height;
float nPercent = 0;
float nPercentW = 0;
float nPercentH = 0;
}
</pre>
<br />
El siguiente paso es determinar en realidad el tamaño que debe tener la iamgen. El primer paso es el cálculo de los porcentajes del nuevo tamaño en comparación con el original.
A continuación tenemos que decidir qué porcentaje es menor porque este
es el porcentaje de la imagen original que utilizaremos en altura y en
anchura. Y ahora se calcula el número de píxeles de altura y anchura de la imagen de destino.<br />
<br />
<pre class="brush: csharp">nPercentW = ((float)size.Width / (float)sourceWidth);
nPercentH = ((float)size.Height / (float)sourceHeight);
if (nPercentH < nPercentW)
nPercent = nPercentH;
else
nPercent = nPercentW;
int destWidth = (int)(sourceWidth * nPercent);
int destHeight = (int)(sourceHeight * nPercent);
</pre>
<br />
La última cosa a
hacer es crear el mapa de bits (System.Drawing.Bitmap) que vamos a
dibujar. La imagen cambia de tamaño en el uso de un objeto Graphics
(System.Drawing.Graphics) del objeto. Asimismo, establecer el modo de interpolación, que es el algoritmo usado para cambiar el tamaño de la imagen. Prefiero HighQualityBicubic, que desde mi prueba parece devolver los resultados más altos de calidad. Y sólo para limpiar un poco que disponer del objeto Graphics.<br />
<br />
<pre class="brush: csharp">Bitmap b = new Bitmap(destWidth, destHeight);
Graphics g = Graphics.FromImage((Image)b);
g.InterpolationMode = InterpolationMode.HighQualityBicubic;
g.DrawImage(imgToResize, 0, 0, destWidth, destHeight);
g.Dispose();
</pre>
<br />
Y esto nos da el código final.<br />
<br />
<pre class="brush: csharp">private static Image resizeImage(Image imgToResize, Size size)
{
int sourceWidth = imgToResize.Width;
int sourceHeight = imgToResize.Height;
float nPercent = 0;
float nPercentW = 0;
float nPercentH = 0;
nPercentW = ((float)size.Width / (float)sourceWidth);
nPercentH = ((float)size.Height / (float)sourceHeight);
if (nPercentH < nPercentW)
nPercent = nPercentH;
else
nPercent = nPercentW;
int destWidth = (int)(sourceWidth * nPercent);
int destHeight = (int)(sourceHeight * nPercent);
Bitmap b = new Bitmap(destWidth, destHeight);
Graphics g = Graphics.FromImage((Image)b);
g.InterpolationMode = InterpolationMode.HighQualityBicubic;
g.DrawImage(imgToResize, 0, 0, destWidth, destHeight);
g.Dispose();
return (Image)b;
}
</pre>
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="http://3.bp.blogspot.com/-XOS0cK-zEOQ/UQHA_Z75KhI/AAAAAAAAEAg/ojjDsglgcnk/s1600/recortar.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="http://3.bp.blogspot.com/-XOS0cK-zEOQ/UQHA_Z75KhI/AAAAAAAAEAg/ojjDsglgcnk/s1600/recortar.png" /></a></div>
<br />
<br />
Espero que lo disfruten, compartan y comenten. ;)
<br />
Visita: <a href="http://rubitcorp.co/">http://rubitcorp.co/</a><br />
<div style="color: #741b47;">
<b>"Si se puede imaginar... se puede programar."</b></div>
<div class="blogger-post-footer">“Primero resuelve el problema. Entonces, escribe el código.”
— John Johnson</div>Jairo Ortizhttp://www.blogger.com/profile/15511019924919091246noreply@blogger.com1tag:blogger.com,1999:blog-8899331477397536059.post-34063447438519799492013-01-14T10:00:00.000-05:002013-01-14T10:13:10.183-05:00Eventos de una Página Web (WebForm ASP.NET) Este pequeño post es para aclarar algunos conceptos sobre el ciclo de vida de una página web ASP.NET (WebForm).<br />
Nota: A este post le iré agregando mas contenido poco a poco, con los propios comentarios de los lectores y mis experiencias diarias sobre el ciclo de vida y los distintos estados de una pagina.<br />
Eventos más importantes de la pagina en orden de ejecución:<br />
<br />
PreInit<br />
Init<br />
Load<br />
PreRender<br />
<br />
<b>PreInit</b><br />
<br />
El evento PreInit ocurre antes de la inicialización de los controles de la pagina.<br />
<br />
Normalmente es usado para añadir dinámicamente controles a la pagina, porque añadiéndolos aquí garantizamos que a dichos controles se les apliquen adecuadamente los Skins del Theme definido (si no hemos definido ningún Theme daría un poco igual añadirlos aquí o en Init, por ejemplo).<br />
<br />
Además puede usarse para definir dinámicamente (programáticamente) la MasterPage y el Theme de la pagina.<br />
<br />
<br />
<br />
<br />
<b>Init</b><br />
<br />
Este evento ocurre después de que todos los controles de la pagina ya tienen definidos sus Theme . Este evento es usado normalmente para leer o definir propiedades de los controles.<br />
<br />
<br />
<b>Load</b><br />
<br />
El load de la pagina ocurre antes que el load de los controles.<br />
<br />
<br />
<b>PreRender</b><br />
<br />
Este evento ocurre justo antes de que los controles de la pagina sean rendereados y pintados en el navegador web. Normalmente es usado para modificar el contenido de la pagina o sus controles. Primero ocurre el PreRender de la pagina y después el de cada uno de controles.<br />
<br />
<br />
Nota: Existen muchos mas eventos y muchos artículos que hablan sobre el tema, pero yo iré poniendo aquí los que me parecen que son los mas importantes y más usados.<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="http://3.bp.blogspot.com/-0sLgCx3QSTA/UPQgebaKBfI/AAAAAAAAEAI/pUyDHL0JWkA/s1600/02_042_aspnet%5B1%5D.gif" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="http://3.bp.blogspot.com/-0sLgCx3QSTA/UPQgebaKBfI/AAAAAAAAEAI/pUyDHL0JWkA/s1600/02_042_aspnet%5B1%5D.gif" height="174" width="320" /></a></div>
<br />
<br />
Espero que lo disfruten, compartan y comenten. ;)
<br />
<br />
<div style="color: #741b47;">
<b>"Si se puede imaginar... se puede programar."</b></div>
<div class="blogger-post-footer">“Primero resuelve el problema. Entonces, escribe el código.”
— John Johnson</div>Jairo Ortizhttp://www.blogger.com/profile/15511019924919091246noreply@blogger.com0tag:blogger.com,1999:blog-8899331477397536059.post-40742957128644103882013-01-09T15:20:00.000-05:002013-01-09T15:23:13.219-05:00Entendiendo los extensores en c sharpLos métodos extensores son un recurso de C# a partir de la versión 3.0 y permite añadir métodos a tipos ya definidos sin tener que crear un tipo heredero, recompilar o modificar al tipo original de una forma muy sencilla y con una sintaxis casi idéntica a la forma tradicional de declarar un método. En otras palabras, si queremos añadirle una funcionalidad a una clase o tipo ya definido anteriormente, no tendremos que modificarla, al no ser que vayamos a usar variables privadas de la clase o cosas por el estilo.<br />
<br />
Se definen como métodos estáticos pertenecientes a una clase estática y no genérica; pero se llaman de la forma tradicional, como métodos de una instancia de una clase.<br />
<br />
Se les pasa como primer parámetro this seguido del tipo de la clase a la cual se va a añadir el método; aquí tenemos un ejemplo de añadirle un método a la clase String de .Net:<br />
<pre class="brush: csharp">public static class MyExtensions
{
public static int WordCount(this String str)
{
//Split separa la cadena en un array de string utiizando los separadores especificados
return str.Split(new char[] { ' ', '.', '?', ';' , ':' }, StringSplitOptions.RemoveEmptyEntries).Length;
}
}
</pre>
<br />
Utilizando este ejemplo:<br />
<br />
<pre class="brush: csharp"> string s = "hello extension methods!";
int count = s.WordCount();
//Este código imprime: 3
</pre>
<br />
Este método podrá ser usado en todas las variables de tipo string, IntelliSense también los reconoce ya que no violan los principios de encapsulación, pues en realidad no modifican a la clase ni acceden a sus variables privadas.<br />
<br />
Los métodos extensores se usan para extender una clase o interface; pero no para sobreescribirla. Un método extensor con el mismo nombre y signatura (parámetros) que un método de la clase o la interface, nunca será llamado: en tiempo de compilación, los métodos extensores tienen menor prioridad que los métodos definidos en el propio tipo y están definidos en el ámbito del namespace.<br />
<br />
Veamos otro ejemplo un poco más complejo usando interfaces y genericidad:<br />
<br />
<pre class="brush: csharp">//Este método devuelve el mayor de una colección que sea
//IEnumerable(List, array, LinkedList, etc)
public static T Mayor(this IEnumerable items) where T : IComparable
{
T max = default(T);
bool empty = true;
foreach (T x in items)
{
max = x; empty = false; break;
}
if (empty) throw new Exception("The source cannot be empty");
foreach (T x in items)
{
if (x.CompareTo(max) > 0)
max = x;
}
return max;
}
</pre>
<br />
Como en el caso anterior, ahora en todas las clases que implementen la
interfaz IEnumerable donde sus elementos se puedan comparar, tendremos
un método Mayor, que devuelve el mayor elemento de la colección de
objetos de tipo T genérico. Veamos algunos ejemplos de como usar este
método:<br />
<br />
<pre class="brush: csharp">int[] numeros = { 10, -60, 20, -50, 30, -40 };
Console.WriteLine(numeros.Mayor()=;
//se va a imprimir 30
</pre>
<br />
Otro ejemplo podría ser:<br />
<br />
<pre class="brush: csharp">List colores = new List { "rojo", "verde", "azul", "blanco", "negro"};
Console.WriteLine(colores.Mayor());
//se va a imprimir verde, que es el mayor en orden alfabético</pre>
<br />
Bueno, si quieren ver más ejemplos aquí les dejo unos cuantos métodos extensores en C# para descargar
con sus probadores y todo, para que practiques y le saques el mayor
partido a esta nueva característica de C#. Si tienes alguna duda,
propuesta o no entiendes algo por favor escribe en los comentarios. Proximamente
estaremos hablando de LINQ, otra de las nuevas características de C# y
.Net.<br />
<br />
<a href="https://sites.google.com/site/csharpalextremo/home/descargas/metodos-extensores.zip?attredirects=0&d=1" target="_blank">Descargar Aqui:</a> <br />
<div class="separator" style="clear: both; text-align: center;">
<a href="http://3.bp.blogspot.com/-N2q2AOw6LnM/UO3RheZIHEI/AAAAAAAAD_w/kF4x5WMQ93Q/s1600/dibujo%5B1%5D.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="http://3.bp.blogspot.com/-N2q2AOw6LnM/UO3RheZIHEI/AAAAAAAAD_w/kF4x5WMQ93Q/s1600/dibujo%5B1%5D.jpg" height="193" width="320" /></a></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="http://fjaumot.files.wordpress.com/2008/10/dibujo.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><br /></a></div>
<br />
Espero que lo disfruten, compartan y comenten. ;)
<br />
<br />
<div style="color: #741b47;">
<b>"Si se puede imaginar... se puede programar."</b></div>
<div class="blogger-post-footer">“Primero resuelve el problema. Entonces, escribe el código.”
— John Johnson</div>Jairo Ortizhttp://www.blogger.com/profile/15511019924919091246noreply@blogger.com0tag:blogger.com,1999:blog-8899331477397536059.post-88917598792449923602012-09-27T15:47:00.000-05:002012-09-27T15:51:18.102-05:00Método Parse() o los métodos de la clase Convert<br />
<div class="separator" style="clear: both; text-align: center;">
</div>
<div class="separator" style="clear: both; text-align: center;">
<a href="http://2.bp.blogspot.com/-yGbufG1lQvA/UGS8Flun__I/AAAAAAAAAk0/agIRaeJNEX8/s1600/Capture.PNG" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" height="189" src="http://2.bp.blogspot.com/-yGbufG1lQvA/UGS8Flun__I/AAAAAAAAAk0/agIRaeJNEX8/s200/Capture.PNG" width="200" /></a></div>
<a href="http://1.bp.blogspot.com/-Ir59qEReGCs/UGS72McxRzI/AAAAAAAAAks/XG2n0hk__fo/s1600/convert.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><br /></a><br />
Vamos arrojar un poco de luz sobre las diferencias entre utilizar el método <span class="Apple-style-span" style="font-style: italic;">Parse()</span> de las estructuras de tipos de .NET o utilizar los métodos de la clase <span class="Apple-style-span" style="font-style: italic;">System.Convert</span>. En realidad parece que hacen lo mismo pero existe una gran diferencia.Supongamos
que dejamos que un usuario introduzca un valor numérico por pantalla y
queremos realizar cálculos con ese valor. Por lo tanto, el valor
introducido por el usuario será del tipo <span class="Apple-style-span" style="font-style: italic;">System.String</span> y deberemos convertirlo a un tipo de valor numérico, por ejemplo <span class="Apple-style-span" style="font-style: italic;">System.Int32</span>.<br />
En definitiva queremos saber que diferencia hay entre ejecutar estas dos lineas de código:<br />
<div style="font-family: 'Courier New'; font-size: 10pt; margin: 10px; padding: 10px; word-wrap: break-word;">
<span style="color: blue;">int </span><span style="color: black;">valorA </span><span style="color: blue;">= </span><span style="color: black;">Convert.ToInt32(valorUsuario)</span><span style="color: blue;">;</span></div>
<div style="font-family: 'Courier New'; font-size: 10pt; margin: 10px; padding: 10px; word-wrap: break-word;">
<span style="color: blue;"><span class="Apple-style-span" style="color: black;"><span style="color: blue;">int </span><span style="color: black;">valorB </span><span style="color: blue;">= </span><span style="color: black;">Int32.Parse(valorUsuario)</span><span style="color: blue;">;</span></span></span></div>
Cuando utilizamos la segunda opción, el método <span class="Apple-style-span" style="font-style: italic;">Parse()</span>, si el usuario no ha introducido ningún valor (<span class="Apple-style-span" style="font-style: italic;">null</span>) recibiremos una excepción del tipo <span class="Apple-style-span" style="font-style: italic;">System.FormatException</span>. Lo que indica que el <span class="Apple-style-span" style="line-height: 15px;">formato del argumento no cumple las especificaciones del parámetro del método invocado.</span><br />
En cambio, cuando utilizamos la primera opción, los métodos de la clase <span class="Apple-style-span" style="font-style: italic;">System.Convert</span>, si el valor pasado al método es <span class="Apple-style-span" style="font-style: italic;">null</span>, el método <span class="Apple-style-span" style="font-style: italic;">ConovertToInt32()</span> devolverá un valor numérico, devolverá cero en todos los casos que el valor de entrada sea <span class="Apple-style-span" style="font-style: italic;">null</span>.<br />
Utilizando la herramienta <a href="http://www.red-gate.com/products/reflector/" target="_blank">Reflector</a> podemos ver las diferencias de código que hay entre estas dos formas de convertir los tipos de .NET.<br />
<br />
<pre class="brush: csharp">
Convert.ToInt32();
public static int ToInt32(string value)
{
if (value == null)
{
return 0;
}
return int.Parse(value, CultureInfo.CurrentCulture);
}
Int32.Parse();
public static int Parse(string s)
{
return Number.ParseInt32(s, NumberStyles.Integer, NumberFormatInfo.CurrentInfo);
}
</pre>
Espero que lo disfruten, compartan y comenten. ;)
<br />
<br />
<div style="color: #741b47;">
<b>"Si se puede imaginar... se puede programar."</b></div>
<div class="blogger-post-footer">“Primero resuelve el problema. Entonces, escribe el código.”
— John Johnson</div>Jairo Ortizhttp://www.blogger.com/profile/15511019924919091246noreply@blogger.com0tag:blogger.com,1999:blog-8899331477397536059.post-28343505950745341402012-09-27T14:28:00.002-05:002014-07-10T09:12:52.922-05:00String Cuidado con ese tipo!<br />
El tipo System.String, que como todos sabemos representa una cadena,
es un tipo algo especial con el que hay que tener un poco de cuidado a
la hora de menejarlo. Veamos en primer lugar una definición más o menos
formal del tipo System.String: <br />
"<em>El tipo System.String es un
tipo por referencia e inmutable (de solo lectura) que representa una
cadena de texto como una colección secuencial de caracteres Unicode
(objetos System.Char)".</em> <br />
Para este artículo nos centraremos
en la primera parte de la definición, es decir, en "El tipo
System.String es un tipo por referencia e inmutable (de solo lectura)
...".<br />
<br />
<strong>¿Que quiere decir que es inmutable?</strong> <br />
Un
objeto inmutable es un objeto que no se puede modificar. Cuando creas, o
cargas en menoria un objeto de este tipo, permanece con el mismo valor
durente toda la vida del objeto. Veamos el siguiente fragmento de
código: <br />
<div class="code" style="background-color: white; font-family: 'Courier New'; font-size: 10pt; margin: 10px; padding: 10px; word-wrap: break-word;">
<span style="color: blue;">string </span><span style="color: black;">miCadena </span><span style="color: blue;">= </span><span style="color: grey;">"Un saludo"</span><span style="color: blue;">;<br /> </span><span style="color: black;">miCadena +</span><span style="color: blue;">= </span><span style="color: grey;">" para el lector"</span><span style="color: blue;">;</span> </div>
Quizás
pueda parecer que en la segunda linea de este fragmento estamos
modificando el literal "Un saludo" pero esto no es así. Como ya dijimos
antes, el objeto "Un saludo" es inmutable, por lo tanto, despúes de la
concatenación, lo que se devuelve es un nuevo objeto de tipo
System.String que contiene la modificación: "Un saludo para el lector". <br />
Por
lo tanto, cuando concatenamos cadenas de esta forma, tenemos en la
memoria dos objetos, uno con el valor original y otro con la
modificación. Es evidente, que sí esta operación la realizamos miles de
veces, por ejemplo leyendo de una base de datos, el rendimiento de la
aplicación se verá gravemente afectado. Por otro lado, si la operación
solo se realiza una o dos veces (incluso tres o cuatro) no tiene tanta
importancia. <br />
Supongamos que tenemos una base de datos con todos
los nombre de los lectores de este blog, y supongamos que son miles los
nombres guardados (¡ojalá!...jeje). Ahora queremos leer de la base de
datos todos los nombres y saludarles por pantalla. Creamos un método al
que le pasamos cada nombre leido en un bucle. <br />
<div class="code" style="background-color: white; font-family: 'Courier New'; font-size: 10pt; margin: 10px; padding: 10px; word-wrap: break-word;">
<span style="color: blue;">static void </span><span style="color: black;">Saludar(</span><span style="color: blue;">string </span><span style="color: black;">Nombre)<br /> {<br /> StringBuilder sb </span><span style="color: blue;">= new </span><span style="color: black;">StringBuilder(</span><span style="color: grey;">"Hola para "</span><span style="color: black;">)</span><span style="color: blue;">;<br /> </span><span style="color: black;">sb.Append(Nombre)</span><span style="color: blue;">;<br /> </span><span style="color: black;">Console.WriteLine(sb.ToString())</span><span style="color: blue;">;</span><span style="color: blue;"><br /> </span><span style="color: black;">}</span> </div>
Esta es la manera correcta de proceder, creando un objeto <a href="http://msdn.microsoft.com/es-es/library/system.text.stringbuilder%28VS.80%29.aspx" target="_blank">System.Text.StringBuilder</a>
y añadiendo cada nueva cadena por medio de su método Append(). Si
queréis podéis descargaros un pequeño programilla que calcula el tiempo
que se tarda en realizar concatenaciones con System.String y
System.Text.StringBuilder en función de un número de iteraciones
introducidas por el usuario. <br />
<a href="http://www.oscarsotorrio.com/file.axd?file=2008%2f11%2fString_vs_StringBuilder.rar">String_vs_StringBuilder.rar (21,95 kb)</a> <br />
<br />
<strong>Más cosas a tener en cuenta.</strong> <br />
¿Más cosas a tener en cuenta?. Ya dijimos que eran...¡unos tipos de cuidado!. <br />
Cuando
inicializamos variables de tipo Sytem.String y queremos darles un valor
por defecto de cadena vacia es muy frecuente hacerlo con las comillas
"". <br />
<div class="code" style="background-color: white; font-family: 'Courier New'; font-size: 10pt; margin: 10px; padding: 10px; word-wrap: break-word;">
<span style="color: blue;">class </span><span style="color: black;">Lector<br /> {<br /> </span><span style="color: blue;">public string </span><span style="color: black;">Nombre</span><span style="color: blue;">;<br /> public string </span><span style="color: black;">Apellidos</span><span style="color: blue;">;<br /> public string </span><span style="color: black;">Direccion</span><span style="color: blue;">;<br /> public string </span><span style="color: black;">Telefono</span><span style="color: blue;">;<br /> public string </span><span style="color: black;">Comentario</span><span style="color: blue;">;<br /> public string </span><span style="color: black;">FechaComentario</span><span style="color: blue;">;<br /><br /> public </span><span style="color: black;">Lector()<br /> {<br /> Nombre </span><span style="color: blue;">= </span><span style="color: grey;">""</span><span style="color: blue;">;<br /> </span><span style="color: black;">Apellidos </span><span style="color: blue;">= </span><span style="color: grey;">""</span><span style="color: blue;">;<br /> </span><span style="color: black;">Direccion </span><span style="color: blue;">= </span><span style="color: grey;">""</span><span style="color: blue;">;<br /> </span><span style="color: black;">Telefono </span><span style="color: blue;">= </span><span style="color: grey;">""</span><span style="color: blue;">;<br /> </span><span style="color: black;">Comentario </span><span style="color: blue;">= </span><span style="color: grey;">""</span><span style="color: blue;">;<br /> </span><span style="color: black;">FechaComentario </span><span style="color: blue;">= </span><span style="color: grey;">""</span><span style="color: blue;">;<br /> </span><span style="color: black;">}<br /><br /> </span><span style="color: darkgreen;">//...............<br /><br /> //Aquí el resto de mienbros de la clase.<br /><br /> //...............<br /> </span><span style="color: black;">}</span> </div>
No
es recomendable hacerlo de esta forma. En este caso hemos creado
(cargado en la menoria) 6 objetos diferentes de tipo cadena. Y
seguramente luego "intentaremos" modificarlos al asignarles un valor
determinado. Lo correcto, o por lo menos más recomendable, es hacerlo
así: <br />
<br />
<div class="code" style="background-color: white; font-family: 'Courier New'; font-size: 10pt; margin: 10px; padding: 10px; word-wrap: break-word;">
<span style="color: blue;">public </span><span style="color: black;">Lector()<br /> {<br /> Nombre </span><span style="color: blue;">= </span><span style="color: black;">String.Empty</span><span style="color: blue;">;<br /> </span><span style="color: black;">Apellidos </span><span style="color: blue;">= </span><span style="color: black;">String.Empty</span><span style="color: blue;">;<br /> </span><span style="color: black;">Direccion </span><span style="color: blue;">= </span><span style="color: black;">String.Empty</span><span style="color: blue;">;<br /> </span><span style="color: black;">Telefono </span><span style="color: blue;">= </span><span style="color: black;">String.Empty</span><span style="color: blue;">;<br /> </span><span style="color: black;">Comentario </span><span style="color: blue;">= </span><span style="color: black;">String.Empty</span><span style="color: blue;">;<br /> </span><span style="color: black;">FechaComentario </span><span style="color: blue;">= </span><span style="color: black;">String.Empty</span><span style="color: blue;">;<br /> </span><span style="color: black;">}</span> </div>
Al utilizar el campo <a href="http://msdn.microsoft.com/es-es/library/system.string.empty.aspx" target="_blank">String.Empty</a> que
representa una cadena vacía, estamos apuntando todas las variables a un
mismo objeto. De esta forma solo reservamos memoria para un único
objeto gracias a que los tipos System.String son tipos por refencia. <br />
Bueno...ya saben...¡cuidado con estos "tipos"!.<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="http://3.bp.blogspot.com/-ql7tHRyfiCc/T-HaUGkIlxI/AAAAAAAAALU/8HoX2tLCoVE/s1600/buenas+practicas+de+programacion.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="http://3.bp.blogspot.com/-ql7tHRyfiCc/T-HaUGkIlxI/AAAAAAAAALU/8HoX2tLCoVE/s200/buenas+practicas+de+programacion.png" height="199" width="200" /></a></div>
<br />
<br />
Espero que lo disfruten, compartan y comenten. ;)
<br />
<br />
Visita: http://rubitcorp.co/<br />
<br />
<div style="color: #741b47;">
<b>"Si se puede imaginar... se puede programar."</b></div>
<div class="blogger-post-footer">“Primero resuelve el problema. Entonces, escribe el código.”
— John Johnson</div>Jairo Ortizhttp://www.blogger.com/profile/15511019924919091246noreply@blogger.com3tag:blogger.com,1999:blog-8899331477397536059.post-75850323388950320112012-09-27T11:08:00.001-05:002012-09-27T11:08:45.225-05:00Manejo de strings en C SHARP .NET<br />
Hola csharpedianos, En este post veremos varios metodos aplicados al manejo de caracteres con la clase string.<br />
Un string es una cadena de caracteres, y hay que saber dominar todos estos caracteres y hacer con ellos lo que nos venga en gana.<br />
Es por eso que les traigo este post donde veremos algunas cosas interesantes que podemos hacer con esta clase string. <br />
<h2>
Código en C# </h2>
<pre class="brush: csharp">public static bool Contiene(string palabra, string cadena)
{
for (int i = 0; i <= palabra.Length-cadena.Length; i++)
//Si encontramos dos letras iguales
if(palabra[i]==cadena[0])
{
bool contenida = true;
//Recorremos la cadena desde la posición 1
//y comparamos con la palabra a partir de
//la posición donde las dos letras iguales
for (int j = 1; j < cadena.Length; j++)
if (palabra[i + j] != cadena[j])
contenida = false;
//Si esta contenida
if(contenida)
return true;
}
//Si no está contenida
return false;
}
public static bool EsPalindromo(string s)
{
//Si s está vacio o tiene longitud 1 retornamos true
//Este es el caso base o condicion de parada recursiva
if (s.Length == 0 || s.Length == 1) return true;
//Quitamos las esquinas para ver si lo que queda
//es palíndromo.
string result = s.Substring(1, s.Length - 2);
//Retornamos si los dos extremos de s son iguales
//y volvemos a llamar al metodo EsPalindromo
return s[0] == s[s.Length - 1] && EsPalindromo(result);
}
public static string Invertir(string s)
{
string result = "";
//Recorremos la cadena desde el final
for (int k = s.Length - 1; k >= 0; k--)
//Guardamos cada caracter en un nuevo string
result = result + s[k];
return result;
}
public static string Reemplazar(string cadena, string x, string y)
{
string resp = cadena;
for (int i = 0; i < cadena.Length; i++)
{
if (resp[i] == x[0])
{
bool igual = true;
for (int j = 1; j < x.Length; j++)
{
if (resp[i + j] != x[j])
igual = false;
}
if (igual)
{
string alante = resp.Substring(0, i);
string atras = resp.Substring(i + x.Length);
resp = alante + y + atras;
}
}
}
return resp;
}
</pre>
Es importante notar que aunque String, es una clase en C#, se puede
tratar como un array de caracteres, y que el for se hace hasta
palabra.Length-subcadena.Length, para que no de excepción.
También hay que decir que este ejercicio se puede hacer de otra forma
más eficiente usando String Matching y algoritmos como KMP, pero no es
el objetivo de este post.<br />
<br />
Creo que el código está bien comentado, pero cualquier pregunta en los comentarios<br />
<br />
<a href="https://sites.google.com/site/csharpalextremo/home/descargas/String.rar?attredirects=0&d=1" target="_blank">Descarga aquí el código.</a><br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="http://2.bp.blogspot.com/-zgyXEI-71Pc/UGR5v-4QhyI/AAAAAAAAAkU/zp4BysXkVqA/s1600/c-c-sharp-logo-strings.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="200" src="http://2.bp.blogspot.com/-zgyXEI-71Pc/UGR5v-4QhyI/AAAAAAAAAkU/zp4BysXkVqA/s200/c-c-sharp-logo-strings.jpg" width="181" /></a></div>
<br />
<br />
Espero que lo disfruten, compartan y comenten. ;)
<br />
<br />
<div style="color: #741b47;">
<b>"Si se puede imaginar... se puede programar."</b><br />
<br />
</div>
<div class="blogger-post-footer">“Primero resuelve el problema. Entonces, escribe el código.”
— John Johnson</div>Jairo Ortizhttp://www.blogger.com/profile/15511019924919091246noreply@blogger.com1tag:blogger.com,1999:blog-8899331477397536059.post-14472136573979934622012-09-21T11:46:00.001-05:002012-09-21T17:56:14.211-05:00Diferencias entre Char, Varchar, NChar y NVarchar en SQL Server<br />
<div class="MsoNormal">
¿Cuál es la diferencia entre estos, y cuán importante es la diferencia?</div>
<div class="MsoNormal">
<h3>
Char y NChar<b> </b></h3>
<span style="font-weight: normal;">Cuando se configura un campo de tipo Char o NChar estamos indicando campos de tamaño fijo. Es Decir, si configuramos una tabla de la siguiente forma</span><br />
<pre><code>
<b>Campo1 Char(10),
Campo2 NChar(10)</b></code></pre>
<pre><code> </code></pre>
La diferencia entre <i>Char</i> y <i>NChar</i> es el soporte a carácteres Unicode <i>(los carácteres Unicode ocupan más de 1 byte)</i>. Por este motivo a la hora de almacenar algún valor, en el <i>Campo1</i> siempre ocupará 10 bytes y en el <i>Campo2</i> 20 Bytes.<br />
<br />
<h3>
Varchar y Nvarchar</h3>
</div>
<div class="MsoNormal">
</div>
<div class="MsoNormal">
VARCHAR es la abreviación de <b>variable-length character string.</b> Es una cadena de caracteres de texto que puede ser tan grande como el tamaño de página para la tabla de la base de datos. <b><span style="font-family: "Calibri","sans-serif"; font-weight: normal;">Los campos de tipo Varchar o NVarchar son de almacenamiento variable</span></b><b>. </b></div>
<div class="MsoNormal">
<br /></div>
<div class="MsoNormal">
El tamaño almacenado dependerá del valor
que se quiere guardar, el número de caracteres sólo configura el tamaño
máximo que este campo puede almacenar. </div>
<div class="MsoNormal">
<br /></div>
<div class="MsoNormal">
Configuramos una tabla de la siguiente forma:</div>
<div class="MsoNormal" style="line-height: normal; margin-bottom: 0.0001pt;">
<br /></div>
<div class="MsoNormal" style="line-height: normal; margin-bottom: 0.0001pt;">
<span style="font-family: "Courier New"; font-size: 10pt;">CampoVariable1 <span style="color: blue;">Varchar</span><span style="color: grey;">(</span>10<span style="color: grey;">),</span></span></div>
<div class="MsoNormal" style="line-height: normal; margin-bottom: 0.0001pt;">
<span style="font-family: "Courier New"; font-size: 10pt;">CampoVariable2 <span style="color: blue;">NVarchar</span><span style="color: grey;">(</span>10<span style="color: grey;">)</span></span></div>
<div class="MsoNormal">
<br /></div>
<div class="MsoNormal">
El tamaño almacenado dependerá del valor
que se quiere guardar, el número de caracteres sólo configura el tamaño
máximo que este campo puede almacenar. En el caso del <i>CampoVariable1</i> el tamaño máximo será de 10 bytes, y en el caso del <i>CampoVariable2</i> el tamaño máximo será de 20 bytes.</div>
<div class="MsoNormal">
<br /></div>
<div class="MsoNormal">
El tamaño de una página de tabla es 8.196 bytes, y no hay una fila de una tabla puede ser tener de 8.060 caracteres. <span style="background: none repeat scroll 0% 0% rgb(230, 236, 249);">Esto a su vez limita el tamaño máximo de un VARCHAR a 8000 caracateres</span></div>
<div class="MsoNormal">
<br /></div>
<div class="MsoNormal">
La "N" en NVARCHAR significa <b>uNicode.</b>
Esencialmente, NVARCHAR no es más que un VARCHAR que soporta caracteres
de dos bytes. Lo que representara una longitud máxima de 4000
caracteres. Lo que significa tener la capacidad de almacenar caracteres
especiales en este tipo de datos.</div>
<div class="MsoNormal">
</div>
<div class="MsoNormal">
<span style="font-weight: bold;">Y para que sirve Unicode?</span> Si la
columna donde almacenamos el texto es Unicode quiere decir que no
tendremos problemas para guardar y recuperar caracteres que se usan en
otros idiomas como el español (á é í ó ú ñ), pero con el español los
problemas de visualización no son muy frecuentes, con el resto de
idiomas es el problema (como el chino o japonés). </div>
<div class="MsoNormal">
</div>
<div class="MsoListParagraphCxSpLast" style="text-indent: -18pt;">
<br />
<div style="text-align: left;">
3 </div>
</div>
<div style="text-align: left;">
<span style="font-size: small;"><b>Unicode o No Unicode</b></span></div>
<div style="text-align: left;">
Dependiendo de la información que queremos almacenar en nuestra base de datos, tendremos que definir si permitimos o no valores Unicode (Por ejemplo diferentes idiomas como el Ruso, Japonés, chino, …).
Existen tablas de codificación de caracteres (Encodings) que poseen carácteres específicos de Doble Byte. Esto puede afectarnos a la hora de utilizar campos de tipo Char o Varchar, ya que un texto de 10 carácteres podría superar los 10 bytes, haciendo imposible la insercción del valor a la base de datos.<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="http://1.bp.blogspot.com/-IZ-tQobZ--c/UFyZwwN7tcI/AAAAAAAAAi4/bAda9qcP6iU/s1600/char_varchar_mysql.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="200" src="http://1.bp.blogspot.com/-IZ-tQobZ--c/UFyZwwN7tcI/AAAAAAAAAi4/bAda9qcP6iU/s200/char_varchar_mysql.jpg" width="200" /></a></div>
</div>
<div style="text-align: left;">
<br /></div>
Espero que lo disfruten, compartan y comenten. ;)
<br />
<br />
<div style="color: #741b47;">
<b>"Si se puede imaginar... se puede programar."</b><br />
<br />
<br /></div>
<div class="blogger-post-footer">“Primero resuelve el problema. Entonces, escribe el código.”
— John Johnson</div>Jairo Ortizhttp://www.blogger.com/profile/15511019924919091246noreply@blogger.com2tag:blogger.com,1999:blog-8899331477397536059.post-57082061723524597512012-09-21T10:54:00.002-05:002012-09-21T17:55:21.928-05:00Monitorear el rendimiento de SQL SERVER<br />
<br />
<div class="MsoNormal">
<div class="separator" style="clear: both; text-align: center;">
<a href="http://2.bp.blogspot.com/-_nh7exaieT4/UFyOHvuBY0I/AAAAAAAAAig/EEizsV6EcLA/s1600/2.0-BigSQLLogo.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" height="200" src="http://2.bp.blogspot.com/-_nh7exaieT4/UFyOHvuBY0I/AAAAAAAAAig/EEizsV6EcLA/s200/2.0-BigSQLLogo.png" width="181" /></a></div>
<b>SQL Server Profiler</b></div>
<div class="MsoListParagraphCxSpFirst" style="text-indent: -18pt;">
<span style="font-family: Symbol;">·<span style="font: 7pt "Times New Roman";"> </span></span>Muestra como SQL Server resuelve las queries internamente</div>
<div class="MsoListParagraphCxSpMiddle" style="text-indent: -18pt;">
<span style="font-family: Symbol;">·<span style="font: 7pt "Times New Roman";"> </span></span>Permite a los administradores ver como se ven las sentencias T-SQL y como el servidor regresa los resultados.</div>
<div class="MsoListParagraphCxSpMiddle" style="text-indent: -18pt;">
<span style="font-family: Symbol;">·<span style="font: 7pt "Times New Roman";"> </span></span>Se puede:</div>
<div class="MsoListParagraphCxSpMiddle" style="margin-left: 72pt; text-indent: -18pt;">
<span style="font-family: "Courier New";">o<span style="font: 7pt "Times New Roman";"> </span></span>Crear una traza basado en Templates</div>
<div class="MsoListParagraphCxSpMiddle" style="margin-left: 72pt; text-indent: -18pt;">
<span style="font-family: "Courier New";">o<span style="font: 7pt "Times New Roman";"> </span></span>Verificar los resultados de la traza</div>
<div class="MsoListParagraphCxSpMiddle" style="margin-left: 72pt; text-indent: -18pt;">
<span style="font-family: "Courier New";">o<span style="font: 7pt "Times New Roman";"> </span></span>Almacenar los resultados de la traza en un archivo o tabla</div>
<div class="MsoListParagraphCxSpLast" style="text-indent: -18pt;">
<span style="font-family: Symbol;">·<span style="font: 7pt "Times New Roman";"> </span></span>Capturar datos enviados al servidor que permite al programador verificar errores o datos incorrectos.</div>
<div class="MsoNormal">
<br /></div>
<div class="MsoNormal">
<b>Windows System Monitor</b></div>
<div class="MsoListParagraphCxSpFirst" style="text-indent: -18pt;">
<span style="font-family: Symbol;">·<span style="font: 7pt "Times New Roman";"> </span></span>Monitorear el uso de recursos.</div>
<div class="MsoListParagraphCxSpMiddle" style="text-indent: -18pt;">
<span style="font-family: Symbol;">·<span style="font: 7pt "Times New Roman";"> </span></span>System Monitor también llamado Performance Monitor.</div>
<div class="MsoListParagraphCxSpMiddle" style="text-indent: -18pt;">
<span style="font-family: Symbol;">·<span style="font: 7pt "Times New Roman";"> </span></span>Comparando SQL Server Profiler, este monitorea eventos del motor de base de datos, System Monitor monitorea el uso de recursos asociados con los procesos del servidor.</div>
<div class="MsoListParagraphCxSpLast" style="text-indent: -18pt;">
<span style="font-family: Symbol;">·<span style="font: 7pt "Times New Roman";"> </span></span>Se encuentra en el Panel de Control , Herramientas Administrativas, Monitor de rendimiento (en Español) o bien Performance Monitor.</div>
<div class="MsoNormal">
<br /></div>
<div class="MsoNormal">
<b>Activity Monitor</b></div>
<div class="MsoNormal">
Secciones:</div>
<div class="MsoListParagraphCxSpFirst" style="margin-left: 54pt; text-indent: -18pt;">
1.<span style="font: 7pt "Times New Roman";"> </span>Vista General - Muestra gráficamente el comportamiento del resto de secciones.</div>
<div class="MsoListParagraphCxSpMiddle" style="margin-left: 54pt; text-indent: -18pt;">
2.<span style="font: 7pt "Times New Roman";"> </span>Procesos – Muestra las actividades de los usuarios. Que usuario esta impactando en que base.</div>
<div class="MsoListParagraphCxSpMiddle" style="margin-left: 54pt; text-indent: -18pt;">
3.<span style="font: 7pt "Times New Roman";"> </span>Recursos en Espera - Espera el estado de la información. Que proceso está esperando un recurso.</div>
<div class="MsoListParagraphCxSpMiddle" style="margin-left: 54pt; text-indent: -18pt;">
4.<span style="font: 7pt "Times New Roman";"> </span>Data File I/O - Archivos de Data y Log con información I/O</div>
<div class="MsoListParagraphCxSpMiddle" style="margin-left: 54pt; text-indent: -18pt;">
5.<span style="font: 7pt "Times New Roman";"> </span>Queries utilizadas - Muestra las queries mas utilizadas recientemente.</div>
<div class="MsoListParagraphCxSpLast">
<br /></div>
<div class="MsoNormal">
<b>Transact-SQL</b></div>
<div class="MsoListParagraphCxSpFirst" style="margin-left: 53.4pt; text-indent: -18pt;">
<span style="font-family: Symbol;">·<span style="font: 7pt "Times New Roman";"> </span></span>sp<span lang="EN-US">_who </span></div>
<div class="MsoListParagraphCxSpMiddle" style="margin-left: 53.4pt; text-indent: -18pt;">
<span style="font-family: Symbol;">·<span style="font: 7pt "Times New Roman";"> </span></span>sp_lock</div>
<div class="MsoListParagraphCxSpMiddle" style="margin-left: 53.4pt; text-indent: -18pt;">
<span style="font-family: Symbol;">·<span style="font: 7pt "Times New Roman";"> </span></span>sp_spaceused</div>
<div class="MsoListParagraphCxSpLast" style="margin-left: 53.4pt; text-indent: -18pt;">
<span style="font-family: Symbol;">·<span style="font: 7pt "Times New Roman";"> </span></span>sp_monitor</div>
<div class="MsoNormal">
<br /></div>
<div class="MsoNormal">
<b>Windows Logs</b></div>
<div class="MsoListParagraphCxSpFirst" style="margin-left: 53.4pt; text-indent: -18pt;">
<span style="font-family: Symbol;">·<span style="font: 7pt "Times New Roman";"> </span></span>Aplicación Externa a SQL Server</div>
<div class="MsoListParagraphCxSpMiddle" style="margin-left: 53.4pt; text-indent: -18pt;">
<span style="font-family: Symbol;">·<span style="font: 7pt "Times New Roman";"> </span></span>Podremos ver advertencias o errores ocurridos en los procesos de SQL Server.</div>
<div class="MsoListParagraphCxSpLast" style="margin-left: 53.4pt; text-indent: -18pt;">
<span style="font-family: Symbol;">·<span style="font: 7pt "Times New Roman";"> </span></span>Se encuentra en el Panel de Control , Herramientas Administrativas, Visor de Eventos(en Español) o bien Events Log.</div>
<div class="MsoNormal">
<br /></div>
<div class="MsoNormal">
<b>Default Trace</b></div>
<div class="MsoListParagraphCxSpFirst" style="margin-left: 53.4pt; text-indent: -18pt;">
<span style="font-family: Symbol;">·<span style="font: 7pt "Times New Roman";"> </span></span>SQL Server “Caja Negra”</div>
<div class="MsoListParagraphCxSpLast" style="margin-left: 53.4pt; text-indent: -18pt;">
<span style="font-family: Symbol;">·<span style="font: 7pt "Times New Roman";"> </span></span>Para habilitarlo:</div>
<div class="MsoNormal" style="line-height: normal; margin-bottom: 0.0001pt; text-indent: 35.4pt;">
<span lang="EN-US" style="color: maroon; font-family: "Courier New"; font-size: 14pt;">sp_configure</span><span lang="EN-US" style="font-family: "Courier New"; font-size: 14pt;"> <span style="color: red;">'default trace enabled'</span><span style="color: grey;">,</span> 1</span></div>
<div class="MsoNormal" style="text-indent: 35.4pt;">
<span style="color: blue; font-family: "Courier New"; font-size: 14pt; line-height: 115%;">RECONFIGURE</span></div>
<div class="MsoListParagraphCxSpFirst" style="margin-left: 53.4pt; text-indent: -18pt;">
<span style="font-family: Symbol;">·<span style="font: 7pt "Times New Roman";"> </span></span>El trace que se creara por defecto será en la ruta donde esté instalado SQL Server. </div>
<div class="MsoListParagraphCxSpMiddle" style="margin-left: 53.4pt;">
<span lang="EN-US">C:\Program Files\Microsoft SQL Server\MSSQL10.MSSQLSERVER\MSSQL\Log</span></div>
<div class="MsoListParagraphCxSpLast" style="margin-left: 53.4pt; text-indent: -18pt;">
<span style="font-family: Symbol;">·<span style="font: 7pt "Times New Roman";"> </span></span>Buscamos el archivo de traza con extension .trc generado.</div>
<br />
Fuente:<br />
<a href="http://www.bernardorobelo.com/2011/03/full-text-search.html" rel="nofollow" target="_blank">Blog de Bernardo Robelo</a><br />
<br />
<br />
Espero que lo disfruten, compartan y comenten. ;)
<br />
<br />
<div style="color: #741b47;">
<b>"Si se puede imaginar... se puede programar."</b></div>
<div class="blogger-post-footer">“Primero resuelve el problema. Entonces, escribe el código.”
— John Johnson</div>Jairo Ortizhttp://www.blogger.com/profile/15511019924919091246noreply@blogger.com0tag:blogger.com,1999:blog-8899331477397536059.post-56987365196128226082012-09-20T11:38:00.001-05:002012-09-21T17:52:07.619-05:00Verificar url o archivos remotos<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="http://3.bp.blogspot.com/-R2D0FTR0n1Y/UFtGw_jUTtI/AAAAAAAAAiI/A4LtEMdii8Y/s1600/verificarPaginaWeb.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" height="146" src="http://3.bp.blogspot.com/-R2D0FTR0n1Y/UFtGw_jUTtI/AAAAAAAAAiI/A4LtEMdii8Y/s200/verificarPaginaWeb.png" width="200" /></a></div>
<br />
<br />
Trabajando en uno de los proyectos para la empresa donde laboro, me surgió la necesidad de verificar si un archivo existía teniendo solo su url, fue aquí donde comencé a investigar junto con mi amigo <a href="https://www.facebook.com/edwin.y.cantillo" rel="nofollow" target="_blank">Edwin Rincon</a> y encontramos una solución muy buena la cual les voy a compartir a continuación.<br />
<br />
Pueden utilizar este método para comprobar que sus paginas web están funcionando de forma correcta o usarlo para comprobar links suministrados por otros usuarios, en fin, lo pueden usar para lo que necesiten.<br />
<br />
Este método recibe 2 parámetros:<br />
<br />
El primero es la url que se desea comprobar y el segundo es la cantidad de tiempo máximo que queremos que espere por una respuesta, vale aclarar que el tiempo lo damos en milisegundos, quiere decir que un segundo equivale a 1000 milisegundos, en este caso he colocado que espere solo 3 segundos, si en ese tiempo no recibo una respuesta por parte del servidor remoto entonces asumo que la url no existe, ustedes pueden poner el tiempo que quieran. <br />
<br />
<br />
<pre class="brush: csharp">public static bool RemoteFileExists(string url, int timeout)
{
try
{
HttpWebRequest request = WebRequest.Create(url) as HttpWebRequest;
// El timeout es en milisegundos
request.Timeout = timeout;
// ************
//Configurando el Request method HEAD, puede ser GET tambien.
request.Method = "HEAD";
//Obteniendo la respuesta
HttpWebResponse response = request.GetResponse() as HttpWebResponse;
//Regresa TRUE si el codigo de esdado es == 200
return (response.StatusCode == HttpStatusCode.OK);
}
catch
{
//Si ocurre una excepcion devuelve false
return false;
}
}</pre>
Esto nos sirve para verificar si un website esta funcionando o una pagina existe o para verificar archivos remotos, en mi caso la he usado para saber si una foto existe en un website.<br />
<br />
Les dejo un proyecto de ejemplo para verificar paginas o archivos remotos: <br />
<a href="https://sites.google.com/site/csharpalextremo/home/descargas/Verificar%20url%20o%20archivos%20remotos.rar?attredirects=0&d=1" target="_blank">Descargar Aquí.</a> <br />
<br />
<br />
Espero que lo disfruten, compartan y comenten. ;)
<br />
<br />
<div style="color: #741b47;">
<b>"Si se puede imaginar... se puede programar."</b><br />
<br /></div>
<div class="blogger-post-footer">“Primero resuelve el problema. Entonces, escribe el código.”
— John Johnson</div>Jairo Ortizhttp://www.blogger.com/profile/15511019924919091246noreply@blogger.com0tag:blogger.com,1999:blog-8899331477397536059.post-47377169626778204162012-09-14T18:15:00.000-05:002012-09-14T18:15:00.404-05:00Visual studio 2012: Lanzamiento<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="http://1.bp.blogspot.com/-YSdUn0_OVXw/UFO5KvelycI/AAAAAAAAAhE/knBB363j9Pw/s1600/visual+studio.jpg" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" height="150" src="http://1.bp.blogspot.com/-YSdUn0_OVXw/UFO5KvelycI/AAAAAAAAAhE/knBB363j9Pw/s200/visual+studio.jpg" width="200" /></a></div>
El miércoles 12 de septiembre de 2012 Microsoft <a href="http://www.microsoft.com/visualstudio/esn/launch-day" rel="nofollow" target="_blank">lanzo</a> la nueva versión de la herramienta de desarrollo mas robusta, fácil y útil que puede existir, se trata de visual studio 2012 el cual ha cambiado un poco su apariencia física y su logo, ya no es el azul que estábamos acostumbrados a ver en la versión de visual studio 2010, ahora tiene un gris pálido (un poco feo en mi opinión) el cual regulan con azul que se deja ver de vez en cuando, aunque para aquellos desarrolladores medio góticos o emos, si van [Herramientas - Opciones] pueden cambiar por un tema Dark.<br />
<br />
Pero mas allá de los cambios en la apariencia visual studio ha sufrido cambios importantes ya que ha agregado mejoras para linq, expresiones lambda, aplicaciones para WIN8 y el nuevo <a href="http://www.microsoft.com/es-es/download/details.aspx?id=29909" rel="nofollow" target="_blank">Framework 4.5</a>.<br />
<br />
<br />
Lo que mas me ha gustado es que es muy rápido y con solo dar clic sobre un aspx se mostrara estilo de un preview donde puedes ver todo el código html y editarlo.<br />
A Continuación listare algunas de las mejoras de VS 2012:<br />
<br />
<br />
<br />
<strong>Características de Visual Studio 2012 : </strong><br />
1 – Desarrollo innovador de aplicaciones<br />
2 – Gestión moderna del ciclo de vida de las aplicaciones<br />
3 – Posee herramientas para una planificación y gestión de proyectos ágil, que mantienen a los equipos alineados e informados.<br />
4 – También tiene herramientas y flujos de trabajo para romper las barreras en la integración funcional y de equipos de trabajo.<br />
<br />
<br />
<strong>Características <a href="http://www.microsoft.com/es-es/download/details.aspx?id=29909" target="_blank">.NET Framework 4.5:</a></strong><br />
<br />
<div style="text-align: left;">
- Proporciona a los desarrolladores una forma rica y productiva de
crear aplicaciones en el cliente (Windows Forms, WPF, Windows 8 Store
Apps), on premise (Windows Server) y en la nube (Windows Azure).</div>
<div style="text-align: left;">
<br /></div>
<div style="text-align: left;">
- Sus nuevas capacidades incluyen mejoras de rendimiento y la
posibilidad de hacer más sencilla la programación asincrónica y
paralela. Además, ofrece funcionalidad de .NET y XAML para Windows 8
Store Apps.</div>
<div style="text-align: left;">
<br /></div>
<div style="text-align: left;">
- .NET Framework 4.5 en el servidor también proporciona ASP.NET, WIF
(Windows Identity Foundation), Entity Framework y WCF (Windows
Communication Foundation). Asimismo, para la nube, Windows Azure
proporciona soporte completo para desarrollo .NET con Windows Azure SDK
para .NET.</div>
<br />
<br />
Muy pronto les estare hablando mas de mi experiencia con este nuevo VIsual Studio.<br /><br />
<div class="separator" style="clear: both; text-align: center;">
<a href="http://2.bp.blogspot.com/-QBXl4uZrKXM/UFO48pax2oI/AAAAAAAAAg8/OaGY5STRn9k/s1600/Visual-Studio-2012-descargar.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="220" src="http://2.bp.blogspot.com/-QBXl4uZrKXM/UFO48pax2oI/AAAAAAAAAg8/OaGY5STRn9k/s320/Visual-Studio-2012-descargar.png" width="320" /></a></div>
<br />
<br />
Espero que lo disfruten, compartan y comenten. ;)
<br />
<br />
<div style="color: #741b47;">
<b>"Si se puede imaginar... se puede programar."</b></div>
<div class="blogger-post-footer">“Primero resuelve el problema. Entonces, escribe el código.”
— John Johnson</div>Jairo Ortizhttp://www.blogger.com/profile/15511019924919091246noreply@blogger.com0