none
Pasar valor Null a la BD RRS feed

  • Pregunta

  • Buenas, tengo una aplicacion en 2 capas con VB.Net y Sql Server ambos 2008, deseo insertar registros a una tabla, pero deseo pasar el valor Null a ciertos campos si es q estos estan vacios, pero la instruccion q tengo siempre le envia espacio en blanco y no Null, q estoy haciendo mal. El codigo es el sgte:

        Private Sub BtnGrabar_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles BtnGrabar.Click

            Try

                Dim oGDB As New GestionDB

                    oGDB.InsUpdDel("usp_InsertClientes '" & IIf(Trim(TxtNombre.Text) = String.Empty, DBNull.Value, TxtNombre.Text) & "', '" & ..... )

            Catch ex As Exception

                MsgBox(ex.Message, 64, "Alerta")

            End Try

        End Sub

     

    La clase de los datos es la sgte:

    Public Class GestionDB

        Dim CnString As String = "Data Source = (local); Initial Catalog = DGLSAC; Integrated Security = SSPI"


    Public Sub InsUpdDel(ByVal Cad$)

            Using Cn As New SqlConnection(CnString)

                Dim Cmd As New SqlCommand(Cad, Cn)

                Cmd.ExecuteNonQuery()

            End Using

        End Sub

    End Class

     

    Gracias por su respuesta.


    SQL
    jueves, 10 de febrero de 2011 5:53

Respuestas

  • "ILV" me preguntó:

    > SoftJaen, la unica opcion seria trabajar variables con objeto,
    > esto me parece un poco dificil y largo, porq tendria q declarar
    > cada variable, ...


    Precisamente para ese trabajo se utilizan las «variables»: para almacenar el valor «variable» que en cada momento se le puede pasar al procedimiento almacenado (store procedure).

    Si no se utilizaran «variables», al procedimiento almacenado siempre se le pasarían los mismos datos, es decir, valores «no variables», y no creo que ésto sea lo que tu deseas hacer. Me imagino que tu desearás pasarle a los parámetros del procedimiento almacenado, unas veces un valor, y otras veces, otro valor diferente; en definitiva, «valores variables», valores éstos que varían según lo que el usuario haya escrito en un control TextBox, por ejemplo. ¿Me explico? ;-)

    > ya q en algunos casos tengo q insertar en varios campos de una tabla,
    > en el q pase solo les mostre 2 campos de ejemplo, pero en la realidad
    > son muchos mas campos y todo es trabajado con Store Procedures.
    >
    > Si existe alguna otra solucion, estare agradecido por su respuesta.}

    La mejor solución, la más aceptada por todos aquellos que utilizamos procedimientos almacenados, es la que te indiqué en mi primera respuesta: utilizar una colección de objetos «SqlParameter» para pasarle los valores a los distintos parámetros de entrada del procedimiento almacenado.

    Imagina que tienes la típica tabla de Clientes y que dispones del siguiente procedimiento almacenado para añadir un nuevo Cliente:

    CREATE PROCEDURE [dbo].[InsertNewCustomer]
     @IdCliente int,
     @Nombre varchar(50),
     @NIF char(9),
     @Domicilio varchar(50),
     @Poblacion varchar(25),
     @Provincia varchar(20),
     @CodPostal char(5)
    AS

    INSERT INTO [Clientes] (
          [IdCliente] ,
          [Nombre],
          [NIF],
          [Domicilio],
          [Poblacion],
          [Provincia],
          [CodPostal]
    )

    VALUES
        (
          @IdCliente,
          @Nombre,
          @NIF,
          @Domicilio,
          @Poblacion,
          @Provincia,
          @CodPostal
    )
         
    Ahora, en tu aplicación de Visual Basic .NET dispones de la siguiente clase, para trabajar con objetos «Cliente»:

    Public Class Cliente

        Public Property IdCliente As Int32
        Public Property Nombre As String
        Public Property Nif As String
        Public Property Domicilio As String
        Public Property Poblacion As String
        Public Property Provincia As String
        Public Property CodPostal As String

    End Class

    Como tu intención es llamar al procedimiento almacenado «InsertNewCustomer», vamos a crearnos un procedimiento en nuestra aplicación que sea el encargado de configurar y ejecutar dicho procedimiento almacenado:

        Private Sub ExecuteProcInsertNewCustomer(ByVal customer As Cliente)

            ' El siguiente procedimiento se encargará de configurar
            ' y ejecutar el procedimiento almacenado InsertNewCustomer
            ' de nuestra base de datos de SQL Server.

            Try
                Using cnn As New SqlConnection(CADENACONEXION)

                    ' Creamos el comando
                    Dim cmd As SqlCommand = cnn.CreateCommand()

                    ' Indicamos el nombre del procedimiento almacenado
                    cmd.CommandText = "InsertNewCustomer"

                    ' Indicamos que se trata de un procedimiento almacenado
                    cmd.CommandType = CommandType.StoredProcedure

                    ' Añadimos los valores de los parámetros de entrada que espera
                    ' nuestro procedimiento almacenado.
                    '
                    ' La clave principal no puede admitir valores NULL. Si se trata
                    ' de un campo numérico entero, al estar declarado como Integer,
                    ' por defecto su valor siempre será 0.
                    '
                    cmd.Parameters.AddWithValue("@IdCliente", customer.IdCliente)

                    ' Verificamos si los restantes valores de la clase Cliente
                    ' son NULL. Como los valores los hemos tomado de la propiedad
                    ' Text de un control TextBox, en ningún caso su valor será
                    ' Nothing (null en C#), y menos aún, DbNull.Value. Lo único
                    ' que tenemos que verificar es si su valor es una cadena de
                    ' longitud cero (String.Empty), y de ser así, enviamos a la
                    ' base de datos un valor NULL.
                    '
                    Dim value As Object = CObj(customer.Nombre)
                    If (CStr(value) = String.Empty) Then value = DBNull.Value
                    cmd.Parameters.AddWithValue("@Nombre", value)

                    value = CObj(customer.Nif)
                    If (CStr(value) = String.Empty) Then value = DBNull.Value
                    cmd.Parameters.AddWithValue("@NIF", value)

                    value = CObj(customer.Domicilio)
                    If (CStr(value) = String.Empty) Then value = DBNull.Value
                    cmd.Parameters.AddWithValue("@Domicilio", value)

                    value = CObj(customer.Poblacion)
                    If (CStr(value) = String.Empty) Then value = DBNull.Value
                    cmd.Parameters.AddWithValue("@Poblacion", value)

                    value = CObj(customer.Provincia)
                    If (CStr(value) = String.Empty) Then value = DBNull.Value
                    cmd.Parameters.AddWithValue("@Provincia", value)

                    value = CObj(customer.CodPostal)
                    If (CStr(value) = String.Empty) Then value = DBNull.Value
                    cmd.Parameters.AddWithValue("@CodPostal", value)

                    ' Abrimos la conexión
                    cnn.Open()

                    ' Ejecutamos el procedimiento almacenado
                    cmd.ExecuteNonQuery()

                End Using

            Catch ex As Exception
                ' Devolvemos el error al procedimiento llamador
                Throw

            End Try

        End Sub

    Fíjate que salvo el campo «IdCliente« (que se supone es la clave principal de la tabla Clientes), los restantes campos admiten valores NULL, de ahí que tengamos que verificar su valor para pasarle o no al procedimiento almacenado el valor «DBNull.Value», que es el que nos permite añadir valores NULL a los campos de la tabla de la base de datos.

    Cuando desees añadir un nuevo Cliente, simplemente ejecutarías lo siguiente:

            Dim cust As Cliente = New Cliente()

            With cust
                ' Convertirmos explícitamente a Integer el valor del control txtIdCliente
                Integer.TryParse(txtIdCliente.Text, cust.IdCliente)

                ' Las restantes propiedades de la clase, al ser del tipo String,
                ' no es necesario convertirlas.
                '
                .Nombre = txtNombre.Text
                .Nif = txtNIF.Text
                .Domicilio = txtDomicilio.Text
                .Poblacion = txtPoblacion.Text
                .Provincia = txtProvincia.Text
                .CodPostal = txtCodPostal.Text

            End With

            ' Ejecutamos el procedimiento almacenado
            '
            Try
                ExecuteProcInsertNewCustomer(cust)

            Catch ex As Exception
                MessageBox.Show(ex.Message)

            End Try

        End Sub

    Observa que los distintos valores los tomamos de sus correspondientes controles TextBox existentes en nuestro formulario.

    Ésta es la manera, digamos que "certificada" de ejecutar un procedimiento almacenado. Hay otras muchas, pero lo mismo no están orientadas a objeto como la que aquí te he indicado.

    ¿Que tienes 20.283 procedimientos almacenados en tu base de datos? ¿Tendrás que crearte 20.283 procedimientos en tu aplicación de Visual Basic, cada uno para llamar a su correspondiente procedimiento almacenado.

    Para probar el ejemplo, mejor será que te crees el procedimiento almacenado en una base de Pruebas de SQL Server, donde exista la típica tabla de Clientes.

     


    Enrique Martínez
      [MS MVP - VB]

    • Marcado como respuesta ILV domingo, 13 de febrero de 2011 5:32
    viernes, 11 de febrero de 2011 8:47
    Moderador

Todas las respuestas

  • Hola:
    Prueba esto
    oGDB.InsUpdDel("usp_InsertClientes '" & IIf(Trim(TxtNombre.Text) = String.Empty, "null", TxtNombre.Text) & "', '"

    Un saludo desde Bilbo
    Carlos

    jueves, 10 de febrero de 2011 6:50
  • "ILV" escribió:

    > deseo insertar registros a una tabla, pero deseo pasar el valor
    > Null a ciertos campos si es q estos estan vacios, pero la
    > instruccion q tengo siempre le envia espacio en blanco y no Null,
    > q estoy haciendo mal.
    >
    > Public Sub InsUpdDel(ByVal Cad$)

    La anterior declaración de procedimiento, no es que esté mal, pero como el primer parámetro es del tipo «String», al procedimiento SIEMPRE LE LLEGARÁ UN VALOR STRING.

    > IIf(Trim(TxtNombre.Text) = String.Empty, DBNull.Value, TxtNombre.Text)

    Por si lo ignoras, la propiedad Text de un control TextBox, siempre devolverá un valor alfanumérico (String), aunque la propiedad sea una cadena de longitud cero (String.Empty). Es decir, la propiedad Text, NUNCA PODRÁ SER NULL (DBNull.Value).

    Para obtener valores DBNull.Value, tienes que trabajar con variables del tipo «Object».

    Si por ejemplo, tienes la siguiente firma de procedimiento:

       Public Sub InsUpdDel(ByVal nombreProcedimiento as String, _
                            ByVal Cad As String)

       End Sub

    Tienes que llamarlo de la siguiente manera:

       InsUpdDel("usp_InsertClientes '", TxtNombre.Text)

    Y ejecutarías el comando así:

        Public Sub InsUpdDel(ByVal nombreProcedimiento As String, _
                             ByVal Cad As String)

            Using Cn As New SqlConnection(CnString)

                Dim Cmd As SqlCommand = Cn.CreateCommand

                Cmd.CommandText = nombreProcedimiento
                Cmd.CommandType = CommandType.StoredProcedure

                Dim value As Object

                If (Cad.Length = 0) Then
                    value = DBNull.Value

                Else
                    value = Cad

                End If

                Cmd.Parameters.AddWithValue("@NombreParametro", value)

                ' Abrimos la conexión
                Cn.Open()

                ' Ejecutamos el comando
                Cmd.ExecuteNonQuery()

            End Using

        End Sub

    Si el valor del parámetro «Cad» es una cadena de longitud cero (String.Empty), entonces al procedimiento almacenado se le asignará un valor NULL (DbNull.Value); en caso contrario, se le asignará un valor alfanumérico.

    >   Cmd.Parameters.AddWithValue("@NombreParametro", value)

    Fíjate bien en ésta asignación. Como «@NombreParametro» deberás especificar el nombre exacto del parámetro de entrada del procedimiento almacenado «usp_InsertClientes» que deseas ejecutar.

    Un saludo

     


    Enrique Martínez
      [MS MVP - VB]

    jueves, 10 de febrero de 2011 7:28
    Moderador
  • "J. Carlos Herrero" escribió:

    > Prueba esto
    >
    > oGDB.InsUpdDel("usp_InsertClientes '" & IIf(Trim(TxtNombre.Text) = _
    >                       String.Empty, "null", TxtNombre.Text) & "', '"

    Hola, J. Carlos:

    Si le pasas el valor "null", le estarás pasando un valor alfanumérico (String), no un valor DbNull.Value, que desde luego nada tiene que ver con un valor "null". :-)

    Todo lo que esté encerrado entre comillas dobles se trata como un valor alfanumérico.

    Un saludo

     


    Enrique Martínez
      [MS MVP - VB]

    jueves, 10 de febrero de 2011 7:30
    Moderador
  • Hola:
    Si se ejecuta ela siguiente codigo contra una tabla llamada PRUEBA con loa siguiente estructura
    [ID] [tinyint] NOT NULL
    [TEXTO] [varchar] (50)

        Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
            Dim lsQuery As String = "Insert Into PRUEBA (ID, TEXTO ) Values (2," & "null" & ")"
            Try
                Using loConexion As New SqlConnection(msCadConexion)
                    ' crear comando
                    Using loComando As New SqlCommand(lsQuery, loConexion)
                        loConexion.Open()   ' abrir conexión
                        loComando.ExecuteNonQuery()
                    End Using
                End Using
            Catch Exp As SqlException
                Me.Cursor = Cursors.Default
                MessageBox.Show(Exp.Message, "Button1_Click", MessageBoxButtons.OK, MessageBoxIcon.Information)
            Catch Exp As Exception
                Me.Cursor = Cursors.Default
                MessageBox.Show(Exp.Message, "Button1_Click", MessageBoxButtons.OK, MessageBoxIcon.Information)
            End Try
        End Sub

    Inserta 1 registro en dicha tabla.
    Esto hace igual que lo que yo le puse, es decir concatena 3 cadenas de caracteres
    Sin querer entrar en polemicas, igual hay algo que yo no veo.

    Un saludo desde Bilbo
    Carlos

    jueves, 10 de febrero de 2011 9:00
  • "J. Carlos Herrero" escribió:

    > Si se ejecuta ela siguiente codigo contra una tabla
    > llamada PRUEBA con loa siguiente estructura
    >
    > [ID] [tinyint] NOT NULL
    > [TEXTO] [varchar] (50)
    >
    > Dim lsQuery As String = "Insert Into PRUEBA (ID, TEXTO )
    >                          Values (2," & "null" & ")"
    >
    > Inserta 1 registro en dicha tabla.
    > Esto hace igual que lo que yo le puse, es decir concatena
    > 3 cadenas de caracteres
    > Sin querer entrar en polemicas, igual hay algo que yo no veo.

    Como comprenderás, yo tampoco quiero entrar en polémicas. Pero entiendo, que esa no es la respuesta que espera el usuario ILV.

    Si tú ejecutas la consulta T-SQL que me has indicado, estarás insertando en el campo TEXTO, el valor ALFANUMÉRICO 'null', tal y como te he indicado anteriormente.

    Un valor alfanumérico 'null' es totalmente distinto de un valor DbNull.Value, que es el valor NULL que admiten aquellos campos que así lo tengan establecido.

    Si deseas hacer una prueba, una vez que hayas ejecutado la consulta INSERT INTO anterior, ejecuta la siguiente consulta T-SQL de selección para recuperar aquellos registros cuyo campo TEXTO sea NULL:

        SELECT * FROM Prueba
        WHERE Texto IS NULL

    Si no obtienes ningún registro, es porque no existen registros cuyo campo Texto sea NULL. Pero ese NULL (con mayúsculas, para diferenciarlo) no es el "null" que tú le estás asignando como valor alfanumérico.

    Ahora, prueba a ejecutar ésta otra consulta de datos añadidos:

            Dim lsQuery As String = _
              "Insert Into Prueba (ID, TEXTO ) Values (22, @valorNull)"

            Try
                Using loConexion As New SqlConnection(msCadConexion)
                    ' crear comando
                    Using loComando As New SqlCommand(lsQuery, loConexion)

                        loComando.Parameters.AddWithValue("@valorNull", DBNull.Value)

                        loConexion.Open()   ' abrir conexión

                        loComando.ExecuteNonQuery()
                    End Using
                End Using

    Una vez ejecutada, desde el Administrador de SQL Server vuelve a ejecutar

        SELECT * FROM Prueba
        WHERE Texto IS NULL

    Y verás como ahora sí obtienes un registro donde el valor del campo ID es igual a 22.

    Si tú insertas el valor alfanumérico "null", es como si estuvieras insertando cualquier otro valor alfanumérico cualquiera, como por ejemplo, "pepe", "mi casa, "teléfono", "nothing", "es nulo", etc. ¿Comprendes?

    Insisto, para insertar un valor NULL válido, tienes que enviar el valor DBNull.Value.


    Enrique Martínez
      [MS MVP - VB]

    jueves, 10 de febrero de 2011 11:06
    Moderador
  • Hola:
    He hecho la siguiente prueba

    Insert Into PRUEBA (ID, TEXTO ) Values (1,null)
    Insert Into PRUEBA (ID, TEXTO ) Values (2,null)
    Insert Into PRUEBA (ID, TEXTO ) Values (3,null)
    Insert Into PRUEBA (ID, TEXTO ) Values (4,null)
    Insert Into PRUEBA (ID, TEXTO ) Values (5,null)
    Insert Into PRUEBA (ID, TEXTO ) Values (6,'null')
    Insert Into PRUEBA (ID, TEXTO ) Values (7,'null')
    Insert Into PRUEBA (ID, TEXTO ) Values (8,'null')
    Insert Into PRUEBA (ID, TEXTO ) Values (9,'null')
    Insert Into PRUEBA (ID, TEXTO ) Values (10,'null')

    Ejecutando SELECT * FROM PRUEBA WHERE TEXTO IS NULL
    Resultado:
    1 NULL
    2 NULL
    3 NULL
    4 NULL
    5 NULL

    Ejecutando SELECT * FROM PRUEBA WHERE TEXTO IS NOT NULL
    Resultado:
    6 null
    7 null
    8 null
    9 null
    10 null

    Un saludo desde Bilbo
    Carlos

    jueves, 10 de febrero de 2011 11:55
  • Hola SoftJaen y Juan Carlos,

     

    SoftJaen, creo que en la consulta de Juan Carlos, usa null sin ir entrecomillado para la SQL, aparece entrecomillado para construir la SQL sólo.


    Javier Torrecilla
    Para el correcto funcionamiento, y que otros usuarios se puedan beneficiar de la solucion de esta pregunta por favor marca las respuestas que te hayan ayudado como "Respuesta".
    Si la respuesta te ha sido util Votala.
    Mi Blog: Jtorrecilla
    Enlace a Faq de Winforms en Ingles Muy bueno
    jueves, 10 de febrero de 2011 11:59
    Moderador
  • "jtorrecilla" escribió:

    > SoftJaen, creo que en la consulta de Juan Carlos, usa null sin
    > ir entrecomillado para la SQL, aparece entrecomillado para
    > construir la SQL sólo.

    ¡Anda co*o! Si no entrecomilla el NULL, otro gallo cantaría. Pero me "cegué" con su primera respuesta, cuando escribió:

    [...]    Si le pasas el valor "null", ... [...]

    Pero como ha dicho Juan Carlos en su última respuesta:

       Insert Into PRUEBA (ID, TEXTO ) Values (1,null)

    Se insertará un valor NULL en el campo TEXTO.

        Insert Into PRUEBA (ID, TEXTO ) Values (6,'null')

    Se insertará el valor "null" en el campo TEXTO.

    Aclarado. :-)

     

     

     


    Enrique Martínez
      [MS MVP - VB]

    jueves, 10 de febrero de 2011 12:11
    Moderador
  • Gracias a todos por su respuesta, pero aun no soluciono este problema.

    SoftJaen, la unica opcion seria trabajar variables con objeto, esto me parece un poco dificil y largo, porq tendria q declarar cada variable, ya q en algunos casos tengo q insertar en varios campos de una tabla, en el q pase solo les mostre 2 campos de ejemplo, pero en la realidad son muchos mas campos y todo es trabajado con Store Procedures.

    Si existe alguna otra solucion, estare agradecido por su respuesta.}

    Gracias


    SQL
    viernes, 11 de febrero de 2011 4:57
  • "ILV" me preguntó:

    > SoftJaen, la unica opcion seria trabajar variables con objeto,
    > esto me parece un poco dificil y largo, porq tendria q declarar
    > cada variable, ...


    Precisamente para ese trabajo se utilizan las «variables»: para almacenar el valor «variable» que en cada momento se le puede pasar al procedimiento almacenado (store procedure).

    Si no se utilizaran «variables», al procedimiento almacenado siempre se le pasarían los mismos datos, es decir, valores «no variables», y no creo que ésto sea lo que tu deseas hacer. Me imagino que tu desearás pasarle a los parámetros del procedimiento almacenado, unas veces un valor, y otras veces, otro valor diferente; en definitiva, «valores variables», valores éstos que varían según lo que el usuario haya escrito en un control TextBox, por ejemplo. ¿Me explico? ;-)

    > ya q en algunos casos tengo q insertar en varios campos de una tabla,
    > en el q pase solo les mostre 2 campos de ejemplo, pero en la realidad
    > son muchos mas campos y todo es trabajado con Store Procedures.
    >
    > Si existe alguna otra solucion, estare agradecido por su respuesta.}

    La mejor solución, la más aceptada por todos aquellos que utilizamos procedimientos almacenados, es la que te indiqué en mi primera respuesta: utilizar una colección de objetos «SqlParameter» para pasarle los valores a los distintos parámetros de entrada del procedimiento almacenado.

    Imagina que tienes la típica tabla de Clientes y que dispones del siguiente procedimiento almacenado para añadir un nuevo Cliente:

    CREATE PROCEDURE [dbo].[InsertNewCustomer]
     @IdCliente int,
     @Nombre varchar(50),
     @NIF char(9),
     @Domicilio varchar(50),
     @Poblacion varchar(25),
     @Provincia varchar(20),
     @CodPostal char(5)
    AS

    INSERT INTO [Clientes] (
          [IdCliente] ,
          [Nombre],
          [NIF],
          [Domicilio],
          [Poblacion],
          [Provincia],
          [CodPostal]
    )

    VALUES
        (
          @IdCliente,
          @Nombre,
          @NIF,
          @Domicilio,
          @Poblacion,
          @Provincia,
          @CodPostal
    )
         
    Ahora, en tu aplicación de Visual Basic .NET dispones de la siguiente clase, para trabajar con objetos «Cliente»:

    Public Class Cliente

        Public Property IdCliente As Int32
        Public Property Nombre As String
        Public Property Nif As String
        Public Property Domicilio As String
        Public Property Poblacion As String
        Public Property Provincia As String
        Public Property CodPostal As String

    End Class

    Como tu intención es llamar al procedimiento almacenado «InsertNewCustomer», vamos a crearnos un procedimiento en nuestra aplicación que sea el encargado de configurar y ejecutar dicho procedimiento almacenado:

        Private Sub ExecuteProcInsertNewCustomer(ByVal customer As Cliente)

            ' El siguiente procedimiento se encargará de configurar
            ' y ejecutar el procedimiento almacenado InsertNewCustomer
            ' de nuestra base de datos de SQL Server.

            Try
                Using cnn As New SqlConnection(CADENACONEXION)

                    ' Creamos el comando
                    Dim cmd As SqlCommand = cnn.CreateCommand()

                    ' Indicamos el nombre del procedimiento almacenado
                    cmd.CommandText = "InsertNewCustomer"

                    ' Indicamos que se trata de un procedimiento almacenado
                    cmd.CommandType = CommandType.StoredProcedure

                    ' Añadimos los valores de los parámetros de entrada que espera
                    ' nuestro procedimiento almacenado.
                    '
                    ' La clave principal no puede admitir valores NULL. Si se trata
                    ' de un campo numérico entero, al estar declarado como Integer,
                    ' por defecto su valor siempre será 0.
                    '
                    cmd.Parameters.AddWithValue("@IdCliente", customer.IdCliente)

                    ' Verificamos si los restantes valores de la clase Cliente
                    ' son NULL. Como los valores los hemos tomado de la propiedad
                    ' Text de un control TextBox, en ningún caso su valor será
                    ' Nothing (null en C#), y menos aún, DbNull.Value. Lo único
                    ' que tenemos que verificar es si su valor es una cadena de
                    ' longitud cero (String.Empty), y de ser así, enviamos a la
                    ' base de datos un valor NULL.
                    '
                    Dim value As Object = CObj(customer.Nombre)
                    If (CStr(value) = String.Empty) Then value = DBNull.Value
                    cmd.Parameters.AddWithValue("@Nombre", value)

                    value = CObj(customer.Nif)
                    If (CStr(value) = String.Empty) Then value = DBNull.Value
                    cmd.Parameters.AddWithValue("@NIF", value)

                    value = CObj(customer.Domicilio)
                    If (CStr(value) = String.Empty) Then value = DBNull.Value
                    cmd.Parameters.AddWithValue("@Domicilio", value)

                    value = CObj(customer.Poblacion)
                    If (CStr(value) = String.Empty) Then value = DBNull.Value
                    cmd.Parameters.AddWithValue("@Poblacion", value)

                    value = CObj(customer.Provincia)
                    If (CStr(value) = String.Empty) Then value = DBNull.Value
                    cmd.Parameters.AddWithValue("@Provincia", value)

                    value = CObj(customer.CodPostal)
                    If (CStr(value) = String.Empty) Then value = DBNull.Value
                    cmd.Parameters.AddWithValue("@CodPostal", value)

                    ' Abrimos la conexión
                    cnn.Open()

                    ' Ejecutamos el procedimiento almacenado
                    cmd.ExecuteNonQuery()

                End Using

            Catch ex As Exception
                ' Devolvemos el error al procedimiento llamador
                Throw

            End Try

        End Sub

    Fíjate que salvo el campo «IdCliente« (que se supone es la clave principal de la tabla Clientes), los restantes campos admiten valores NULL, de ahí que tengamos que verificar su valor para pasarle o no al procedimiento almacenado el valor «DBNull.Value», que es el que nos permite añadir valores NULL a los campos de la tabla de la base de datos.

    Cuando desees añadir un nuevo Cliente, simplemente ejecutarías lo siguiente:

            Dim cust As Cliente = New Cliente()

            With cust
                ' Convertirmos explícitamente a Integer el valor del control txtIdCliente
                Integer.TryParse(txtIdCliente.Text, cust.IdCliente)

                ' Las restantes propiedades de la clase, al ser del tipo String,
                ' no es necesario convertirlas.
                '
                .Nombre = txtNombre.Text
                .Nif = txtNIF.Text
                .Domicilio = txtDomicilio.Text
                .Poblacion = txtPoblacion.Text
                .Provincia = txtProvincia.Text
                .CodPostal = txtCodPostal.Text

            End With

            ' Ejecutamos el procedimiento almacenado
            '
            Try
                ExecuteProcInsertNewCustomer(cust)

            Catch ex As Exception
                MessageBox.Show(ex.Message)

            End Try

        End Sub

    Observa que los distintos valores los tomamos de sus correspondientes controles TextBox existentes en nuestro formulario.

    Ésta es la manera, digamos que "certificada" de ejecutar un procedimiento almacenado. Hay otras muchas, pero lo mismo no están orientadas a objeto como la que aquí te he indicado.

    ¿Que tienes 20.283 procedimientos almacenados en tu base de datos? ¿Tendrás que crearte 20.283 procedimientos en tu aplicación de Visual Basic, cada uno para llamar a su correspondiente procedimiento almacenado.

    Para probar el ejemplo, mejor será que te crees el procedimiento almacenado en una base de Pruebas de SQL Server, donde exista la típica tabla de Clientes.

     


    Enrique Martínez
      [MS MVP - VB]

    • Marcado como respuesta ILV domingo, 13 de febrero de 2011 5:32
    viernes, 11 de febrero de 2011 8:47
    Moderador