Italian stringa sql errata

3394509365

Active Member
Licensed User
qualcuno mi dice perchè è sbagliato, mi da questo log ma io non vedo errori.

SELECT ID As [ID], Prog As [Prog], Titolo As [Titolo], Altro As [Altro] FROM [Birrino ]
ExecuteHtml: SELECT ID As [ID], Prog As [Prog], Titolo As [Titolo], Altro As [Altro] FROM [Birrino ] WHERE Titolo = 'Amore che prendi amore che dai'
Error occurred on line: 153 (gestionetbl)
android.database.sqlite.SQLiteException: near "WHERE": syntax error (code 1): , while compiling: SELECT ID FROM [Birrino ] ORDER BY Titolo ASC WHERE Titolo = 'Amore che prendi amore che dai'
at android.database.sqlite.SQLiteConnection.nativePrepareStatement(Native Method)
at android.database.sqlite.SQLiteConnection.acquirePreparedStatement(SQLiteConnection.java:892)
at android.database.sqlite.SQLiteConnection.prepare(SQLiteConnection.java:503)
at android.database.sqlite.SQLiteSession.prepare(SQLiteSession.java:726)
at android.database.sqlite.SQLiteProgram.<init>(SQLiteProgram.java:58)
at android.database.sqlite.SQLiteQuery.<init>(SQLiteQuery.java:37)
at android.database.sqlite.SQLiteDirectCursorDriver.query(SQLiteDirectCursorDriver.java:44)
at android.database.sqlite.SQLiteDatabase.rawQueryWithFactory(SQLiteDatabase.java:1415)
at android.database.sqlite.SQLiteDatabase.rawQuery(SQLiteDatabase.java:1354)
at anywheresoftware.b4a.sql.SQL.ExecQuery2(SQL.java:167)
at anywheresoftware.b4a.sql.SQL.ExecQuery(SQL.java:155)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:515)
at anywheresoftware.b4a.shell.Shell.runMethod(Shell.java:485)
at anywheresoftware.b4a.shell.Shell.raiseEventImpl(Shell.java:229)
at anywheresoftware.b4a.shell.Shell.raiseEvent(Shell.java:174)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:515)
at anywheresoftware.b4a.ShellBA.raiseEvent2(ShellBA.java:93)
at anywheresoftware.b4a.BA.raiseEvent(BA.java:157)
at StageList.DB.gestionetbl$ResumeMessage.run(gestionetbl.java:254)
at android.os.Handler.handleCallback(Handler.java:733)
at android.os.Handler.dispatchMessage(Handler.java:95)
at android.os.Looper.loop(Looper.java:136)
at android.app.ActivityThread.main(ActivityThread.java:5103)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:515)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:790)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:606)
at dalvik.system.NativeStart.main(Native Method)
** Activity (main) Resume **
** Activity (main) Pause, UserClosed = false **
 

LucaMs

Expert
Licensed User
metti la ORDER BY alla fine della query.

SELECT ID FROM [Birrino ] WHERE Titolo = 'Amore che prendi amore che dai' ORDER BY Titolo ASC

(il nome della tabella, Birrino, contiene uno spazio in fondo?!?)
 

3394509365

Active Member
Licensed User
si effettivamente il problema era quello, sembrerebbe che l' order by vada alla fine dopo il where

adesso mi da questo errore quando cerco un titolo che nel testo ha l' apice '

android.database.sqlite.SQLiteException: near "ordine": syntax error (code 1): , while compiling: SELECT ID As [ID], Prog As [Prog], Titolo As [Titolo], Altro As [Altro] FROM [Lista Nomadi] WHERE Titolo = 'L' ordine dall' alto'

mi pare di aver visto da qualche parte che non sono l' unico ad avere questo problema

qualcuno ha idea ?
 

LucaMs

Expert
Licensed User
adesso mi da questo errore quando cerco un titolo che nel testo ha l' apice '

android.database.sqlite.SQLiteException: near "ordine": syntax error (code 1): , while compiling: SELECT ID As [ID], Prog As [Prog], Titolo As [Titolo], Altro As [Altro] FROM [Lista Nomadi] WHERE Titolo = 'L' ordine dall' alto'

E' molto più comodo usare le "versioni 2" dei comandi, in questo caso ExecQuery2
B4X:
Dim Query As String
Query = "SELECT ID As [ID], Prog As [Prog], Titolo As [Titolo], Altro As [Altro] FROM [Lista Nomadi] WHERE Titolo = ?"
DB.ExecQuery2(Query, Array As String("L' ordine dall' alto"))

In pratica, passi alcuni parametri in un Array stringa, i quali andranno a sostituire i punti interrogativi. Questo dovrebbe scongiurare il problema degli apici.
(Ovviamente puoi scrivere tutto su una riga ma a me non piace :))
 

sirjo66

Well-Known Member
Licensed User
adesso mi da questo errore quando cerco un titolo che nel testo ha l' apice '

qualcuno ha idea ?
Gli apici devono essere raddoppiati, quindi devi trovarti con:
SELECT ID As [ID], Prog As [Prog], Titolo As [Titolo], Altro As [Altro] FROM [Lista Nomadi] WHERE Titolo = 'L''ordine dall''alto'

Quando vai a costruire la tua stringa devi eseguire un Replace e dirgli che se trova gli apici deve metterli doppi, ora non ho sottomano B4A ma una cosa del genere:

B4X:
stringadiricerca = "L'ordine dall'alto"
SQLcomando = "SELECT ID As [ID], Prog As [Prog], Titolo As [Titolo], Altro As [Altro] FROM [Lista Nomadi] WHERE Titolo = '" & stringadiricerca.Replace("'","''") & "'"
Ciao
Sergio
 

FabioRome

Member
Licensed User
si effettivamente il problema era quello, sembrerebbe che l' order by vada alla fine dopo il where

adesso mi da questo errore quando cerco un titolo che nel testo ha l' apice '

android.database.sqlite.SQLiteException: near "ordine": syntax error (code 1): , while compiling: SELECT ID As [ID], Prog As [Prog], Titolo As [Titolo], Altro As [Altro] FROM [Lista Nomadi] WHERE Titolo = 'L' ordine dall' alto'

mi pare di aver visto da qualche parte che non sono l' unico ad avere questo problema

qualcuno ha idea ?
per ovviare la gestione degli apici nelle stringhe SQL usa la funzione encodeUrl:

B4X:
Dim su As StringUtils
Dim encodeUrl As String

tmpQuery = su.encodeUrl (tmpQuery, "UTF8")
 
Top