Diferencia entre manera de programar

Iniciado por novalida, 3 Julio 2012, 18:31 PM

0 Miembros y 1 Visitante están viendo este tema.

novalida

Hola!!!

He estado viendo varios tutoriales para trabajar con bases de datos en .NET y he encontrado dos maneras de escribir código que no sé muy bien por qué una dicen que es mejor que la otra.

Aquí os presentos ambas versiones con la parte de código que corresponde a lo que no entiendo en Visual Basic .NET. Es sólo el código con el que se conseguiría lo mismo, dado que únicamente faltaría en cada caso la ejecución contra la base de datos.

La primera versión:


Dim comando As String
Dim comandoSQL as SqlCommand

comando = "SELECT campo FROM tabla WHERE fila = " & valor

comandoSQL.CommandType = CommandType.Text
comandoSQL.Command.Text = comando



La segunda versión:


Dim comando As String
Dim comandoSQL as SqlCommand

comando = "SELECT campo FROM tabla WHERE fila = @param"

comandoSQL.CommandType = CommandType.Text
comandoSQL.Command.Text = comando

Dim parametro as New SqlParameter ("param", valor)

param.DbType = DbType.Integer
comandoSQL.Parameters.Add(param)



Entiendo cada una de las líneas de ambos códigos, pero no entiendo por qué dicen que es mejor la segunda versión que la primera, si la primera implica menos código.

Si alguien me pudiera echar un poquito de luz y aclararme el tema se lo agradecería :)


Gracias y un saludo!!!!

cristiantorres

Pues siempre es mejor usar parámetros, ya que en cierta medida es mas seguro usar parámetros y no directamente los valores
Visita mi Blog C#, Asp.Net, Python y mas...
http://cristiantorresalfaro.blogspot.com

Novlucker

Seguridad.

En el primer caso se podría concatenar cualquier consulta (SQL injection)
En el segundo caso estás utilizando una consulta parametrizada, con lo cual te aseguras que el valor que esperas sea el correcto.

Saludos
Contribuye con la limpieza del foro, reporta los "casos perdidos" a un MOD XD

"Hay dos cosas infinitas: el Universo y la estupidez  humana. Y de la primera no estoy muy seguro."
Albert Einstein

novalida

Es cierto!!!

No había pensado en ello pero ahora me surje otra duda.

Si la aplicación que se desarrolla no es web si no de escritorio, ¿también se debería hacer de la segunda manera?

Novlucker

Contribuye con la limpieza del foro, reporta los "casos perdidos" a un MOD XD

"Hay dos cosas infinitas: el Universo y la estupidez  humana. Y de la primera no estoy muy seguro."
Albert Einstein

HdM

Buenas.

Las app de escritorio también son susceptibles a SQLi. De todos modos si se utiliza la 1ª opción que has planteado y lo que introduce el usuario se filtra/procesa y se "limpia" antes de pasarlo a la query, no debería haber problema.

Saludos.

- Nice to see you again -

novalida

Ahora ya tengo algo más de idea sobre el trabajo de aplicaciones contra bases de datos.

Muchas gracias!!!

MaLkAvIaN_NeT

Las dos opciones que pones trabajan en una sola capa

comando = "SELECT campo FROM tabla WHERE fila = " & valor

comando = "SELECT campo FROM tabla WHERE fila = @param"

es decir son sentencias que se vuelven a validar en el motor de base de datos buscando que no haya problemas de sintaxis en las consultas que se mandan como texto plano, lo  que no pasaría si trabajaras a dos capas, es decir usando los store procedures los que ya no tienen que validarse si no simplemente se ejecutan porque son estructuras de código ya definidas en la base de datos.

en el siguiente ejemplo le mandas parámetros a un store procedure que previamente tienes que tener creado en tu base de datos

    Public Function mantenimiento(ByVal cnn As SqlClient.SqlConnection, ByVal tipo As tipo_mantenimiento) As Integer
        Dim comando As New SqlClient.SqlCommand, parametro As New SqlClient.SqlParameter
        comando.Connection = cnn

        If tipo = tipo_mantenimiento.insertar Then
            comando.CommandText = "[sp_SIAF_EXPEDIENTE_Insertar]"
        End If

        comando.CommandType = CommandType.StoredProcedure

        parametro = comando.Parameters.Add("@ano_eje", SqlDbType.Char, 4)
        parametro.Value = Me.ano_eje
        parametro = comando.Parameters.Add("@expediente", SqlDbType.Char, 10)
        parametro.Value = Me.expediente
        parametro = comando.Parameters.Add("@tipo_operacion", SqlDbType.Char, 2)
        parametro.Value = Me.tipo_operacion
        parametro = comando.Parameters.Add("@modalidad_compra", SqlDbType.Char, 2)
        parametro.Value = Me.modalidad_compra
        parametro = comando.Parameters.Add("@sec_ejec", SqlDbType.Char, 6)
        parametro.Value = Me.sec_ejec

        return comando.ExecuteScalar()

    End Function
a por las buenas ideas