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!!!!
Pues siempre es mejor usar parámetros, ya que en cierta medida es mas seguro usar parámetros y no directamente los valores
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
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?
Si, es indiferente.
Saludos
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.
Ahora ya tengo algo más de idea sobre el trabajo de aplicaciones contra bases de datos.
Muchas gracias!!!
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