none
Primeros Pasos RRS feed

  • Pregunta

  • Gente,

    Estoy dando mis primeros pasos en la programación y tengo algunas dudas que creo son necesarias resolver para poder seguir avanzando. Estuve analizando un ejemplo de ABM hecho en vb.net.

    Para no pegar tanto código a continuación pongo solamente la función para el alta (AgregarAlumno).

    Public Sub AgregarAlumno(ByVal Apellido As String, _
                                ByVal Nombre As String, _
                                ByVal Legajo As String, _
                                ByVal Fecha_De_Nacimiento As Date)

            Dim oConexion As Data.OleDb.OleDbConnection
            Dim oCommand As Data.OleDb.OleDbCommand


            Dim strSql As String
            strSql = "Insert into ALUMNOS (ALU_LEGAJO, ALU_APELLIDO, ALU_NOMBRE,  ALU_FECHANACIMIENTO)"
            strSql += " values (@pmtLegajo, @pmtApellido, @pmtNombre, @pmtFechaNac)"

            oConexion = New Data.OleDb.OleDbConnection(CadenaDeConexion)
            oCommand = New Data.OleDb.OleDbCommand()

            Try
                oConexion.Open()

                oCommand.Connection = oConexion
                oCommand.CommandType = CommandType.Text
                oCommand.CommandText = strSql

                Dim oPmtLegajo As New Data.OleDb.OleDbParameter("@pmtLegajo", Legajo)
                oPmtLegajo.DbType = DbType.String

                Dim oPmtApellido As New Data.OleDb.OleDbParameter("@pmtApellido", Apellido)
                oPmtApellido.DbType = DbType.String

                Dim oPmtNombre As New Data.OleDb.OleDbParameter("@pmtNombre", Nombre)
                oPmtNombre.DbType = DbType.String

                Dim oPmtFechaNac As New Data.OleDb.OleDbParameter("@pmtFechaNac", Fecha_De_Nacimiento)
                oPmtFechaNac.DbType = DbType.Date

                oCommand.Parameters.Add(oPmtLegajo)
                oCommand.Parameters.Add(oPmtApellido)
                oCommand.Parameters.Add(oPmtNombre)
                oCommand.Parameters.Add(oPmtFechaNac)


                Dim filasAfectadas As Integer = oCommand.ExecuteNonQuery()


            Catch ex As Exception
                Throw ex
            Finally
                oConexion.Close()
            End Try


        End Sub

     

    Lo que no me queda claro es la parte resaltada del código anterior. Por otra parte me gustaría saber si ese código podría ser reemplazado por lo siguiente:

     

    Dim oConexion As New Data.OleDb.OleDbConnection(CadenaDeConexion)
    Dim oCommand As New Data.OleDb.OleDbCommand

    Yo he probado con esta última forma y el alta se sigue haciendo sin problemas pero no me queda claro si ambas formas son correctas, si alguna no lo es o si alguna es mejor que la otra.


    Como última duda me gustaría saber si es totalmente necesario especificar el tipo de parámetro (Ej.: oPmtLegajo.DbType = DbType.String). En caso de que si sea necesario: se usa para pasar el tipo de valor correcto al string SQL y de esta forma darle mas seguridad al ingreso en la db?

    Saludos y gracias de antemano.

    miércoles, 19 de octubre de 2011 3:14

Respuestas

  • Hola

    Lo que no me queda claro es la parte resaltada del código anterior. Por otra parte me gustaría saber si ese código podría ser reemplazado por lo siguiente:

    Dim oConexion As New Data.OleDb.OleDbConnection(CadenaDeConexion)

    Dim oCommand As New Data.OleDb.OleDbCommand

    En realidad si es lo mismo... ya si usas algun tipo de entidad o clase especial, podrías ganar un poco (muy poco) de velocidad al no inicializar las variables sino cuando las vayas a usar: http://www.codeproject.com/KB/dotnet/DontInitializeVariables.aspx

    Como última duda me gustaría saber si es totalmente necesario especificar el tipo de parámetro (Ej.: oPmtLegajo.DbType = DbType.String). En caso de que si sea necesario: se usa para pasar el tipo de valor correcto al string SQL y de esta forma darle mas seguridad al ingreso en la db?

    Segun la MSDN Library: "El tipo de un parámetro es específico del proveedor de datos de .NET Framework. Al especificar el tipo, el valor de Parameter se convierte en el tipo del proveedor de datos de .NET Framework antes de pasar el valor al origen de datos. Si no se especifica el tipo, ADO.NET deduce el tipo de proveedor de datos del Parameter a partir de la propiedad Value del objeto Parameter." [enlace]

    Con respecto a:

    strSql = "Insert into ALUMNOS (ALU_LEGAJO, ALU_APELLIDO, ALU_NOMBRE,  ALU_FECHANACIMIENTO)"
    strSql += " values (@pmtLegajo, @pmtApellido, @pmtNombre, @pmtFechaNac)"

    Por que mejor no usar algo como esto:

    strSql = "Insert into ALUMNOS (ALU_LEGAJO, ALU_APELLIDO, ALU_NOMBRE,  ALU_FECHANACIMIENTO) " & _
                 "Values (@pmtLegajo, @pmtApellido, @pmtNombre, @pmtFechaNac)"

    Espero te sirva.

    Un saludo


    Antonio Lobo
    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
    • Marcado como respuesta cjchdev jueves, 20 de octubre de 2011 17:54
    miércoles, 19 de octubre de 2011 3:40
  • Es posible que la primera forma sea menos "segura" que la segunda?? Se me ocurre que con la segunda puedo prevenir tipos de datos ingresados de forma incorrecta

    no veo que sea menos segura, si peude suceder que para algunos tipos de datos especiales como ser al meomentod e pasar por parametro un archivo, imagen, se requiere hacerlo especificando el tipo

    pero para los tipos comunen no deberia ahber diferencia

    ademas con la declaracion que tu haces no veo que prevengas nada, porquee s mas de la forma en que lo ahces el tipo lo defines cuando el valor ya lo has asignado al paramatro, por lo tanto no evitas una asignacion incorrecta

    si quieres prevenir los tipos de datos lo validas previa al armado de cualquier query que tengas

    por ejemplo si se necesita un numero haces

    Dim Fecha_De_Nacimiento As Datetime

    If Not Int32.TryParse(FechaNac.Text, fechaNac( Then

        MesasageBox.Show("la fecha es incorrecta")

        Return

    end If

    como veras esto preveia al crear cualquiere SqlCommand, o cualquier parametro que defienas

    saludos


    Leandro Tuttini

    Blog
    Buenos Aires
    Argentina
    • Marcado como respuesta cjchdev jueves, 20 de octubre de 2011 22:49
    jueves, 20 de octubre de 2011 0:49

Todas las respuestas

  • Hola

    Lo que no me queda claro es la parte resaltada del código anterior. Por otra parte me gustaría saber si ese código podría ser reemplazado por lo siguiente:

    Dim oConexion As New Data.OleDb.OleDbConnection(CadenaDeConexion)

    Dim oCommand As New Data.OleDb.OleDbCommand

    En realidad si es lo mismo... ya si usas algun tipo de entidad o clase especial, podrías ganar un poco (muy poco) de velocidad al no inicializar las variables sino cuando las vayas a usar: http://www.codeproject.com/KB/dotnet/DontInitializeVariables.aspx

    Como última duda me gustaría saber si es totalmente necesario especificar el tipo de parámetro (Ej.: oPmtLegajo.DbType = DbType.String). En caso de que si sea necesario: se usa para pasar el tipo de valor correcto al string SQL y de esta forma darle mas seguridad al ingreso en la db?

    Segun la MSDN Library: "El tipo de un parámetro es específico del proveedor de datos de .NET Framework. Al especificar el tipo, el valor de Parameter se convierte en el tipo del proveedor de datos de .NET Framework antes de pasar el valor al origen de datos. Si no se especifica el tipo, ADO.NET deduce el tipo de proveedor de datos del Parameter a partir de la propiedad Value del objeto Parameter." [enlace]

    Con respecto a:

    strSql = "Insert into ALUMNOS (ALU_LEGAJO, ALU_APELLIDO, ALU_NOMBRE,  ALU_FECHANACIMIENTO)"
    strSql += " values (@pmtLegajo, @pmtApellido, @pmtNombre, @pmtFechaNac)"

    Por que mejor no usar algo como esto:

    strSql = "Insert into ALUMNOS (ALU_LEGAJO, ALU_APELLIDO, ALU_NOMBRE,  ALU_FECHANACIMIENTO) " & _
                 "Values (@pmtLegajo, @pmtApellido, @pmtNombre, @pmtFechaNac)"

    Espero te sirva.

    Un saludo


    Antonio Lobo
    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
    • Marcado como respuesta cjchdev jueves, 20 de octubre de 2011 17:54
    miércoles, 19 de octubre de 2011 3:40
  • Yo he probado con esta última forma y el alta se sigue haciendo sin problemas pero no me queda claro si ambas formas son correctas, si alguna no lo es o si alguna es mejor que la otra.

    son dos formas de hacer lo mismo, en definitiva termians creando la instancia, pero en linea separadas

    para este caso la forma que has puesto

    Dim oConexion As New Data.OleDb.OleDbConnection(CadenaDeConexion)

    Dim oCommand As New Data.OleDb.OleDbCommand

    es la correcta, porque no necestas porque separar las linea, no tiene sentido hacerlo

     

    Como última duda me gustaría saber si es totalmente necesario especificar el tipo de parámetro (Ej.: oPmtLegajo.DbType = DbType.String). En caso de que si sea necesario: se usa para pasar el tipo de valor correcto al string SQL y de esta forma darle mas seguridad al ingreso en la db?

    y porque no usas

    oCommand.Parameters.AddWithValue("@pmtLegajo", Legajo)

    oCommand.Parameters.AddWithValue("@pmtFechaNac", Fecha_De_Nacimiento)

    con este es importante que el tipo de dato sea el correcto, por eso si es del tipo Datetime debe pasarlo de ese tipo

    aqui no tendras problemas porque los tipos del parametro ya definen el tipo que se requiere

    saludos


    Leandro Tuttini

    Blog
    Buenos Aires
    Argentina
    miércoles, 19 de octubre de 2011 5:26
  • Leandro,

     

    Muchas gracias por tu respuesta.

    Respecto de:

     

    oCommand.Parameters.AddWithValue("@pmtLegajo", Legajo)

    vs.

    Dim oPmtFechaNac As New Data.OleDb.OleDbParameter("@pmtFechaNac", Fecha_De_Nacimiento)
    oPmtFechaNac.DbType = DbType.Date

     

    Es posible que la primera forma sea menos "segura" que la segunda?? Se me ocurre que con la segunda puedo prevenir tipos de datos ingresados de forma incorrecta, ej.: ingresar un string en un campo fecha.

    Saludos.

    miércoles, 19 de octubre de 2011 18:38
  • Muchísimas gracias Antonio por la extensa respuesta y los links enviados!!!

    • Editado cjchdev miércoles, 19 de octubre de 2011 18:39
    miércoles, 19 de octubre de 2011 18:39
  • Es posible que la primera forma sea menos "segura" que la segunda?? Se me ocurre que con la segunda puedo prevenir tipos de datos ingresados de forma incorrecta

    no veo que sea menos segura, si peude suceder que para algunos tipos de datos especiales como ser al meomentod e pasar por parametro un archivo, imagen, se requiere hacerlo especificando el tipo

    pero para los tipos comunen no deberia ahber diferencia

    ademas con la declaracion que tu haces no veo que prevengas nada, porquee s mas de la forma en que lo ahces el tipo lo defines cuando el valor ya lo has asignado al paramatro, por lo tanto no evitas una asignacion incorrecta

    si quieres prevenir los tipos de datos lo validas previa al armado de cualquier query que tengas

    por ejemplo si se necesita un numero haces

    Dim Fecha_De_Nacimiento As Datetime

    If Not Int32.TryParse(FechaNac.Text, fechaNac( Then

        MesasageBox.Show("la fecha es incorrecta")

        Return

    end If

    como veras esto preveia al crear cualquiere SqlCommand, o cualquier parametro que defienas

    saludos


    Leandro Tuttini

    Blog
    Buenos Aires
    Argentina
    • Marcado como respuesta cjchdev jueves, 20 de octubre de 2011 22:49
    jueves, 20 de octubre de 2011 0:49
  • Leandro,

    Nuevamente gracias por la respuesta. Entiendo lo que decís pero esa validación pre-query yo la haría en la capa de presentación. Es correcto?

    Volviendo al ejemplo, lo que intento decir con "seguridad" es lo siguiente:

    - suponé que defino de forma errónea por ej. la variable Fecha_De_Nacimiento como string, cuando en realidad el tipo de dato en la bd debería ser date.

    Entoces:

    Public Sub AgregarAlumno(ByVal Apellido As String, _
                                ....
                                ByVal Fecha_De_Nacimiento As String)

     

    Posteriormente en el parámetro lo defino como:

    Dim oPmtFechaNac As New Data.OleDb.OleDbParameter("@pmtFechaNac", Fecha_De_Nacimiento)
    oPmtFechaNac.DbType = DbType.Date

    Suponé además que el dato que ingreso (érroneamente) es un string ej: la palabra hola

    Esto lo que haría sería dar error de tipos ya que no coinciden. Desde mi punto de vista esto es "seguridad" ya que cuando se ejecute oPmtFechaNac.DbType = DbType.Date dará error.

    No se si tiene sentido esto que digo pero espero que entiendas que este nuevo mundo produce miles de dudas.

    Mil gracias nuevamente y saludos!!!
    jueves, 20 de octubre de 2011 17:54