sábado, 18 de enero de 2014

Parámetros opcionales y sus problemas



Vale culpa mía, tengo mucha tendencia a usar parámetros opcionales. Y para intentar arreglar un problema de otra cosa, en una dll puse uno, está dll se usa en mucho proyectos.

El problema, que si se compila nuevamente el proyecto que lo usa no hay problema, pero si otra dll lo usa da problemas en ejecución.

La explicación no puede estar más claro que en este link
http://www.variablenotfound.com/2010/05/parametros-opcionales-usense-con.html

jueves, 2 de enero de 2014

Cookies


Después de mirar, mucho esta el tema de las cookies, en realidad no creo que alguien que tenga un blog, sin publicidad y que únicamente usa el Google Analytics para ver quien usa el blog, debamos cumplir con esta exigencia. Pero como pueden resultar contradictoria la información, veamos como curarnos en salud

http://www.doctormetrics.com/2012/06/13/cumplir-ley-cookies-google-analytics/#.UsWcnbTJKQQ

http://nuriagarciacastro.es/guia-legal-del-blog-v-el-caso-de-google-analytics/

He modificado mi aviso:
Por : http://www.focoblogger.com/2014/02/implementar-aviso-de-cookies-en-blogger.html

Es lo mismo pero de distinta forma.

El año pasado tenia este aviso
En la plantilla del blog, añade un Gadget HTML/Javascript

Copiar el código que te da http://sitebeam.net/cookieconsent/code/

El mio está copiado de alli directamente (más o menos)


<!-- Begin Cookie Consent plugin by Silktide - http://silktide.com/cookieconsent -->
<link rel="stylesheet" type="text/css" href="http://assets.cookieconsent.silktide.com/current/style.min.css"/>
<script type="text/javascript" src="http://assets.cookieconsent.silktide.com/current/plugin.min.js"></script>
<script type="text/javascript">
// <![CDATA[
cc.initialise({
            cookies: {
                        analytics: {}
            }

});
// ]]>
</script>
<!-- End Cookie Consent plugin -->

lunes, 4 de noviembre de 2013

Serializar un objeto .net

Serializar un objeto


1. Objeto a xml


Private Function CrearXMLDesdeObj(ByVal objClase As MiClase) As XmlDocument
Dim oXmlDocument As XmlDocument = New XmlDocument()
Dim oXmlSerializer As XmlSerializer = New XmlSerializer(objClase.GetType())
Dim oStringBuilder As StringBuilder = New StringBuilder()
Dim oStringWriter As StringWriterWithEncoding = New StringWriterWithEncoding(oStringBuilder, Encoding.UTF8)
oXmlSerializer.Serialize(oStringWriter, objClase )
oXmlDocument.LoadXml(oStringBuilder.ToString())
Return oXmlDocument
End Function

2. Quitar elemento vacíos


Serializar si no se quieren cosas raras, es muy fácil. El problema es cuando por ejemplo no quieren que salga la etiqueta cuando el valor es null, y por supuesto no se quiere poner la propiedad nulable. Aqui una funcion que borra esos elmentos.

Cuando se pone IsNullable = true si el valor es null se serializa


Public Function EliminarNullElementsFromXML(ByVal oXmlDocument As XmlDocument) As XmlDocument
Dim oXmlDeclaration As XmlDeclaration = CType(oXmlDocument.FirstChild, XmlDeclaration)
Dim oXDocument As XDocument = XDocument.Parse(oXmlDocument.OuterXml)
Dim oXElements As IEnumerable(Of XElement) = oXDocument.Descendants()
Dim oXElementsDelete As List(Of XElement) = New List(Of XElement)
Dim elem_list As IEnumerable(Of XElement) = From elem In oXElements Select elem
For Each element As XElement In elem_list
If (element.IsEmpty) Then
oXElementsDelete.Add(element)
End If
Next
oXElementsDelete.Remove()
oXmlDocument.LoadXml(oXDocument.ToString(SaveOptions.DisableFormatting))
oXmlDocument.InsertBefore(oXmlDeclaration, oXmlDocument.FirstChild)
Return oXmlDocument
End Function


3. Serializar Bool que pueden ser null

[Serializable]
public class Foo
{
[XmlIgnore]
public bool? Bar { get; set; }

[XmlAttribute("Bar")]
[EditorBrowsable(EditorBrowsableState.Never)]
public string xmlBar
{
get { return Bar.ToString(); }
set
{
if (string.IsNullOrEmpty(value)) Bar = null;
else Bar = bool.Parse(value);
}
}
}

4. Quitar los elementos vacios.

La funcion CleanEmptyTags, quita los elementos vacios , si la propiedad es un string tendrias varios

Public Class UtilXml

Public Shared Function Serialize(ByVal objectToSerialize As Object) As String
Dim oXmlDocument As XmlDocument = New XmlDocument()
Dim oXmlSerializer As XmlSerializer = New XmlSerializer(objectToSerialize.GetType())
Dim oStringBuilder As StringBuilder = New StringBuilder()
Dim oStringWriter As StringWriterWithEncoding = New StringWriterWithEncoding(oStringBuilder, Encoding.UTF8)
oXmlSerializer.Serialize(oStringWriter, objectToSerialize)
Return (CleanEmptyTags(oStringWriter.GetStringBuilder().ToString()))
End Function


Private Shared Function CleanEmptyTags(ByVal xml As String) As String
Dim regex As RegularExpressions.Regex = New RegularExpressions.Regex("(\s)*<(\w)*(\s)*/>")
Return regex.Replace(xml, String.Empty)
Return xml
End Function
End Class

martes, 29 de octubre de 2013

Sql Server int / int = ?

Esto es parecido a otra entrada de la sum

Tenemos lo siguiente

declare @p1 as integer
declare @p2 as integer
set @p1 = 12
set @p2 =10000
print @p1/@p2
Salida = 0

declare @p1 as integer
declare @p2 as decimal(16,2)
set @p1 = 12
set @p2 =10000
print @p1/@p2

Salida = 0.00120000000000000

Alguno estará diciendo que es obvio, pero os puedo asegurar que no siempre lo es.

martes, 17 de septiembre de 2013

Google nos hizo vagos….


Ya nadie se preocupa de escribir bien en un campo de búsqueda, sabemos que google lo hara.


Es difícil explicar al cliente que no somos Google y que eso lleva más trabajo de lo que cree, por muy fácil que Google lo haga.

Bueno pongamos a ello, vamos a darle al cliente lo que quiere (bueno más o menos)
  1. Saber cómo funciona las búsquedas, algo más que "like "
  2. Realizar búsquedas de palabras fonéticamente similares Soundex ()
  3. freetext 
  4. Problemas del freetext
  5. Si no estamos hablando de algo sencillo como un directorio de personas, no descartes el Lucene lo hay en .net buen artículo en dotnetslackers.com en
Con esto podrías intentar luego hacer las búsquedas para usuarios "vagos" (todos).

domingo, 1 de septiembre de 2013

Sum() & Sql Server

Curioseando, esto pasa en SqlServer no sé si con otros pasa (puedo asegurar que con Informix no pasa)

Ejemplo
SELECT SUM(precio) FROM libros

Error ->Mens. 8115, Nivel 16, Estado 2, Línea 1
Error de desbordamiento aritmético al convertir expresión al tipo de datos int.


Explicación

sum(column1) throws "Arithmetic overflow error"
sum() adopts the data type of the column type, so cast the column within the sum expression:

Genial usa el tipo de la columna, que en mi caso era un int


Solución
SELECT SUM( cast ( precio as bigint) ) FROM libros


martes, 27 de agosto de 2013

ADODB.Recordset está cerrado después de llamar a un sp

La chorrada de hoy me ha llevado, más de 3horas.

Situación:
- Un procedimiento que funciona en el SQL Server Management, con parámetros de entrada y recordset de salida. El SP hacia un insert y retornaba un recordset (hacia más cosas, esto es para resumir :P)
- Código Vb6, cuando ejecutaba el código y quería ver el contenido del recordset, el VB6 me daba un error de “La operación no está permitida si el objeto está cerrado.”
- El SP se había ejecutado porque tenía un registro más.

Di por supuesto que el problema estaba en como hacia la llamada al SP desde Vb6 (el SP funcionaba bien, se había ejecutado). Después de hacer un poco de I (sin +D porque desarrollo cero) pregunte a expertos en VB6 mayores que yo y nada.

La solución fue:
Añadiren el SP SET NOCOUNT ON al comienzo del código y SET NOCOUNT OFF justo antes de devolver los resultados finales

Si el procedimiento envía varios mensajes al cliente, el resulset no los procesa adecuadamente y suele dar ese mensaje de error.

La solución gracias a:
http://microsoft.public.es.sqlserver.narkive.com/fNVcXJuO/modo-correcto-de-ejecutar-sp

Por si alguno le interesa:
Llamar con command

A mí me valía con

Dim cSql as String
Dim cSql = " execute miProceimiento ‘parametro1’, ‘parametro2’ "
Set rst = New ADODB.Recordset
rst.Open cSql, gConexion, adOpenForwardOnly, adLockReadOnly
If Not rst.EOF Then

End if