viernes, 28 de marzo de 2014

vb. olist.ForEach

La chorra del dia de hoy , situación .net vb.



Public Class miclase
    Private m_visible As Boolean
    Public Property EsVisible() As Boolean
        Get
            Return m_visible
        End Get
        Set(ByVal value As Boolean)
            m_visible = value
        End Set
    End Property
End Class
Dim olist As List(Of miclase) = Rellenarlista()
'La lista se rellena con elementos todos con EsVisible =True
'---Desde debug olist (0).EsVisible =True
'Quiero que todos se pongan con EsVisible =False
olist.ForEach(Function(x) x.EsVisible = False)
'---Desde debug olist (0).EsVisible =True otra Vez


Por qué??


No hay forma de llamar a property x.EsVisible(False). VB no está distinguiendo entre el = de comparación y el de asignación.
Pero hay una solución :


olist.ForEach(Sub(x) x.EsVisible = False)


Con esto ya funciona como queria

viernes, 21 de marzo de 2014

CommandType.Text & @@NESTLEVEL

Bueno, me ha llevado un rato encontrar la solución (los problemas salen solos)
Situación:
  • Tenía dos procedimientos, uno llamaba al otro los dos retornaba un valor. En el segundo controlaba el @@NESTLEVEL para que al llamar al primero el resultado fuera el suyo y no el del segundo.
  • Por supuesto el server management funcionaba todo correctamente
  • Cuando lo ejecutaba por código, al llamar solo al segundo el @@NESTLEVEL tenía como valor 3 y no lo entendía

Mi problema estaba en como se hacía la consulta por código y el problema estaba aquí. Cuando llamas a un procedimiento usando CommandType.Text y asociando parámetros el @@NESTLEVEL es 3 : documentación del SQLServer lo dice “sp_executesql, el valor devuelto es 2 +”

Por si lo quieres probar
SQL Server
CREATE PROCEDURE [dbo].[usp_InnerProc] @miparametro INT AS
    SELECT @@NESTLEVEL AS 'Inner Level'; 

  Codigo 


    Dim connectionString, sServidor, sBase, cUsuario, cPassword As String
        connectionString = "data source = " & sServidor & "; initial catalog = " & sBase & "; user id = " & cUsuario & "; password = " & cPassword & ";"

        Dim cad1 As String
        Dim cad2 As String
        Dim cad3 As String
        Using connection As New SqlClient.SqlConnection(connectionString)
            connection.Open()
            Dim command As SqlCommand = New SqlCommand("", connection)
            Dim drDatosSql As SqlClient.SqlDataReader
            command.CommandText = "usp_InnerProc 1 "
            command.CommandType = CommandType.Text
            drDatosSql = command.ExecuteReader()
            drDatosSql.Read()
            cad1 = drDatosSql.GetValue(0)
            command.Dispose()
            drDatosSql.Close()
            ' cad =1

            Dim command2 As SqlCommand = New SqlCommand("", connection)
            Dim drDatosSql2 As SqlClient.SqlDataReader
            command2.CommandText = "usp_InnerProc"
            command2.CommandType = CommandType.StoredProcedure
            Dim idParam As SqlParameter = New SqlParameter("@miparametro", SqlDbType.Int) With {.Value = 1}
            command2.Parameters.Add(idParam)
            drDatosSql2 = command2.ExecuteReader()
            drDatosSql2.Read()
            cad2 = drDatosSql2.GetValue(0)
            drDatosSql2.Close()
            ' cad2 =1

            Dim command3 As SqlCommand = New SqlCommand("", connection)
            Dim drDatosSql3 As SqlClient.SqlDataReader
            command3.CommandText = "usp_InnerProc @miparametro"
            command3.CommandType = CommandType.Text
            Dim idParam3 As SqlParameter = New SqlParameter("@miparametro", SqlDbType.Int) With {.Value = 1}

            command3.Parameters.Add(idParam3)
            drDatosSql3 = command3.ExecuteReader()
            drDatosSql3.Read()
            cad3 = drDatosSql3.GetValue(0)
            ' cad3 =3
        End Using