Para controlar el anidamiento de SQL server podemos usar la variable
@@NESTLEVEL
MSDN
Ejemplo de uso, muy útil Ejemplo
domingo, 26 de mayo de 2013
domingo, 12 de mayo de 2013
The "GenerateResource" task failed unexpectedly.
Este ha sido un error, raro.
Una solución con dos proyectos: un proyecto de escritorio y una dll .net 2010 , Vb .net, framework 4
Cuando compilaba, algunas veces (no siempre) daba un error
The "GenerateResource" task failed unexpectedly
Para solucionarlo abría un par de formularios, limpiaba la solución y generaba y compilaba.
Esto es "pasable" si solo lo tengo que hacer una vez, pero no era mi caso. Buscando encontré una solución que me valía :
Modificar (con el bloc de notas) el fichero .vbproj y añadir
<generateresourceneverlocktypeassemblies>true</generateresourceneverlocktypeassemblies>
Ejemplo
<Code>
<project defaulttargets="Build" toolsversion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<propertygroup>
<generateresourceneverlocktypeassemblies>true</generateresourceneverlocktypeassemblies>
</propertygroup>
</code>
Un error similar con una explicación y solución diferente
Una solución con dos proyectos: un proyecto de escritorio y una dll .net 2010 , Vb .net, framework 4
Cuando compilaba, algunas veces (no siempre) daba un error
The "GenerateResource" task failed unexpectedly
Para solucionarlo abría un par de formularios, limpiaba la solución y generaba y compilaba.
Esto es "pasable" si solo lo tengo que hacer una vez, pero no era mi caso. Buscando encontré una solución que me valía :
Modificar (con el bloc de notas) el fichero .vbproj y añadir
<generateresourceneverlocktypeassemblies>true</generateresourceneverlocktypeassemblies>
Ejemplo
<propertygroup>
<generateresourceneverlocktypeassemblies>true</generateresourceneverlocktypeassemblies>
</propertygroup>
Un error similar con una explicación y solución diferente
martes, 16 de abril de 2013
Curiseando Dispose & Finalize
Hoy mirando el código de otro (lo juro
) tenía una cosa como está
La pregunta de hoy es: qué valor tiene aux.NewProperty y aux.OtraPropiedad?.
Para dar alguna pista (o confundir más al lector) dejo la clase :

Ya puestos en la “funcion” he puesto un código que no “vale para nada”, solo para ver que realmente se usan punteros aunque no lo veamos

En C# funciona exactamente igual
) tenía una cosa como estáPrivate Sub Button3_Click(sender As System.Object, e As System.EventArgs) Handles Button3.Click
Dim aux As MiClase
aux = funcion()
MessageBox.Show(aux.NewProperty)
MessageBox.Show(aux.OtraPropiedad)
End Sub
Public Function funcion() As MiClase
Dim oRet As MiClase = New MiClase()
Dim oRet2 As MiClase = oRet
Try
oRet.NewProperty = "otro valor"
Return oRet
Catch ex As Exception
Return Nothing
Finally
oRet.Dispose()
oRet = Nothing
End Try
End Function
Yo, que mi orígenes fueron el c y el c++ (no todo tiempo pasado fue mejor), siempre entiendo que el “dispose” libera todos objetos de la clase . Por supuesto sé que el Finally se ejecuta.Dim aux As MiClase
aux = funcion()
MessageBox.Show(aux.NewProperty)
MessageBox.Show(aux.OtraPropiedad)
End Sub
Public Function funcion() As MiClase
Dim oRet As MiClase = New MiClase()
Dim oRet2 As MiClase = oRet
Try
oRet.NewProperty = "otro valor"
Return oRet
Catch ex As Exception
Return Nothing
Finally
oRet.Dispose()
oRet = Nothing
End Try
End Function
La pregunta de hoy es: qué valor tiene aux.NewProperty y aux.OtraPropiedad?.
Para dar alguna pista (o confundir más al lector) dejo la clase :
Public Class MiClase
Private newPropertyValue As String
Private _otraPropiedad As String
Public Property OtraPropiedad() As String
Get
Return _otraPropiedad
End Get
Set(ByVal value As String)
_otraPropiedad = value
End Set
End Property
Public Property NewProperty() As String
Get
Return newPropertyValue
End Get
Set(ByVal value As String)
newPropertyValue = value
End Set
End Property
Public Sub New()
newPropertyValue = "mi valor"
_otraPropiedad = "mi 2 valor"
End Sub
Public Sub Dispose()
_otraPropiedad = String.Empty
End Sub
End Class
La respuesta es: aux tiene valor. El return de la función ha retornado el puntero y la memoria realmente no se ha liberado. Dejo la captura del debug. Private newPropertyValue As String
Private _otraPropiedad As String
Public Property OtraPropiedad() As String
Get
Return _otraPropiedad
End Get
Set(ByVal value As String)
_otraPropiedad = value
End Set
End Property
Public Property NewProperty() As String
Get
Return newPropertyValue
End Get
Set(ByVal value As String)
newPropertyValue = value
End Set
End Property
Public Sub New()
newPropertyValue = "mi valor"
_otraPropiedad = "mi 2 valor"
End Sub
Public Sub Dispose()
_otraPropiedad = String.Empty
End Sub
End Class

Ya puestos en la “funcion” he puesto un código que no “vale para nada”, solo para ver que realmente se usan punteros aunque no lo veamos
Dim oRet2 As MiClase = oRet
La pregunta es : ¿qué vale oRet2 después de ejecutar oRet = Nothing?. Le pasa exatamente lo mismo que al aux: todo son punteros
En C# funciona exactamente igual
miércoles, 3 de abril de 2013
IIF VB .net
Un programador C .net puede pensar que la instrucción iif de vb es equivalente al operador de compración ?
Una sorpresa: ¿que crees que saldrá en el MessageBox?
Dim total As Integer = 0
Private Sub Button2_Click(sender As System.Object, e As System.EventArgs) Handles Button2.Click
Dim a As Integer = 1
Dim b As Integer = 2
Dim c As Boolean = IIf(a = b, funcion1("b"), funcion2("1"))
MessageBox.Show(total)
End Sub
Public Function funcion1(ByVal valor As String) As Boolean
total = total + 1
Return True
End Function
Public Function funcion2(ByVal valor As String) As Boolean
total = total + 1
Return True
End Function
2 Private Sub Button2_Click(sender As System.Object, e As System.EventArgs) Handles Button2.Click
Dim a As Integer = 1
Dim b As Integer = 2
Dim c As Boolean = IIf(a = b, funcion1("b"), funcion2("1"))
MessageBox.Show(total)
End Sub
Public Function funcion1(ByVal valor As String) As Boolean
total = total + 1
Return True
End Function
Public Function funcion2(ByVal valor As String) As Boolean
total = total + 1
Return True
End Function
Imagina que hicieras otra cosa:, consultas a base de datos, mostrar MessageBox , como ejecuta las dos funciones si una de ellas da Exception aunque nunca se cumpliera la condición para su llamada fallaría…Y resulta que está documentado http://msdn.microsoft.com/es-es/library/27ydhh0d%28v=vs.80%29.aspx
“El IIF evalúa el código a ejecutar (tanto si la condición es verdadera o falsa) antes de ejecutarlo (esto no sé si es fallo de MS o es intencional). El problema que podemos encontrar con esto es que hay que asegurarse que las sentencias a ejecutar sean válidas en todas las condiciones, si no tendremos un excepción.”
Si tienes curiosidad C#, hace lo que esperas (o por lo menos lo que yo esero: el valor de total es 1
.png)
int total = 0;
private void button1_Click(object sender, EventArgs e)
{
int a = 1;
int b = 2;
bool c = (a == b ? funcion1("b") : funcion2("1"));
MessageBox.Show(total.ToString());
}
private bool funcion1(String valor)
{
total = total + 1;
return true;
}
private bool funcion2(String valor)
{
total = total + 1;
return true;
}
private void button1_Click(object sender, EventArgs e)
{
int a = 1;
int b = 2;
bool c = (a == b ? funcion1("b") : funcion2("1"));
MessageBox.Show(total.ToString());
}
private bool funcion1(String valor)
{
total = total + 1;
return true;
}
private bool funcion2(String valor)
{
total = total + 1;
return true;
}
domingo, 31 de marzo de 2013
Indices base datos
El minuto de hoy: Tengo una consulta que tarda más de 3min. Ejecutando el plan de ejecución me dice que debería tener un índice más (hasta aquí todo normal).
Cuando veo el índice que me sugiere :

Vaya hasta el momento (para mi) un índice era un conjunto de columnas. Resulta que ya no es así
existe el crear índices con columnas incluidas
MSDN
Por cierto con el índice la consulta mejoro en más de un 50% el tiempo
Cuando veo el índice que me sugiere :
CREATE NONCLUSTERED INDEX [miindice]
ON [dbo].[mitabla] ([codigo],[nombre])
INCLUDE ([fecha], [cantidad])
Qué es esto?? ON [dbo].[mitabla] ([codigo],[nombre])
INCLUDE ([fecha], [cantidad])
Vaya hasta el momento (para mi) un índice era un conjunto de columnas. Resulta que ya no es así
existe el crear índices con columnas incluidas
MSDN
Por cierto con el índice la consulta mejoro en más de un 50% el tiempo
jueves, 21 de marzo de 2013
Servidores Vinculados SQLServer
Bueno últimamente nos ha tocado trabajar con servidores vinculados
Ambos servidores se ven:
En servidor1 está mibase1 donde esta mitabla1 con su columna nombredoc1 --> no es case-sensitive
En servidor2 está mibase2 donde esta mitabla2 con su columna nombredoc2 --> es case-sensitive
Si en servidor1 ejecuto
Lo ha configurado para que sea case-sensitive hasta el nombre de las columnas!!!!
La configuración es importante, pero si lo pones a nivel de estructura mira las implicaciones (sobre todo en una migración)
Pregunta es ¿Si se puede tener la BD definida como case sensible y consultas NO?
Respuesta es : hay que crear la BD como case no sensible y tablas columnas como sensibles
http://msdn.microsoft.com/en-us/library/ms143508(v=sql.105).aspx
SQL Server 2008 supports setting collations at the following levels:
• Server
• Database
• Column
• Expression
http://msdn.microsoft.com/en-us/library/ms187053(v=sql.90).aspx
Parameters for stored procedures or functions, alias data types, and variables are assigned the default collation of the database. To change the collation of an alias type, you must drop and re-create it.
Servidor 2
Las soluciones posibles :
- mejorar las estructura de la consulta, (índices, openquery)
- replicar la base de datos Replicar las base de datos ( http://www.sqlservercentral.com/articles/Linked+Server/62246/)
La "chapu" para cuando vas fatal de tiempo es aumentar el tiempo de time-out de las consultas de tu código

Ambos servidores se ven:
En servidor1 está mibase1 donde esta mitabla1 con su columna nombredoc1 --> no es case-sensitive
En servidor2 está mibase2 donde esta mitabla2 con su columna nombredoc2 --> es case-sensitive
Si en servidor1 ejecuto
select top 1 NOMBREDOC2 from servidor2. mibase2 .dbo. mitabla2 --> ok
select top 1 nombredoc2 from servidor2. mibase2.dbo. mitabla2 --> ok
Si en servidor2 hago select top 1 nombredoc2 from servidor2. mibase2.dbo. mitabla2 --> ok
select top 1 NOMBREDOC1 from servidor1. Mibase1 .dbo. mitabla1 --> error
select top 1 nombredoc1 from servidor1. Mibase1.dbo. mitabla1--> ok
select top 1 nombredoc1 from servidor1. Mibase1.dbo. mitabla1--> ok
Lo ha configurado para que sea case-sensitive hasta el nombre de las columnas!!!!
La configuración es importante, pero si lo pones a nivel de estructura mira las implicaciones (sobre todo en una migración)
Pregunta es ¿Si se puede tener la BD definida como case sensible y consultas NO?
Respuesta es : hay que crear la BD como case no sensible y tablas columnas como sensibles
http://msdn.microsoft.com/en-us/library/ms143508(v=sql.105).aspx
SQL Server 2008 supports setting collations at the following levels:
• Server
• Database
• Column
• Expression
http://msdn.microsoft.com/en-us/library/ms187053(v=sql.90).aspx
Parameters for stored procedures or functions, alias data types, and variables are assigned the default collation of the database. To change the collation of an alias type, you must drop and re-create it.
Problemas de rendimiento
Servidor 2
select distinct a.fecha , a.nif ,
b.nombre from basedatos2.dbo.tabla2 a ,servidor1.base1.dbo.tabla1 b
where a.nif = b.nif and a.fecha = '08/10/2012' order by b.nombre asc --> 6sg
Servidor 1b.nombre from basedatos2.dbo.tabla2 a ,servidor1.base1.dbo.tabla1 b
where a.nif = b.nif and a.fecha = '08/10/2012' order by b.nombre asc --> 6sg
select distinct a.fecha , a.nif ,
b.nombre from servidor2.basedatos2.dbo.tabla2 a , base1.dbo.tabla1 b
where a.nif = b.nif and a.fecha = '08/10/2012' order by b.nombre asc --> IMEDIATO
Para que vaya rápido en el servidor2 b.nombre from servidor2.basedatos2.dbo.tabla2 a , base1.dbo.tabla1 b
where a.nif = b.nif and a.fecha = '08/10/2012' order by b.nombre asc --> IMEDIATO
select distinct a.fecha , a.nif ,
b.nombre from basedatos2.dbo.tabla2 a , openquery(servidor1, 'select * from base1.dbo.tabla1') b
where a.nif = b.nif and a.fecha = '08/10/2012' order by b.nombre asc -->INMEDIATO
b.nombre from basedatos2.dbo.tabla2 a , openquery(servidor1, 'select * from base1.dbo.tabla1') b
where a.nif = b.nif and a.fecha = '08/10/2012' order by b.nombre asc -->INMEDIATO
Las soluciones posibles :
- mejorar las estructura de la consulta, (índices, openquery)
- replicar la base de datos Replicar las base de datos ( http://www.sqlservercentral.com/articles/Linked+Server/62246/)
La "chapu" para cuando vas fatal de tiempo es aumentar el tiempo de time-out de las consultas de tu código
domingo, 10 de marzo de 2013
Informes, reports..
Lo reconozco odio hacer informes, me da igual el método
Hoy tenía 5min de descanso y he visto un link muy interesante
Generar archivos Excel como un señor con ClosedXml
Yo también lo reconozco en modo web también he cambiado el content-type
Para generar Word en el CodePlex Docx
Hace algunos años (más de 3) estos link me salvaron de un apuro
http://www.codeproject.com/KB/reporting-services/Reporting_ServicesByalifaraze.aspx
Para exportar a Word el report
http://www.codeproject.com/KB/reporting-services/report-viewer-hack.aspx
Localizador o multidioma en los report generados con el .net
http://www.codeproject.com/KB/aspnet/RDLC_Localization.aspx
Este link genial, uno se da cuenta lo que desconoce el office, lo reconozco es una locura, pero funciona.
Resumen: creas lo objetos, con ellos obtienes el xsd para asociar al word. Hasta imágenes inserte en su día
http://www.codeproject.com/Articles/20287/Generating-Word-Reports-Documents
Más info
http://sophinet.wordpress.com/2011/03/10/open-xml/
Por si no lo sabes el Open Office no deja de ser un fichero comprimido. Apuesto que alguno no se lo cree…
Haz la prueba:
- Guarda un documento (me da igual Word o Excel, con la extensión .docx o .xlsx)
- Cambia la extensión por .zip
- Luego dar a ver que hay dentro.
Suscribirse a:
Entradas (Atom)