Problema SQLite

martedì 31 gennaio 2012 - 09.50
Tag Elenco Tags  VB.NET  |  .NET 4.0

nicktheone Profilo | Newbie

Salve ragazzi, anzitutto un complimentone per il sito.

Vi espongo il mio problema: sto creando un programma per la gestione di uno stabilimento balneare ed in particolare i vari abbonamenti ma essendo alle primi armi con la gestione dei database sto avendo qualche problema, probabilmente stupidissimo, a cui non riesco a venire a capo.
Il problema salta fuori quando l'utente cerca di modificare una riga del database: in pratica eseguendo
Il codice sorgente non è stato renderizzato qui
perchè non c'è sufficiente spazio.
Clicca qui per visualizzarlo in una nuova finestra

ottengo
Cast non valido dalla stringa "DELETE FROM Clienti WHERE index=" al tipo 'Double'.

come mai?

Ovviamente il datagridview è popolato con i dati del DB e la cella che uso contiene la chiave primaria della riga che voglio andare a modificare.

alx_81 Profilo | Guru

>Salve ragazzi, anzitutto un complimentone per il sito.
ciao e benvenuto su dotnethell.it!

>"DELETE FROM Clienti WHERE index='" + frmClienti.DataGridView1.CurrentRow.Cells(0).Value+ "'"
>ottengo
>Cast non valido dalla stringa "DELETE FROM Clienti WHERE index=" al tipo 'Double'.
>come mai?
non conosco SQLite, però questo è un errore che non sembra relativo al db.. A me sembra proprio che stai cercando di valorizzare una variabile double con la stringa che hai passato..
possibile? Puoi farci vedere tutta la parte di codice?
--
Alessandro Alpi | SQL Server MVP
MCP|MCITP|MCTS|MCT

http://www.alessandroalpi.net
http://blogs.dotnethell.it/suxstellino
http://mvp.support.microsoft.com/profile/Alessandro.Alpi

nicktheone Profilo | Newbie

grazie per il benvenuto!
provo ad esporre meglio il problema anche se non sono sicuro di quanto possa essere chiaro dopo qualche caffè corretto con la sambuca

ho un form tramite il quale l'utente può eseguire una ricerca tra i vari clienti inseriti nel DB (un textbox e un pulsante) che poi vengono visualizzati in un DataGridView che viene popolato così

Il codice sorgente non è stato renderizzato qui
perchè non c'è sufficiente spazio.
Clicca qui per visualizzarlo in una nuova finestra

detto questo l'utente può fare doppio click su una qualsiasi delle righe che rappresenta un cliente e viene portato su un altro form che contiene i dati del cliente selezionato

frmModificaCliente.txtboxNome.Text = DataGridView1.CurrentRow.Cells(1).Value frmModificaCliente.txtboxCognome.Text = DataGridView1.CurrentRow.Cells(2).Value frmModificaCliente.txtboxIndirizzo.Text = DataGridView1.CurrentRow.Cells(3).Value frmModificaCliente.txtboxTelefono.Text = DataGridView1.CurrentRow.Cells(4).Value frmModificaCliente.txtboxEmail.Text = DataGridView1.CurrentRow.Cells(5).Value frmModificaCliente.txtboxNote.Text = DataGridView1.CurrentRow.Cells(6).Value frmModificaCliente.ShowDialog()

il problema sorge quando tramite il secondo form (quello usato per modificare il cliente) provo a fare un UPDATE o un DELETE usando come riferimento la primary key del cliente in modo da modificare o cancellare la voce nel DB; la primary key è contenuta nella prima colonna del DataGridView del primo form ed il codice che provo ad usare è il seguente

Il codice sorgente non è stato renderizzato qui
perchè non c'è sufficiente spazio.
Clicca qui per visualizzarlo in una nuova finestra

come dici tu non sembra che il problema sia collegato a SQLite in particolare ma non capisco perché dovrebbe trattare la variabile della key come double, senza contare che ho provato già a passarla anche come int ed il risultato è lo stesso.

spero qualcuno di voi possa aiutarmi perché sto sbattendo la testa su questo problema da qualche giorno e non capisco il perché, se non posso usare la PK tanto vale usare un DB XML come ho già fatto ma mi ci vorrebbe molto di più

schumy2000 Profilo | Junior Member

Per come ho visto io....

Il codice sorgente non è stato renderizzato qui
perchè non c'è sufficiente spazio.
Clicca qui per visualizzarlo in una nuova finestra

Perché hai messo il double tra apici?
-------------------------------------------------------------------------------------------------------------
Talvolta un pensiero mi annebbia l'Io: sono pazzi gli altri o sono pazzo io?
A. Einstein

nicktheone Profilo | Newbie

parli del valore dopo
index=
?

l'ho fatto perché credo sia così la sintassi corretta; in ogni caso anche senza apici non cambia nulla, il problema è altrove..

alx_81 Profilo | Guru

>l'ho fatto perché credo sia così la sintassi corretta; in ogni
>caso anche senza apici non cambia nulla, il problema è altrove..
il fatto che le apici non ci vogliano dipende dal tipo del campo index, se esso è numerico, allora non ci vogliono, se è stringa, servono.
Togliendole l'errore è sempre lo stesso? La riga che genera l'errore qual è di preciso? quanto vale il campo della form? o meglio, hai debuggato sul valore che vai a concatenare?

--
Alessandro Alpi | SQL Server MVP
MCP|MCITP|MCTS|MCT

http://www.alessandroalpi.net
http://blogs.dotnethell.it/suxstellino
http://mvp.support.microsoft.com/profile/Alessandro.Alpi

schumy2000 Profilo | Junior Member

gli apici solitamente vanno sono solamente nelle stringhe....

mi sembra strano definire un double come chiave....potresti portarlo ad INT e provarlo senza apici?

Ciao.
-------------------------------------------------------------------------------------------------------------
Talvolta un pensiero mi annebbia l'Io: sono pazzi gli altri o sono pazzo io?
A. Einstein

nicktheone Profilo | Newbie

allora ragazzi, grazie per quello che state facendo per me, lo sapevo che siete dei grandi.

il valore della primary key che è contenuto nel DB è int quindi non capisco da dove salti fuori questo double e lo è anche quello preso dal DataGridView; i valori non sono niente di strano, nel caso dello screen era semplicemente 19


1366x768 311Kb


inoltre ho anche cercato di passare direttamente un valore senza andarlo a pescare dal DataGridView, ma ugualmente mi da' lo stesso errore; stessa cosa quando ho provato senza apici.

se pensate vi possa essere d'aiuto vi allego anche il file coi sorgenti

schumy2000 Profilo | Junior Member

il
frmClienti.DataGridView1.CurrentRow.Cells(0).Value

ti ritorna un object(almeno in c#) dovresti tentare di castarlo, anche se ti avrebbe dovuto dare un errore quando hai tentanto di eguagliarlo ad una valore int (intero); cmq tenta ugualmente di castarlo ad Intero(con la classe Convert dovrebbe essere lo stesso in VB.)
Dim key as Integer=Convert.ToInt32(frmClienti.DataGridView1.CurrentRow.Cells(0).Value)

Poi guarda il tipo di dati per quanto riguarda la colonna "index" della tabella Clienti non sono sicuro sia un intero...
-------------------------------------------------------------------------------------------------------------
Talvolta un pensiero mi annebbia l'Io: sono pazzi gli altri o sono pazzo io?
A. Einstein

nicktheone Profilo | Newbie

grazie, bel tentativo ma avevo già provato a fare quello che dici diversamente ma anche con la tua soluzione il risultato non cambia..
per quanto riguardo il tipo della colonna "index" il mio editor me lo segna come INTEGER e non può essere diversamente essendo una primary key.

sto seriamente uscendo matto con questa storia, non capisco dove sbaglio e non riesco a trovare un esempio simile su internet: è incredibile, non mi sembra di cercare di fare niente di strano, sto solo scegliendo una riga di un DB in base alla PK, credo che sia la cosa più normale in un DB.
se avete delle soluzioni alternative sono aperto a tutte le possibili varianti ma quello della PK mi sembrava l'unico metodo per modificare con sicurezza il DB evitando di incappare in problemi a causa di omonimie..

schumy2000 Profilo | Junior Member

Allora non so proprio che dirti...non sono mai incappato in questi tipi di errore..
Speriamo qualcun'altro del sito possa darti una mano...a me non viene in mente altro...
-------------------------------------------------------------------------------------------------------------
Talvolta un pensiero mi annebbia l'Io: sono pazzi gli altri o sono pazzo io?
A. Einstein

lbenaglia Profilo | Guru

>Cast non valido dalla stringa "DELETE FROM Clienti WHERE index="
>al tipo 'Double'.
>
>come mai?

Ciao,

Sono più di 10 anni che non programmo e potrei dire una bestiata, ma non è bello concatenare una stringa con un int utilizzando l'operatore +, in quanto VB tenterà di castare implicitamente la stringa in intero.
Hai provato ad utilizzare la & al posto del + avendo cura di castare esplicitamente key a stringa (con il metodo .ToString o la funzione CStr())?

Ciao!
--
Lorenzo Benaglia
Microsoft MVP - SQL Server
http://blogs.dotnethell.it/lorenzo/

schumy2000 Profilo | Junior Member

effettivamente se vai a vedere qui
http://msdn.microsoft.com/it-it/library/te2585xw%28v=vs.80%29.aspx

ti dice che può generare quell'eccezione che hai detto...


guarda questo qui sotto che ho trovato


Se un'espressione è di tipo numerico e l'altra è una stringa in VB6:
- Se Option Strict è On, verrà generato un errore del compilatore.
- Se Option Strict è Off, verranno eseguite la conversione implicita di String in Double e la somma
- Se String non può essere convertito in Double, verrà generata un'eccezione InvalidCastException.


puoi vederlo meglio col link

http://msdn.microsoft.com/it-it/library/9c5t70w2.aspx

-------------------------------------------------------------------------------------------------------------
Talvolta un pensiero mi annebbia l'Io: sono pazzi gli altri o sono pazzo io?
A. Einstein

nicktheone Profilo | Newbie

probabilmente abbiamo fatto un passo avanti, nel senso che ho provato ad usare "&" anziché "+" ed in effetti il problema è cambiato: ora mi restituisce un semplice errore di sintassi, quindi posso dire che il problema della variabile lo abbiamo risolto.

adesso il problema è capire perché una stringa tanto semplice quanto
"DELETE FROM Clienti WHERE index=" & key
mi possa restituire un errore di sintassi; ho anche provato a sostituire la variabile key con un numero qualsiasi che rappresentasse un valore compreso nella colonna ed il risultato è lo stesso.
a questo punto mi sorge il dubbio che io non possa accedere alla colonna della primary key neanche solo per leggerla, visto che ho provato con altre colonne e non ho questo intoppo.

alx_81 Profilo | Guru

1) Grande Lorenzo ci era proprio sfuggito!

>adesso il problema è capire perché una stringa tanto semplice
>quanto "DELETE FROM Clienti WHERE index=" & key mi possa restituire
>un errore di sintassi; ho anche provato a sostituire la variabile
>key con un numero qualsiasi che rappresentasse un valore compreso
>nella colonna ed il risultato è lo stesso.
>a questo punto mi sorge il dubbio che io non possa accedere alla
>colonna della primary key neanche solo per leggerla, visto che
>ho provato con altre colonne e non ho questo intoppo.
Hai provato a debuggare per vedere cosa ottieni da quella concatenazione e cosa c'è nella variabile key?
--
Alessandro Alpi | SQL Server MVP
MCP|MCITP|MCTS|MCT

http://www.alessandroalpi.net
http://blogs.dotnethell.it/suxstellino
http://mvp.support.microsoft.com/profile/Alessandro.Alpi

schumy2000 Profilo | Junior Member

Ma no....almeno il tutti i tipi di DB con cui ho lavorato(Oracle, SQLServer, MySQL e "access") la sintassi corretta è quella che m'hai detto te....
prova a cancellarlo direttamente dall'interfaccia del DB(se c'è), se funziona significa che il problema sta nel programma
-------------------------------------------------------------------------------------------------------------
Talvolta un pensiero mi annebbia l'Io: sono pazzi gli altri o sono pazzo io?
A. Einstein

nicktheone Profilo | Newbie

non ci sto capendo più nulla.
a questo punto so di per certo che il problema è di sintassi perché il problema con la variabile non si è più ripresentato ma al contempo mi restituisce lo stesso
generico errore di sintassi sia se eseguo la query tramite il mio programma sia col programma che uso per gestire il DB.
eppure sono sicuro che
"DELETE FROM Clienti WHERE index='20'"
sia la sintassi corretta....

alx_81 Profilo | Guru

>non ci sto capendo più nulla.
>a questo punto so di per certo che il problema è di sintassi
>perché il problema con la variabile non si è più ripresentato
>ma al contempo mi restituisce lo stesso
>generico errore di sintassi sia se eseguo la query tramite il
>mio programma sia col programma che uso per gestire il DB.
>eppure sono sicuro che "DELETE FROM Clienti WHERE index='20'"
>sia la sintassi corretta....
puoi passarci l'errore? puoi togliere le apici, se è numerico non servono..
--
Alessandro Alpi | SQL Server MVP
MCP|MCITP|MCTS|MCT

http://www.alessandroalpi.net
http://blogs.dotnethell.it/suxstellino
http://mvp.support.microsoft.com/profile/Alessandro.Alpi

nicktheone Profilo | Newbie

te lo passerei volentieri l'errore ma semplicemente mi dice che c'è un errore di sintassi e niente più, con o senza apici.
faccio un ultimo tentativo e poi, per quanto possa essere assurdo, provo a mandare una email a quelli di SQLite, chi meglio di loro può dirmi dove sbaglio?

nicktheone Profilo | Newbie

non ci posso credere, ho risolto
la cosa sembra assurda ma il momento in cui ho cambiato il nome alla colonna della primary key mettendo "Id" al posto di "Index" tutto si è risolto.
evidentemente index è una parola riservata o qualcosa del genere e quindi mi impediva di usarla.

in ogni caso grazie mille dell'aiuto, siete stati fantastici, aspettatevi di rivedermi presto e spesso con i miei prossimi problemi.

schumy2000 Profilo | Junior Member

mi ricordo una cosa simile con Access.
Avevo messo un campo su una tabella chiamandolo Note, ma la query mi falliva...poi ho capito il perché , era una parola riservata.

Cmq buon per te...ciao.
-------------------------------------------------------------------------------------------------------------
Talvolta un pensiero mi annebbia l'Io: sono pazzi gli altri o sono pazzo io?
A. Einstein

alx_81 Profilo | Guru

>mi ricordo una cosa simile con Access.
>Avevo messo un campo su una tabella chiamandolo Note, ma la query
>mi falliva...poi ho capito il perché , era una parola riservata.
se fosse sql server ti direi usa le parentesi quadre [index] = ...
ma non so se vale per tutti come carattere di escape..

--
Alessandro Alpi | SQL Server MVP
MCP|MCITP|MCTS|MCT

http://www.alessandroalpi.net
http://blogs.dotnethell.it/suxstellino
http://mvp.support.microsoft.com/profile/Alessandro.Alpi
Partecipa anche tu! Registrati!
Hai bisogno di aiuto ?
Perchè non ti registri subito?

Dopo esserti registrato potrai chiedere
aiuto sul nostro Forum oppure aiutare gli altri

Consulta le Stanze disponibili.

Registrati ora !
Copyright © dotNetHell.it 2002-2017
Running on Windows Server 2008 R2 Standard, SQL Server 2012 & ASP.NET 3.5