Autor Tema: Solucion para a las dobles comillas o tildes  (Leído 10991 veces)

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

LeandroA

  • Administrador
  • Petabyte
  • *****
  • Mensajes: 1128
  • Reputación: +151/-8
    • Ver Perfil
Solucion para a las dobles comillas o tildes
« en: Mayo 26, 2014, 12:45:02 am »
Hola, supongo que es un tema ya discutido, pero ahora me toca preguntarlo, cual creen que se la mejor forma de solucionar el problemas con las dobles comillas o tildes, cuando uno arma la consulta SQL puede utilizar las " o ' pero bien si el dato a ingresar tienen uno de estos caracteres te arruina la consulta, entonces como tratan estos errores ustedes?. remplazan algunos de estos por algún carácter especial?

Jeronimo

  • Gigabyte
  • ****
  • Mensajes: 402
  • Reputación: +33/-2
    • Ver Perfil
Re:Solucion para a las dobles comillas o tildes
« Respuesta #1 en: Mayo 26, 2014, 08:30:21 am »
Hola, Leandro.
Seguramente no te aporte nada con mi comentario, pero lo dejo igualmente.
Para mí la mejor manera es como sugerís, porque "escapando" las comillas no sé si puede traer problemas al cambiar de base de datos (no sé si todas tratan igual ese procedimiento). Por eso creo que cambiar las comillas dobles y las simples por caracteres especiales sería la mejor solución que se me ocurre. De todas maneras yo directamente impido que el usuario ingrese estos caracteres: * ' " / (lo filtro en el evento Keypress de la caja de texto). Aunque uso este procedimiento para el ingreso de nombres y apellidos, no es del todo de mi agrado porque hay algunos apellidos que pueden contener comillas simples. Pero ya tenía el código hecho así cuando lo advertí, así que no lo cambié de vago nomás.
Seguramente los que saben te sugerirán caminos más apropiados.
Saludos.

Jerónimo

Waldo

  • Gigabyte
  • ****
  • Mensajes: 264
  • Reputación: +22/-0
    • Ver Perfil
Re:Solucion para a las dobles comillas o tildes
« Respuesta #2 en: Mayo 26, 2014, 04:02:30 pm »
Claro, depende del motor de base de datos.
Yo particularmente trabajo con SQL Server, me ha pasado que dentro del algun valor venga una comilla, o alguna coma (delimitador de campo, o parametro de un SP)  y "rompan" la sintax SQL.
Lo que hago dentro del VB es reemplazar los caracteres con un REPLACE, justo antes de ejecutar las instruccion SQL,
por ej las ' o '' las reemplazo por un ´ es como un acento.

sSQL = REPLACE(sSQL, "'" , "`")

raul338

  • Terabyte
  • *****
  • Mensajes: 894
  • Reputación: +62/-8
  • xD fan!!!!! xD
    • Ver Perfil
    • Raul's Weblog
Re:Solucion para a las dobles comillas o tildes
« Respuesta #3 en: Mayo 27, 2014, 10:05:39 am »
En realidad no se debería permitir ese tipo de caracteres en campos simples (nombres, etc) pero una forma de hacerlo bien y sin reinventar la rueda es utilizar procedimientos por parámetros:

Código: (SQL) [Seleccionar]
SELECT nombre, apellido, descripcion FROM personas WHERE descripcion LIKE @paramDescripcion
y luego desde donde lo llames (ado, php con extension mysqli, etc) le pasas algo similar

Código: [Seleccionar]
comando.parametros.add("@paramDescripcion", txtBusqueda.text)
y listo, el mismo motor de la BD se encarga de escaparlo y como debería estar probado no tendrías mucho drama ni consecuencias raras al probarlo ;)

Nota: Tanto la conexión, como los strings que pasas (utf desde vb) como la base de datos deben tener la misma codificación sino vas a tener símbolos raros al leer/guardar valores... Asegura eso y no tendrás problemas en nada
« última modificación: Mayo 27, 2014, 10:13:54 am por raul338 »

Waldo

  • Gigabyte
  • ****
  • Mensajes: 264
  • Reputación: +22/-0
    • Ver Perfil
Re:Solucion para a las dobles comillas o tildes
« Respuesta #4 en: Mayo 27, 2014, 10:24:39 am »
Muy bueno Raul! Es verdad lo que comentas de usar un Command desde VB para ejecutar y pasar parámetros. Pero yo por vago  ;D, me da fiaca escribir el codigo de agregar cada parametro al command, armo un string concatenando todo y desp pasan estas cosas :)

LeandroA

  • Administrador
  • Petabyte
  • *****
  • Mensajes: 1128
  • Reputación: +151/-8
    • Ver Perfil
Re:Solucion para a las dobles comillas o tildes
« Respuesta #5 en: Mayo 28, 2014, 11:16:57 pm »
Hola chicos gracias por las respuestas, lo que explico Raul la verdad no lo entendi, por el momento opte hacer un simple remplece con un caracter especial
Código: [Seleccionar]
Replace$(Word, Chr$(39), Chr$(1))
y luego hago la inversa, no me parece una buena solución ya que si tuviera que mostrar muchos datos de una gran consulta al restaurar todas las " podría consumir algo de tiempo, pero bueno sale con fritas

Waldo

  • Gigabyte
  • ****
  • Mensajes: 264
  • Reputación: +22/-0
    • Ver Perfil
Re:Solucion para a las dobles comillas o tildes
« Respuesta #6 en: Mayo 29, 2014, 10:33:21 am »
Hola Leandro, si reemplazas por el chr(96) ` o el chr(180) ´, creo que no tendrias que volver a reemplazar para mostrarlo, se visualizan "casi" como una comilla.

Lo que explica Raul es ejecutar las intrucciones usando un ADODB.COMMAND.
A un COMMAND le podes decir que tipo de intruccion va a ejecutar (Texto, storeprocedure ... ) y si es un storeprocedure que lleva parámetros, podes declarar estos parametros en el COMMAND, indicando que tipo de parametro es (numerico, texto, etc) y.... hasta podes declarar un parametro como OUT, para recibir el valor return de un storeprocedure.

Segun Raul esta forma es la correcta, ya que el motor recibe cada parametro como corresponde y no se "cortaria" la instruccion si tuviese una coma en el medio.


E N T E R

  • Petabyte
  • ******
  • Mensajes: 1062
  • Reputación: +57/-13
  • www.enterpy.com
    • Ver Perfil
    • www.enterpy.com
Re:Solucion para a las dobles comillas o tildes
« Respuesta #7 en: Mayo 29, 2014, 11:09:58 am »
Tendrian un ejemplo de como utilizar lo que comenta Raul yo siempre tuve tambien ese problema.

Yo solucionaba con esto del Replace tambien asi:

Código: (VB) [Seleccionar]
Public Function Reemplazar(ByVal StrCad As String) As String
    'CARACTERES NO ADMITIDOS POR WINDOWS =   \/:*?"<>|
    StrCad = Replace(StrCad, "\", "-")
    StrCad = Replace(StrCad, "/", "-")
    StrCad = Replace(StrCad, ":", "-")
    StrCad = Replace(StrCad, "*", "-")
    StrCad = Replace(StrCad, "<", "-")
    StrCad = Replace(StrCad, ">", "-")
    StrCad = Replace(StrCad, "|", "-")
    StrCad = Replace(StrCad, " ", "-")
    StrCad = Replace(StrCad, """", "-")
    Reemplazar = StrCad
End Function
CIBER GOOGLE - CONCEPCIÓN PARAGUAY
www.enterpy.com
Primera regla de la programacion, para que vas a hacerlo complicado si lo puedes hacer sencillo

Waldo

  • Gigabyte
  • ****
  • Mensajes: 264
  • Reputación: +22/-0
    • Ver Perfil
Re:Solucion para a las dobles comillas o tildes
« Respuesta #8 en: Mayo 29, 2014, 11:32:24 am »
Hola copio una parte de codigo que tenia por ahi....
Fijense en CommandText se indica el sp que va a ejecutar,
 CommandType indica que es un SP,
luego se crean los parametros, cada parametro lleva el nombre del parametro, el tipo de dato,  si corresponde su longitud y por ultimo el valor del parametro.
Luego se ejecuta con Execute

Código: (VB) [Seleccionar]
       Set adoCmd = New ADODB.Command
        With adoCmd
            .ActiveConnection = modSQL_Cnn.cnn
            .CommandText = "update_zona_by_suc"
            .CommandType = adCmdStoredProc
           
            .Parameters.Append .CreateParameter("@Id_Suc", adInteger, adParamInput, , lId_Suc_Destino)
            .Parameters.Append .CreateParameter("@NumZona", adTinyInt, adParamInput, , xZona)
            .Parameters.Append .CreateParameter("@ZonaDesc", adVarChar, adParamInput, 50, rsTemp("ZonaDesc"))
            .Parameters.Append .CreateParameter("@Habilitada", adBoolean, adParamInput, , rsTemp("Habilitada"))
           
            .Execute iRec
           
        End With

raul338

  • Terabyte
  • *****
  • Mensajes: 894
  • Reputación: +62/-8
  • xD fan!!!!! xD
    • Ver Perfil
    • Raul's Weblog
Re:Solucion para a las dobles comillas o tildes
« Respuesta #9 en: Mayo 30, 2014, 12:12:51 am »
Esta lindo el código que tiro Waldo, aunque hay algo que quiero aclarar: No hace falta crear un procedimiento almacenado. Basta con poner la consulta como la que puse (así tal cual o como la que iría dentro del stored procedure).
Si creas un stored procedure ganas en rendimiento (porque la consulta ya esta precompilada) pero si la mandas en texto es lo mismo en terminos de "seguridad"

Ej
Código: (VB) [Seleccionar]
Set adoCmd = New ADODB.Command
With adoCmd
    .ActiveConnection = modSQL_Cnn.cnn
    .CommandText = "SELECT nombre, apellido, descripcion FROM personas WHERE nombre LIKE '%@nombre%'"
    .CommandType = adCmdText
   
    .Parameters.Append .CreateParameter("@nombre", adVarChar, adParamInput, 50, txtNombre.Text)
    .Execute iRec
End With

Ojo: Creo que Access es el único que no permite esto... pero no estoy seguro... Si permite llamadas a procedimientos almacenados con parametros

Waldo

  • Gigabyte
  • ****
  • Mensajes: 264
  • Reputación: +22/-0
    • Ver Perfil
Re:Solucion para a las dobles comillas o tildes
« Respuesta #10 en: Mayo 30, 2014, 10:56:27 am »
Ah..mira vos, no sabia que se podia poner directamente un SELECT con parametros.
Lo que me molesta un poco, es tener que escribir todo ese rollo para cada consulta, me gustaria armar una rutinita para poder reutilizarla, pero no se me ocurre como standarizar el pase de los parametros, ya que son variables, y pueden ser de diferente tipo cada parametro.
Habia pensado pasar como parametro un Array o Coleccion de parametros. O tal vez lo mejor seria declarar el parametro de la rutina diractemente como objeto adodb.parameters, no se,  habria que estudiarlo un poco  ::)

Waldo

  • Gigabyte
  • ****
  • Mensajes: 264
  • Reputación: +22/-0
    • Ver Perfil
Re:Solucion para a las dobles comillas o tildes
« Respuesta #11 en: Mayo 30, 2014, 05:25:26 pm »
Bueno, como no me queria quedar con la duda, probé de ejecutar un procedimiento, pasando un parametro varchar, conteniendo comillas simples y dobles, comas, etc
1er caso: Directamente con el connection.execute

    cnn.Execute "EXEC [sysLog_ADD] @Origen=1, @Tipo_Ev=1, @Descripcion='Hola '1234,456;789'""ABC"""

Resultado:
Error! sintaxis incorrecta cerca de 1234


2do caso: usando el command (como dice Raul) creando un parametro varchar, y pasando dentro del parametro el contenido con comillas.

 
Código: (VB) [Seleccionar]
   Dim cmd As ADODB.Command
   
    Set cmd = New ADODB.Command
    cmd.ActiveConnection = cnn
    cmd.CommandType = adCmdStoredProc
    cmd.CommandText = "sysLog_ADD"
    cmd.Parameters.Append cmd.CreateParameter("@Origen", adSmallInt, adParamInput, , 1)
    cmd.Parameters.Append cmd.CreateParameter("@Tipo_Ev", adSmallInt, adParamInput, , 1)
    cmd.Parameters.Append cmd.CreateParameter("@Descripcion", adVarChar, adParamInput, 50, "Hola '1234,456;789'""ABC""")
    cmd.Execute

Resultado: INSERT OK

Conclusion: despues de años de usar Ado y VB, me doy cuenta que siempre falta aprender algo  ;D

LeandroA

  • Administrador
  • Petabyte
  • *****
  • Mensajes: 1128
  • Reputación: +151/-8
    • Ver Perfil
Re:Solucion para a las dobles comillas o tildes
« Respuesta #12 en: Junio 07, 2014, 06:07:23 pm »
Hola la verdad muy lindo todo pero no se de que me hablan  :)
yo lo único que conozco es esta forma de insertar datos

Código: [Seleccionar]
sSQL = "INSERT INTO TitulosEnCola (Nombre, Interprete, Genero, Duracion, IdTerminal, IdCategoria, PathDeOrigen) VALUES " & _
    "('" & RW(sTitulo) & "','" & RW(sInterprete) & "','" & RW(sGenero) & "','" & nDuracion & "','" & CboTerminales.ItemData(CboTerminales.ListIndex) & "','" & CboCategorias.ItemData(CboCategorias.ListIndex) & "','" & RW(sFileName) & "')"

    cnnBD1.Execute sSQL, , adCmdText

donde
Código: [Seleccionar]
Public Function RW(Word As String) As String
    RW = Replace$(Word, Chr$(39), Chr$(1))
End Function

Public Function UW(Word As String) As String
    UW = Replace$(Word, Chr$(1), Chr$(39))
End Function

utlizo Access y Adob

SKL

  • Administrador
  • Kilobyte
  • *****
  • Mensajes: 52
  • Reputación: +9/-2
  • GRIPE A
    • Ver Perfil
Re:Solucion para a las dobles comillas o tildes
« Respuesta #13 en: Junio 10, 2014, 09:57:09 pm »
Hola la verdad muy lindo todo pero no se de que me hablan  :)
yo lo único que conozco es esta forma de insertar datos

Código: [Seleccionar]
sSQL = "INSERT INTO TitulosEnCola (Nombre, Interprete, Genero, Duracion, IdTerminal, IdCategoria, PathDeOrigen) VALUES " & _
    "('" & RW(sTitulo) & "','" & RW(sInterprete) & "','" & RW(sGenero) & "','" & nDuracion & "','" & CboTerminales.ItemData(CboTerminales.ListIndex) & "','" & CboCategorias.ItemData(CboCategorias.ListIndex) & "','" & RW(sFileName) & "')"

    cnnBD1.Execute sSQL, , adCmdText

donde
Código: [Seleccionar]
Public Function RW(Word As String) As String
    RW = Replace$(Word, Chr$(39), Chr$(1))
End Function

Public Function UW(Word As String) As String
    UW = Replace$(Word, Chr$(1), Chr$(39))
End Function

utlizo Access y Adob


Para que reemplazas??? no hace falta... los Textos van con comilla simple, los numeros sin nada y las fechas con HASH #.... yo no reemplazo nada, le mando fruta asi nomas exactamente de la misma manera que vos... sacale la funcion de RW a todos y vas a ver que funciona igual... a menos que el string ya contenta comillas desde antes.... igual no tendria sentido

Waldo

  • Gigabyte
  • ****
  • Mensajes: 264
  • Reputación: +22/-0
    • Ver Perfil
Re:Solucion para a las dobles comillas o tildes
« Respuesta #14 en: Junio 11, 2014, 09:47:33 am »
Para que reemplazas??? no hace falta... los Textos van con comilla simple, los numeros sin nada y las fechas con HASH #.... yo no reemplazo nada, le mando fruta asi nomas exactamente de la misma manera que vos... sacale la funcion de RW a todos y vas a ver que funciona igual... a menos que el string ya contenta comillas desde antes.... igual no tendria sentido

Fijate que pasa si uno de los datos string contiene una coma... el motor va a pensar que esa coma es la separacion de un campo y te va a dar error