• Lunes 23 de Diciembre de 2024, 14:28

Autor Tema:  Problemon Con Sql  (Leído 1365 veces)

chryobcn

  • Miembro activo
  • **
  • Mensajes: 26
    • Ver Perfil
Problemon Con Sql
« en: Lunes 17 de Mayo de 2004, 18:12 »
0
Saludos

Estoy un poco puteado ya que si en los textbox introducen un nombre con una comilla simple me jode la sintaxis sql causando un error en el programa y no se como remediarlo.

Un ejemplo del tipo de codigo que utilizo es:

Código: Text
  1. strSQL = "INSERT INTO servei (nom,descripcio,estat,codi_carrec) VALUES('" + txtField(1).Text + "','" + txtField(2).Text + "','" + Estat + "'," & codCargo & ")"
  2.  

las consultas y ejecuciones las ejecuto desde unas funciones que son:
Código: Text
  1.  
  2. Public Function openRs(ByVal strSQL As String) As Recordset
  3.     Dim rsAux As New Recordset
  4.     Dim errLoop As Error
  5.    
  6.     On Error GoTo Err_Execute
  7.    
  8.     If GetStateRs(cnConexion.State) = "Closed" Then
  9.         If conexionBD = False Then
  10.             MsgBox "Ha ocurrido un error en la conexión con la base de datos" + vbCr _
  11.             + "Este error finalizará la ejecución de la aplicación, si el problema persiste avise al Administrador", vbCritical, "Error Grave"
  12.             End
  13.         End If
  14.     End If
  15.    
  16.     With rsAux
  17.         .Source = strSQL
  18.         .ActiveConnection = cnConexion
  19.         .CursorLocation = adUseClient
  20.         .CursorType = adOpenKeyset
  21.         .LockType = adLockOptimistic
  22.         .Open strSQL
  23.     End With
  24.    
  25.     If GetStateRs(rsAux.State) = "Open" Then
  26.         Set openRs = rsAux
  27.     End If
  28.    
  29.     On Error GoTo 0
  30.  
  31.     Exit Function
  32.  
  33. Err_Execute:
  34.  
  35.    ' Notifica al usuario cualquier error resultante tras
  36.    ' ejecutar la consulta.
  37.    If cnConexion.Errors.Count > 0 Then
  38.       For Each errLoop In cnConexion.Errors
  39.          MsgBox "Número de error: " & errLoop.Number & vbCr & _
  40.             errLoop.Description, vbCritical
  41.       Next errLoop
  42.    End If
  43.    Set openRs = Nothing
  44. End Function
  45.  
  46. Public Function execSQL(ByVal strSQL As String) As Integer
  47.     Dim cmdRs As New Command
  48.    
  49.     Dim errLoop As Error
  50.    
  51.     If GetStateRs(cnConexion.State) = "Closed" Then
  52.         If conexionBD = False Then
  53.             MsgBox "Ha ocurrido un error en la conexión con la base de datos" + vbCr _
  54.             + "Este error finalizará la ejecución de la aplicación, si el problema persiste avise al Administrador", vbCritical, "Error Grave"
  55.             End
  56.         End If
  57.     End If
  58.    
  59.     ' Borra los errores ajenos de la colección Errors.
  60.     cnConexion.Errors.Clear
  61.  
  62.     With cmdRs
  63.         .ActiveConnection = cnConexion
  64.         .CommandText = strSQL
  65.         .CommandType = adCmdText
  66.     End With
  67.    
  68.     On Error GoTo Err_Execute
  69.     cmdRs.Execute execSQL
  70.     On Error GoTo 0
  71.  
  72.     Exit Function
  73.  
  74. Err_Execute:
  75.  
  76.    ' Notifica al usuario cualquier error resultante tras
  77.    ' ejecutar la consulta.
  78.    If cnConexion.Errors.Count > 0 Then
  79.       For Each errLoop In cnConexion.Errors
  80.          MsgBox "Error número: " & errLoop.Number & vbCr & _
  81.             errLoop.Description, vbCritical
  82.       Next errLoop
  83.    End If
  84.    
  85.    Resume Next
  86. End Function
  87.  
  88.  

Aunque las funciones me detecten el error luego al trabajar con los recordsets me falla. Al tenerlo centralizado por estas dos funciones hay alguna forma de solventar este error solo modificando estas dos funciones y sino me conformaria con modificar los sql si me decis como.

Gracias por vuestra ayuda

elmango80

  • Miembro MUY activo
  • ***
  • Mensajes: 149
  • Nacionalidad: ve
    • Ver Perfil
Re: Problemon Con Sql
« Respuesta #1 en: Lunes 17 de Mayo de 2004, 23:52 »
0
Ese es un gran problema que tiene las sentencias SQL y hay varias formas simples de solucionar el problema, la mas comun es evitar que el usuario pueda introducir el caracter ' dentro del texto:

Código: Text
  1.  
  2. Private Sub txtNombre_KeyPress(KeyAscii As Integer)
  3.     If Chr(KeyAscii) = "'" Then
  4.         KeyAscii = 0
  5.     End If
  6. End Sub
  7.  
  8.  

O en lugar de evitar que el usuario pueda introducir el caracter ' puedes antes de almacenar el valor en una variable o utilizarlo cambiarlo por el caracter que prefieras o eliminarlo:

Código: Text
  1.  
  2. strNombre = Replace(txtNombre.Text, "'", "")
  3.  
  4.  

:angel: ----- O ----- :devil:
Citar
No soy bueno, tampoco soy malo sino todo lo contrario...

chryobcn

  • Miembro activo
  • **
  • Mensajes: 26
    • Ver Perfil
Re: Problemon Con Sql
« Respuesta #2 en: Martes 18 de Mayo de 2004, 21:32 »
0
Saludos

Me han comentado una forma un poco machaca que es poniendo algo como:

Código: Text
  1.  
  2. INSERT INTO tabla (campo1,campo2) VALUES("+""""+var+""""+",....)
  3.  
  4.  

No es exactamente asi y no lo consigo sacar, si alguien conoce la sintaxis correctamente se lo agradeceria.

Brroz

  • Miembro de PLATA
  • *****
  • Mensajes: 1058
    • Ver Perfil
Re: Problemon Con Sql
« Respuesta #3 en: Jueves 20 de Mayo de 2004, 15:09 »
0
Código: Text
  1.  
  2. Dim strSQL as string
  3.  
  4. strSQL = "INSERT INTO tabla (campo1,campo2) " _
  5. & "VALUES( '" & replace(variableTexto,"'","''") & "' , " & variableNum & ")"
  6.  
  7.  
  8.  

Remplazar cada comilla simple ' por dos comillas simples ''.

Abur.