Query inserimento asp.net

giovedì 08 gennaio 2009 - 22.04

BlackJad Profilo | Newbie

Ragazzi sto impazzendo con un problema assurdo ... praticamente ho fatto una piccola pagina con un DIV che poi devo inserire tramite iFrame in tutte le altre, questo div contiene 2 campi, un gruppo di 2 radiobutton ed un pulsante, perchè in pratica mi serve per far inserire/cancellare le persone da una mailing list.

Sto facendo il meccanismo di inserimento ma quando viene eseguita la query viene generato un errore come se mancassero i parametri, però penso sia tutto corretto ... ho anche messo un paio di etichette che per conferma mi riportano il testo della query e la stringa di connessione.

Posto qua il codice:

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

Quando eseguo la pagina e clicco sul pulsante, viene restituita questa eccezione:

Errore: System.Data.OleDb.OleDbException: Errore di sintassi (operatore mancante) nell'espressione della query '08/01/2009 21.55.50'. in System.Data.OleDb.OleDbCommand.ExecuteCommandTextErrorHandling(OleDbHResult hr) in System.Data.OleDb.OleDbCommand.ExecuteCommandTextForSingleResult(tagDBPARAMS dbParams, Object& executeResult) in System.Data.OleDb.OleDbCommand.ExecuteCommandText(Object& executeResult) in System.Data.OleDb.OleDbCommand.ExecuteCommand(CommandBehavior behavior, Object& executeResult) in System.Data.OleDb.OleDbCommand.ExecuteReaderInternal(CommandBehavior behavior, String method) in System.Data.OleDb.OleDbCommand.ExecuteNonQuery() in odceccatanzaro.it.ml.Button1_Click(Object sender, EventArgs e) in C:\Users\Michele\Documents\Visual Studio 2008\Projects\odceccatanzaro.it\odceccatanzaro.it\ml.aspx.cs:riga 36

Praticamente riconosce come inviato solo il parametro della data ... mentre tutti gli altri dall'errore sembra non ci siano, mentre compaiono correttamente nella stampa della query!

Cosa può esserci di sbagliato!?!?!

valerik Profilo | Junior Member

Ciao

il problema dovrebbe essere in questa stringa;
string sql = "INSERT INTO lista ([nome],[email],[attivo],[data_inserimento]) VALUES (" + nome + "," + mail + ",si," + System.DateTime.Now + ")";
dovresti vedere cosa ti restituisce "sql".
Cosi' ad occhio, prova a levare l'ultimo +.

valerik

BlackJad Profilo | Newbie

Eh no quello è necessario perchè bisogna concatenare la parentesi tonda chiusa ...

kontax Profilo | Junior Member

Non so com'è fatta la struttura della tua tabella, ma così ad occhio direi che il problema è che devi inserire fra apici il si : , 'si', .
Quindi:
string sql = "INSERT INTO lista ([nome],[email],[attivo],[data_inserimento]) VALUES (" + nome + "," + mail + ",'si'," + System.DateTime.Now + ")";
Facci sapere..e se non funziona magari dacci maggiori informazioni sulla struttura della tabella.
Ah, magari dai un'occhiata ai dati con cui fai l'insert, per assicurarti che ad esempio non contengano apici e in generale per l'sql injection, se necessario. E credo sia meglio se parametrizzi i parametri (tanto che ci siamo, una domanda ai luminari del forum.. in due parole, si possono sapere tutti i vantaggi di usare le query parametriche?). Magari butta un'occhiata qui http://msdn.microsoft.com/en-us/library/ms998271.aspx .
Ciao


BlackJad Profilo | Newbie

Guarda quel "si" praticamente si trova li per caso ... perchè se noti nel codice poco sopra c'è una stringa "stato" inizializzata a "si" ... proprio perchè la ci andava il valore di quella variabile ... ho pensato di metterlo direttamente giusto perchè era condizionato alla selezione dell'inserimento/cancellazione e mi risparmio una variabile in memoria.
All'inizio cmq era messo proprio racchiuso negli apici singoli, ma dato che l'errore usciva lo stesso, avevo provato a toglierli.

Il db in questione è in access, la tabella ha come campi: ID, nome, email, stato, data_inserimento,data_cancellazione ... tutti i campi sono testo, tranne ID che è intero autoincrementale e le 2 date, che sono nel formato data generica.

kontax Profilo | Junior Member

Allora, ho provato velocemente a ricostruirmi la tabellina e a far andare il codice..
Pare che il problema sia derivante dalla data e dall'oledb

Il codice sorgente non è stato renderizzato qui
perchè non c'è sufficiente spazio.
Clicca qui per visualizzarlo in una nuova finestra
Così l'inserimento mi funziona. spero che ti serva, poi ovviamente modificati il codice il modo da tornare alla struttura originaria con i try catch, le textbox, etc..
Ah, la stringa di connessione magari non dichiararla in ogni funzione che accede al DB, ma in maniera globale (se non l'hai messa solo come esempio).
Se qualcosa non va ancora, fammi sapere.
Ciao

BlackJad Profilo | Newbie

Ok ti ringrazio per il momento. Ora non sono più alla workstation altrimenti avrei provato subito. Domattina modifico il codice e posto subito il risultato.

Grazie ancora per l'aiuto! ;)

BlackJad Profilo | Newbie

Ok, ho seguito il tuo consiglio, grazie 1000 ora funziona

Peeeeerò ... c'è una cosa "simpatica" che non capisco da dove arriva ... in pratica ... l'inserimento lo fa doppio ... cioè inserisce i dati 2 volte ... però non capisco il perchè dato che richiamo executenonquery() una sola volta ... qua il codice:
Il codice sorgente non è stato renderizzato qui
perchè non c'è sufficiente spazio.
Clicca qui per visualizzarlo in una nuova finestra

L'unica istruzione per inserire la query compare chiaramente, ma nn capisco perchè inserisce 2 record nel db ... :S

kontax Profilo | Junior Member

Hmm..
Guarda, ti posso dire l'unica cosa che mi viene in mente, per esperienza personale..E' possibile che tu abbia la funzione che fa l'inserimentoad esempio sull'OnClick di un bottone, e anche su un evento come OnTextChanged, OnSelectedIndexChanged di un altro controllo?Ad esempio una RadioButtonList con Autopostback=false e OnSelectedIndexChanged ="funzione"?
Perchè in tal caso, in un solo postback potrebbe venire lanciata due volte l'esecuzione.
Altrimenti, col codice che ho visto, non mi viene proprio in mente nient'altro..

BlackJad Profilo | Newbie

Guarda la pagina aspx che comanda il tutto, ha solo questo codice

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

C'è un gruppo di radiobutton ma non ho associato alcun evento ... idem per le textbox ... l'unica cosa è il button che ha associato l'evento onClick con il codice che hai visto prima per fare l'inserimento ...

A me viene in mente di inserire tutto il codice globalmente in una istruzione if(!page.isPostBack) ... mi sembra sia così ... altro proprio non saprei!

kontax Profilo | Junior Member

Allora, vacci di debug.
Metti un breakpoint dopo il cmd.ExecuteNonQuery() , e fai partire il debug.
Quando parte la funzione, dovrebbe passarci due volte da quel punto. Se ce ne passa solo una, controlla quante righe sostiene di aver modificato il cmd. ExecuteNonQuery.
Se ci passa due volte, a questo punto posta anche tutta la pagine col codice, se c'è solo il form dell'inserimento..

BlackJad Profilo | Newbie

Ho fatto come suggerito, ma non da errori ... passa i valori solo una volta ... però nel db sono messi in 2 record ... bah ...

Questo è il codice della pagina aspx ... che io richiamo tramite un iFrame in tutte le altre pagine del sito

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

Questo invece è il codice per intero in c#, che ancora ovviamente non ho completato ... giusto per risolvere un problema alla volta ...

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

Ma può essere un problema legato all'iFrame ?!?!

kontax Profilo | Junior Member

Nel page_load!
Togli Button1.Click += new EventHandler(this.Button1_Click);
Non ti serve dirgli di gestire l'evento, lo fai già dalla parte aspx!
Fammi sapere!

BlackJad Profilo | Newbie

Esatto ... ora inserisce i record una sola volta ... che scemo ... l'avevo messo li perchè per un errore precedente non succedeva nulla ... e volevo forzare in qualche modo la gestione dell'evento ... che pacco!

Grazie 1000 !!!
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-2024
Running on Windows Server 2008 R2 Standard, SQL Server 2012 & ASP.NET 3.5