database - Cómo usar parámetros con nombre dentro del patrón de operador LIKE en Adobe Air
sqlite (3)
Quería usar un marcador de posición de parámetro con nombre dentro del patrón de operador LIKE para que la cadena de argumento se escape correctamente.
Aquí está mi código modificado donde estoy usando el marcador de posición at-param:
var stmt = new air.SQLStatement ();
stmt.text = "SELECT * FROM comments WHERE title LIKE ''% @ search%'';";
stmt.parameters ["@ search"] = "argumento cadena";
stmt.execute ();
Al hacerlo, produce un SQLError con los siguientes detalles
mensaje: Error # 3315: error de SQL.
detalles: nombre (s) del parámetro ''@search'' encontrados en la propiedad parameters pero no en el SQL especificado
Como sugirió Mike Petty, probé:
stmt.text = ''SELECT * FROM comments WHERE title LIKE "@% search%";'';
Que cede a los mismos detalles de error de SQL.
La documentación tiene esto:
expr :: = (column-name | expr) LIKE patrón
patrón :: = ''[cadena | % | _] ''
Mi sospecha es que se omite debido a los qoutes, ¿alguna idea sobre cómo hacer que funcione?
Encontré una solución para esto, básicamente, en lugar de hacerlo así:
var stmt = new air.SQLStatement();
stmt.text = "SELECT * FROM comments WHERE title LIKE ''%@search%'';";
stmt.parameters["@search"] = "argument string";
stmt.execute();
Debe colocar un marcador de posición para todo el patrón de operador LIKE y vincular el patrón como parámetro.
var stmt = new air.SQLStatement();
stmt.text = "SELECT * FROM comments WHERE title LIKE @search;";
stmt.parameters["@search"] = "%" + userInput + "%";
stmt.execute();
Es difícil de decir a partir de su pregunta, pero ¿su declaración actual arroja un SQLError, simplemente no compila o simplemente no arroja ningún resultado?
Si tuviera que adivinar, diría que tienes algunos problemas aquí:
- No debería tener que calificar la columna en la cláusula where ya que solo tiene 1 tabla para seleccionar desde
- La cadena de parámetros es técnicamente una palabra reservada por AIR / Actionscript (aunque el caso es diferente), todavía un poco confuso.
Aunque la documentación y el código le permiten usar los dos puntos o el símbolo al-at, mi preferencia es @ porque es un poco más fácil de ver;)
No olvide agregar una definición itemClass de la clase que espera para las filas; esto ayuda a evitar objetos anónimos.
Esto debería ser bastante sencillo:
var stmt:SQLStatement = new SQLStatement();
stmt.itemClass = Comment;
stmt.text = ''SELECT * FROM comments WHERE title LIKE "@%search%";'';
stmt.parameters[''@search''] = userInput.text;
stmt.addEventListener(SQLEvent.RESULT, onResults);
stmt.execute();
Retire su: cadena de su cadena.
Me gusta funciona bien como:
SELECT * FROM comments WHERE comments.title LIKE ''%string%'';