Access - Problema Comilla con ADO en sintaxis SQL

 
Vista:

Problema Comilla con ADO en sintaxis SQL

Publicado por The Emulator (146 intervenciones) el 24/07/2007 20:44:23
Hola

Tengo una pregunta hace algun tiempo y no he econtrado solucion a esta.

Usando ADO si yo creo la sentencia SQL concatenando los valores de los campos (Cajas de texto) como hago para que si el usuario escribio algun caracter especial SQL en este caso comilla o comillas dobles me permita guardar el regitro, ya que al concatenar toda la SQL daria errores de sintaxis por los caracteres especiales que escribio el usuario.

Por ejemplo
Si tengo una caja de texto y el usuario escribe esto
Hola " Mundo

Al crear yo la sentencia SQL seria algo como esto

strSQL="INSERT INTO tblDatos (Mensaje) VALUES ('" & txtMensaje & "');"

El resultado de crear esa SQL seria:

INSERT INTO tblDatos (Mensaje) VALUES ('Hola " Mundo');

Aqui ya se puede ver que en la consulta SQL hay un error porque existen unas comillas dobles que no cierran y que ademas esta en medio de las comillas sencillas, por tal razon al ejecutarla se produce el error de sitaxis.

Entonces que puedo hacer para solucionar ese tipo de error.

De una vez descartar la opcion de buscar en la cadena y remplazar los caracteres especiales por otros porque no creo que Access haga eso cuando tiene una tabla vinculada a un formularo. ademas eso implicaria mucho mas trabajo porque tendria que implementarce lo del remplazo en todos los formularios, reportes ETC......................................... ya sea para remplazar y para restaurar los caracteres.

Espero alguien me pueda ayudar en esto

Saludos y gracias.
http://www.theemulator.tk
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder

RE:Problema Comilla con ADO en sintaxis SQL

Publicado por felix (183 intervenciones) el 24/07/2007 21:20:42
wenas yo no entiendo mucho pero a lo mejor podias añadir las comillas con chr$
quizas funcione......
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Problema Comilla con ADO en sintaxis SQL

Publicado por daqniel (1 intervención) el 18/09/2007 17:02:08
que me envien revistas virtuales a mi coreo todo sobre ado..........
sql
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Problema Comilla con ADO en sintaxis SQL

Publicado por Enrique (1299 intervenciones) el 24/07/2007 22:00:30
Creo que Felix está en lo cierto, se trataría de sustituir las comillas dobles que forman parte del código por Chr(34) o Chr$(34) que es su código ASCII, quedando así:

strSQL="INSERT INTO tblDatos (Mensaje) VALUES (' & chr$(34) & txtMensaje & chr$(34)');"

El caracter ASCII de las comillas simples es: Chr(39) o Chr$(39), por si tambien hubiera que sustituirlas.

Prueba con esto que casi seguro que por aquí está la solución.

Saludos
Enrique
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Problema Comilla con ADO en sintaxis SQL

Publicado por The Emulator (146 intervenciones) el 24/07/2007 22:31:04
Hola

Gracias por responder pero llegamos al mismo problema porque en ese punto se esta creando la cadena SQL luego de eso sera el mismo resultado ya que al concatenar " o chr(34) al final de nuevo obtendremos INSERT INTO tblDatos (Mensaje) VALUES ('Hola " Mundo');

Saludos
http://www.theemulator.tk
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Problema Comilla con ADO en sintaxis SQL

Publicado por felix (183 intervenciones) el 25/07/2007 01:09:29
ummmmmmm.....
haber prueva asi

strSQL="INSERT INTO tblDatos (Mensaje) VALUES ('" & txtMensaje.text & "');"
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Problema Comilla con ADO en sintaxis SQL

Publicado por The Emulator (146 intervenciones) el 25/07/2007 05:18:14
Hola

Creo que seguimos en lo mismo, lo que hay que tener en cuenta es el resultado que se va a obtener en la consulta SQL dependiendo lo que el usuario escribo en la caja de texto ya que si en la caja de texto se escriben comillas estas van a interferir con la sintaxis SQL que se cree, osea que aqui no hay que mirar si las comillas se colocan con chr(34) o concatenando " , ya que si el usuario escribe Hola " Mundo (Notemos las comillas que estan en medio de estas dos palabras) al crear la SQL concatenando el contenido de la caja de texto vamos a tener siempre el mismo error de SQL

strSQL="INSERT INTO tblDatos (Mensaje) VALUES ('Hola " Mundo');"

Veamoslo tambien como si estuvieramos usando el Query Analaizer de MSQL o el mismo editor de consultas de Access colocando la intruccion SQL diretamene
INSERT INTO tblDatos (Mensaje) VALUES ('Hola " Mundo');
Aqui no tiene que ver con con codigo VBA ni nada por el estilo esta simplemente la instruccion SQL y es aqui donde se puede ver el error que digo ya que hay unas comilas dobles que no se cierran y estas son las que el usuaio ingreso.

Gracias de todas formas por responder.

Saludos
http://www.theemulator.tk
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Problema Comilla con ADO en sintaxis SQL

Publicado por Félix (183 intervenciones) el 25/07/2007 10:24:20
wenas mira yo lo prove y funcion las comillas son asi:
' " & txtMensaje.text & " '
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Problema Comilla con ADO en sintaxis SQL

Publicado por The Emulator (146 intervenciones) el 25/07/2007 14:12:48
Hola

Gracias por tomarte la molestia de seguir respondiendo.

Bueno con comillas dobles funciona pero el error aparece con comilla sencilla :S

Veamos un poco mas detenidos que pasa
tengo el codigo de VBA que es este
strSQL="INSERT INTO tblDatos (Mensaje) VALUES ('" & txtMensaje.Value & "');"
Si el usuario escribe Hola ' Mundo (Ahora notar que no es comilla doble sino sencilla)
la SQL que se genera es esta
INSERT INTO tblDatos (Mensaje) VALUES ('Hola ' Mundo');

Ahora analicemos esta sentencia SQL.
Como sabemos para esecificar en SQL que vamos a almacenar un dato de tipo texto se hace con comillas sencillas ' Texto a guardar ', ahora revisando la SQL generada podemos ver que hay 3 comillas sencillas esto quiere decir que ya no se va a guardar el valor 'Hola ' Mundo' sino 'Hola ' porque la comilla que el usuario escribio SQL la entiende como si fuera la comilla que esta cerrando la cadena de texto entonces el texto que sigue a continuacion Mundo ' es el que provoca el error porque eso no es ya ni una cadena de texto ni un comando de SQL.

Si no es mucha molestia podrias hacer esto para que veas ensi cual es el problema
Crea una tabla llamada tblDatos
Ahora para esa tabla crea un Campo Mensaje de tipo texto
ahora crea una consulta Menu Insertar->Consulta->Vista de diseno.

Ya teniendo la ventana para crear la consulta ve al menu Ver->Vista SQL, de esta forma llegamos al editor de sentencias SQL, ahora simplemente pega esto alli
INSERT INTO tblDatos (Mensaje) VALUES ('Hola ' Mundo');
Y por ultimo ejecuta esta consulta(Menu Consulta->Ejecutar).
Al hacer eso podemos ver el error que digo
Syntax error (missin operator) in query expresion''Hola ' Mundo');'.

Saludos y gracias de nuevo
http://www.theemulator.tk
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Problema Comilla con ADO en sintaxis SQL

Publicado por Enrique (1299 intervenciones) el 25/07/2007 17:54:49
Vamos a probar de otra forma. Tienes una Tabla de nombre tblDatos con un campo de nombre Mensaje. Ahora create un Formulario con un cuadro de Texto de nombre txtFrase y un botón de comando de nombre Insertar y luego en el Evento Click del botón Insertar pones esto:

Private Sub Insertar_Click()
Dim SQL As String
SQL = "INSERT INTO tblDatos (Mensaje) VALUES ("""" & txtFrase & """")"
DoCmd.RunSQL SQL
End Sub

En el Cuadro de Texto del formulario escribe la frase que quieras incluyendo cualquier caracter especial ( comilla simple, comillas dobles, signo &, signo %etc. ) y luego pulsa el botón a ver que pasa.

Saludos
Enrique
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Problema Comilla con ADO en sintaxis SQL

Publicado por The Emulator (146 intervenciones) el 25/07/2007 18:38:37
Hola

Gracias por responder.
Ya probe lo que me dices y funciona ya que al probarlo no hay problema con los caracteres especiales en este caso con la comilla sencilla y doble, pero trate de adaptarlo a lo que yo uso (Connection,Command y Recorset) y lo dejo tal cual lo colocaste y al ejecutar la SQL me sale un error de que no se especificaron valores para unos campos.
La SQL no la ejecuto en este caso con DoCmd.RunSQL SQL sino con un comando que yo creo cmdComando.Exetute

Trate de modificarla quitandole unas comillas dobles a cada lado y me funciona si el usuario escribe comillas sencillas pero ahora si el usuario escribe comillas dobles vuelve y sale el mismo error porque ya seria unas comillas dobles sin cerrar. :'(

No me creeras pero llevo TIEMPO buscando una solucion a eso.


Saludos y gracias
http://www.theemulator.tk
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Problema Comilla con ADO en sintaxis SQL

Publicado por mi menda (1111 intervenciones) el 26/07/2007 00:21:50
El sql no es mi fuerte (por el lio de las comillas y concatenaciones)pero puedes probar a sustituir las comillas simples, por dobles comillas con la funcion Replace()
sería algo así:
Values(Replace(campo,"'","''"))
ya ves que no soy muy concreto, pero te lo comento porque lo he visto en algún libro que tengo, en el que hay una función para poder insertar texto con una comilla (O'Neill; O'Hara)etc...
De todas formas sí no das con ello, mañana lo busco, y te pongo aquí la función.
Seguro que tú la sacaras provecho.

Un saludo
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Problema Comilla con ADO en sintaxis SQL

Publicado por The Emulator (146 intervenciones) el 26/07/2007 02:26:16
Que tal Mi Menda.

Gracias por la ayuda.

Como comentaba en algun mensaje anterior si utilizo el metodo de remplazar los caracteres que el usuario escribe me toca implementar esto mismo al momento de mostrar de nuevo los datos ya sea formulario o reporte entonces era por eso que queria mirar otro tipo de solucion.

Sera que lo que quiero no se puede hacer y estoy perdiendo el tiempo?
Entonces como lo hace el Access????

Yo se que hay otra forma de hacerlo pero lleva mas trabajo y es por medio del recordset
MiRecorset.AddNew
MiRecordSet!Mensaje=txtMensaje.Value
MiRecorset.UpDate

De esa forma no hay problema ya que no se esta creando una consulata SQL, pero es que yo cree una Clase que se encarga de toda la conectividad a la BD (Conectar,Deconectar,Consultar,Insertar,Borrar,Editar) y esta la uso desde cualquier formulario o modulo para manejar la conexion de una manera mas facil y mucho mas automatica, pero esta funciona siempre usando consultas SQL, pero tengo este problema de los caracteres especales.

De todas formas gracias por la ayuda porque cualquier aporte me puede llevar a alguna solucion.

Saludos
http://www.theemulator.tk
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Problema Comilla con ADO en sintaxis SQL

Publicado por mi menda (1111 intervenciones) el 26/07/2007 04:29:48
Bueno aunque me parece que no te va a servir,he hecho lo siguiente:

INSERT INTO tblDatos ( Mensaje )
SELECT Forms!Formulario1!txtMensaje AS Expr1

pero la ejecuto con:

DoCmd.OpenQuery "Consulta2", acViewNormal, acAdd

porque con ADO estoy en pañales.

A ver si suena la flauta.

Un Saludo
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Problema Comilla con ADO en sintaxis SQL

Publicado por The Emulator (146 intervenciones) el 26/07/2007 13:51:41
Hola

Pues eso funciona bien pero quiere decir que me toca crear 2 consultas por cada formulario (Agregar/Editar).

Es una buena idea voy a mirar que cosa se me ocurre para poder reutilizar eso y que con una o dos consultas funcione para todos :S.

Ya trate de utiizar esa sentencia SQL para usarla con lo que tengo(la clase que mencione) pero me sale un error de que no se especificaron valores para unos campos, y es que quiero adaptarla a lo que ya tengo Comando.Execute y no a DoCmd.OpenQuery lo que no entiendo es porque @%#! funciona con una consulta que esta guardada en la BD y no con una consulta que se ejecuta desde un Command de ADO si se supone que las dos son la misma sentencia SQL.

Sera seguir cacharreando.

Gracias :-)

Saludos
http://www.theemulator.tk
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:ya lo tengo

Publicado por mi menda (1111 intervenciones) el 26/07/2007 18:58:22
Creo que es esto lo que búscabas.
Pensando un poco, la cosa parece sencilla:

Private Sub EjecutarAnexados_Click()

Dim malditas_comillas_simples As Integer
Dim malditas_comillas As String ' valor a insertar

Dim miDB As ADODB.Connection
Set miDB = CurrentProject.Connection

'Comprobamos sí el campo contiene comillas simples
'--------------------****-------------------------

malditas_comillas_simples = InStr(Me.txtMensaje, "'" )

If malditas_comillas_simples = 0 Then
' Para comillas dobles y sin comillas
malditas_comillas = Me.txtMensaje
Else
' Para comillas simples, o comillas simples más comillas dobles
malditas_comillas = Replace(Me.txtMensaje, "'", "''")
End If

' Ejecutamos
miDB.Execute ("Insert Into tblDatos Values ( ' " & malditas_comillas & " ' )")

miDB.Close
Set miDB = Nothing

MsgBox "CONSEGUIDO"

End Sub

Espero haber acertado, porque esto funciona.

Un Saludo
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:ya lo tengo

Publicado por The Emulator (146 intervenciones) el 27/07/2007 13:41:49
Hola

Tienes razon con lo de "malditas_comillas" jejejejejje

Ya estube provando y adivina?????????????????

YA SIRVEEEEEEEEEEEEEEEEEEEEEEEEEEEE :-)

Adapte lo que colocaste a lo que tengo y parece que funciona a la perfeccion.

Esa duda la tenia hace mucho tiempo y por mas que buscaba y preguntaba no encontraba como solucionarla, ademas siempre tenia problemas en eso ya fuera desde Visual Basic, Java o .Net usando Access, MSQL o MySQL el unico ambiente donde no molesta es usando PHP y MySQL.

TE LO AGRADESCO MUCHO.
Cualquier cosa en la que te pueda ayudar me dices.

Saludos y gracias.
http://www.theemulator.tk
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:ya lo tengo

Publicado por mi menda (1111 intervenciones) el 02/08/2007 01:48:36
Como dije anteriormente "PENSANDO UN POCO...", pero "PENSANDO BIEN", se da uno cuenta que el código que puse es una autentica chapuza.

¿Para que comprobar con la función Instr()sí el campo contiene comillas simples, sí la función Replace() ya lo hace por si sola?

Podriamos decir que la función Replace()es una especie de función Instr() + sustitución.
Con lo que el código quedaría más sencilo con solo:

miDB.Execute ("Insert Into tblDatos(Mensaje) Values('" & Replace(txtMensaje, "'", "''") & " ')")

Bueno..., esta aclaración es para que quede la cosa como Dios manda.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar