Italian Query impossibile

Oldmanenzo

Member
Licensed User
Longtime User
Dopo milioni di query sono andato completamente in tilt e non riesco a trovare l'errore o soluzione
questa la struttura della tabella nel database
B4X:
CREATE TABLE "spese" (
    "ID_Spese" INTEGER PRIMARY KEY AUTOINCREMENT,
    "Data" INTEGER NOT NULL DEFAULT (0),
    "Mese" TEXT NOT NULL DEFAULT (''),
    "Corone" REAL NOT NULL DEFAULT (0),
    "Euro" REAL NOT NULL DEFAULT (0),
    "Note" TEXT NOT NULL DEFAULT ('')
)

questa la query

B4X:
query="INSERT INTO spese VALUES (, " & data & ", '" & TxtMese.Text & "', " & TxtCorone.Text & ", " & TxtEuro.Text &", '" & TxtNote.Text & "')"

la prima virgola che vedete dopo il VALUES
se non la metto mi dice che i campi sono 6 ma i valori immessi 5 e la cosa che mi stupisce essendo il primo campo AUTOINCREMENT non dovrebbe essere inserito o almeno con altri db ho fatto sempre cosi

se la inserisco, come mostrato in esempio, mi dice errore di sintassi vicino la ","

io non riesco a capire dove sto sbagliando
Grazie a tutti
Enzo
 

Oldmanenzo

Member
Licensed User
Longtime User
chiedo scusa ho dimenticato di scrivere che data è un variabile long che esprime la data in ticks
 

imgsimonebiliato

Well-Known Member
Licensed User
Longtime User
Prova così:

B4X:
INSERT INTO spese (Data, Mese, Corone, Euro, Note)

VALUES (" data & ", '" & TxtMese.Text & "', " & TxtCorone.Text & ", " & TxtEuro.Text &", '" & TxtNote.Text & "')"
 

Oldmanenzo

Member
Licensed User
Longtime User
Provato e mancando l'unione prima della variabile " & data" va in errore durante la compilazione
errore di sintassi. Ma questo è ovvio e credo che sia una dimenticanza da parte tua, comunque lo stesso non funzione
ed in questo caso, dichiarando i campi dopo INSERT INTO l'errore che da e errore di sintassi dopo la "," ma di quale virgola parli
non lo so. Il dubbio che mi sovviene e che al momento la conversione da corone ad euro non viene effettuata e quindi la queri si ritrova
con ", ," essendo il campo vuoto, ma ho provato a togliere la variabile TxtEuro.text ed inserire al suo posto un valore 0
e nemmeno funziona
 

Oldmanenzo

Member
Licensed User
Longtime User
Questo è l'esatto errore che mi da SQL

B4X:
Error occurred on line: 18 (Varie)
android.database.sqlite.SQLiteException: near ",": syntax error (code 1): , while compiling: INSERT INTO spese (Data, Mese, Corone, Euro, Note) VALUES (1455750000000, 'Febbraio', 320, , 'prova')
    at android.database.sqlite.SQLiteConnection.nativePrepareStatement(Native Method)
    at android.database.sqlite.SQLiteConnection.acquirePreparedStatement(SQLiteConnection.java:1093)
    at android.database.sqlite.SQLiteConnection.prepare(SQLiteConnection.java:670)
    at android.database.sqlite.SQLiteSession.prepare(SQLiteSession.java:588)
    at android.database.sqlite.SQLiteProgram.<init>(SQLiteProgram.java:59)
    at android.database.sqlite.SQLiteStatement.<init>(SQLiteStatement.java:31)
    at android.database.sqlite.SQLiteDatabase.executeSql(SQLiteDatabase.java:1795)
    at android.database.sqlite.SQLiteDatabase.execSQL(SQLiteDatabase.java:1726)
    at anywheresoftware.b4a.sql.SQL.ExecNonQuery(SQL.java:67)
    at java.lang.reflect.Method.invoke(Native Method)
    at java.lang.reflect.Method.invoke(Method.java:372)
    at anywheresoftware.b4a.shell.Shell.runVoidMethod(Shell.java:712)
    at anywheresoftware.b4a.shell.Shell.raiseEventImpl(Shell.java:340)
    at anywheresoftware.b4a.shell.Shell.raiseEvent(Shell.java:244)
    at java.lang.reflect.Method.invoke(Native Method)
    at java.lang.reflect.Method.invoke(Method.java:372)
    at anywheresoftware.b4a.ShellBA.raiseEvent2(ShellBA.java:132)
    at anywheresoftware.b4a.BA.raiseEvent2(BA.java:175)
    at anywheresoftware.b4a.BA.raiseEvent(BA.java:171)
    at anywheresoftware.b4a.objects.ViewWrapper$1.onClick(ViewWrapper.java:78)
    at android.view.View.performClick(View.java:5156)
    at android.view.View$PerformClick.run(View.java:20755)
    at android.os.Handler.handleCallback(Handler.java:739)
    at android.os.Handler.dispatchMessage(Handler.java:95)
    at android.os.Looper.loop(Looper.java:145)
    at android.app.ActivityThread.main(ActivityThread.java:5832)
    at java.lang.reflect.Method.invoke(Native Method)
    at java.lang.reflect.Method.invoke(Method.java:372)
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1399)
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1194)
 

imgsimonebiliato

Well-Known Member
Licensed User
Longtime User
Bisognerebbe vedere cosa inserisce realmente..
Il log insomma
 

Oldmanenzo

Member
Licensed User
Longtime User
a chi puo interessare risolto
in effetti txteuro.text veniva forzato a stringa nulla perche al momento non vi è conversione e va in errore
mentre inserendo uno 0 al posto della variabile nulla va bene.
Anche se non capisco, essendo stringa nulla dovrebbe essere valore null.
Comunque questa è la soluzione.
 

LucaMs

Expert
Licensed User
Longtime User
uso ExecNonQuery
Dai un'occhiata alla versione 2. Passi i parametri tramire un array e non ti impicchi con virgolette, spazi, etc. ;)

upload_2016-2-18_16-40-24.png
 

Luciano Veneziano

Active Member
Licensed User
Longtime User
quando ho problemi con SQL preferisco scomporre la query in due o più pezzi.
Ho sempre risolto così.
 

LordZenzo

Well-Known Member
Licensed User
Longtime User
a chi puo interessare risolto
in effetti txteuro.text veniva forzato a stringa nulla perche al momento non vi è conversione e va in errore
mentre inserendo uno 0 al posto della variabile nulla va bene.
Anche se non capisco, essendo stringa nulla dovrebbe essere valore null.
Comunque questa è la soluzione.
infatti ma hai dichiarato nel database NOT NULL
 

Oldmanenzo

Member
Licensed User
Longtime User
infatti ma hai dichiarato nel database NOT NULL
e vero, ma è anche vero che ho detto di ritenere il campo nullo come valore 0 a questo per evitare che in caso di campo vuoto
il database inserisse il valore NULL che è tutt'altra cosa da gestire, null non è valore 0 o stringa vuota ma è valore null e va preso con le molle.
 

LordZenzo

Well-Known Member
Licensed User
Longtime User
e vero, ma è anche vero che ho detto di ritenere il campo nullo come '' ovvero stringa nulla questo per evitare che in caso di campo vuoto
il database inserisse il valore NULL che è tutt'altra cosa da gestire, null non è valore 0 o stringa vuota ma è valore null e va preso con le molle.
ti dico un segreto, NULL, null, vuoto, mi hanno sempre dato errori a non finire, meglio evitarli come la peste o dichiararli possibili e gestirli ne codice
 

LucaMs

Expert
Licensed User
Longtime User
quando ho problemi con SQL preferisco scomporre la query in due o più pezzi.
Ho sempre risolto così.

Un modo decente SAREBBE:

1) crei una classe, Spesa;
2) Query = "INSERT INTO Spesa VALUES(?,?,?...)"
3) ExecNonQuery2(Query, Array As Object(objSpesa.Data, objSpesa.Mese, objSpesa.Pincopallo))


[qui non prendo in considerazione Null, autoincrement, etc... "parlo" in generale, mi sembra pulito ed "elegante"]
 

LucaMs

Expert
Licensed User
Longtime User
Anzi, a dire la verità, sarebbe meglio ancora se i comandi per inserimenti, cancellazioni, etc. fossero nella classe stessa! (e quindi la query non avrebbe objSpesa.Data, etc ma questo è meno importante).
 

Picena Informatica

Active Member
Licensed User
Longtime User
Note non è forse una parola riservata? Forse ricordo male....
 
Top