Newsgroup: it.comp.lang.visual-basic
Titolo: ADO.net + VB.net Query sincrone...o roba simile!

Sto parlando di 
asp.net
 ma son solo dettagli....il problema è con il
database!
Ho instalato il sistema di membership di microsoft (per usare i
controlli login)...solo che non l'ho fatto con SQLserver...ma con
access (sono povero...il server web mi teno quello di aruba standard)
Ma son solo dettagli...passo al problema!
Ho un mdb
Ho 2 tabelle
aspnet_users e aspnet_Membership
Per inserire un nuovo utente la lgica è
PRIMA inserisci un record in aspnet_User
ti fai dare l'ID
 POI
inserisci altri dati in aspnet_Membership compreso l'ID
Quidi mi sono detto
Ho 3 query
1) INSERT in aspnet_user
2) SELECT in aspnet_user per recuperare l'id nuovo
3) INSERT in aspnet_Membership
Però se fallisce?...o beh...transazione!!!
il codice ve lo purgo il più possibile ma è questo
   Private Sub EsegueMemorizzazione()
        'memorizza record
        Dim AppId As Long
        Dim Msql1 As String
        Dim Msql2 As String
        Dim Msql3 As String
        Dim IDtemp As Long
        Dim t As OleDbTransaction
        'APPid contiene il codice dell'applicazione...pe ora si trova
a mano
        'dovrebbe essere 3
        AppId = 3
        'Necessari vari passaggi
        Msql1 = "INSERT INTO aspnet_Users "
        Msql1 += "(UserName, ApplicationID) "
        Msql1 += "VALUES "
        Msql1 += "( "
        Msql1 += "'" + Me.txtUsername.Text + "', "
        Msql1 += "" + AppId.ToString + ""
        Msql1 += ")"
        Msql2 = "SELECT * FROM aspnet_Users WHERE Username='" + Trim
(Me.txtUsername.Text) + "'"
        ' Response.Write("<hr>Debug<hr>")
        'Response.Write(Msql1 + "<hr>" + Msql2 + "<hr>" + Msql3 +
"<hr>")
        'Response.End()
QUI PRIMA HO FATTO STAMPARE E PROVATO LE QUERY!
SINGOLARMENTE SU ACCESS NON LE RIFIUTA!
DA DENTRO ACCESS SONO "GIUSTE"!
        ' ho queste cose da fare in sequenza quindi
        Using Myconn As New OleDbConnection(tcon)
            Dim p As OleDbCommand
            Myconn.Open()
            'Try
            'inizia transazione
            t = Myconn.BeginTransaction
            'Prima query
            p = New OleDbCommand(Msql1, Myconn)
            p.CommandType = Data.CommandType.Text
            p.Transaction = t
            p.ExecuteNonQuery()
            'termina prima query
            p.Dispose()
            p = Nothing
            'Seconda query...recupera ID nuovo utente
            p = New OleDbCommand(Msql2, Myconn)
            p.CommandType = Data.CommandType.Text
            p.Transaction = t
            Dim tr As OleDbDataReader
            tr = p.ExecuteReader
            IDtemp = -1
            While tr.Read()
                IDtemp = CType(tr.Item("UserId"), Long)
            End While
            If IDtemp = -1 Then
                'abortisce tutto
                t.Rollback()
                Response.Write("IMPOSSIBILE TERMINARE L'OPERAZIONE:
ERRORE A100. Non è stato possibile creare il codice utente!")
                tr.Close()
                Myconn.Close()
                Myconn.Dispose()
                Response.End()
                Exit Sub
            End If
            tr.Close()
            'termina qury command
            p.Dispose()
            p = Nothing
            'Terza fase scrive i dati supplementari
            Msql3 = "INSERT INTO aspnet_Membership"
            Msql3 +=
" (UserID,Password,Email,nome,cognome,indirizzo,Citta,prov,Cap,tel,cell,ditta)"
            Msql3 += " VALUES("
            'id
            Msql3 += IDtemp.ToString + ", "
            'password
            Msql3 += "'" + Me.txtPassword.Text + "', "
            'Email
            Msql3 += "'" + Me.txtEmail.Text + "', "
            'CreateDate
            'Msql3 += "#" + Now.ToShortDateString + "#, "
            'Nome
            Msql3 += "'" + Me.txtNome.Text + "', "
            'Cognome
            Msql3 += "'" + Me.txtCognome.Text + "', "
            'Indirizzo
            Msql3 += "'" + Me.txtIndirizzo.Text + "', "
            'Citta
            Msql3 += "'" + Me.txtCitta.Text + "', "
            'Prov
            Msql3 += "'" + Me.txtProvincia.Text + "', "
            'CAP
            Msql3 += "'" + Me.txtCAP.Text + "', "
            'tel
            Msql3 += "'" + Me.txtTelefono.Text + "', "
            'cell
            Msql3 += "'" + Me.txtCellulare.Text + "', "
            'ditta
            Msql3 += "'" + Me.txtDitta.Text + "' "
            Msql3 += ")"
            p = New OleDbCommand(Msql3, Myconn)
            p.CommandType = Data.CommandType.Text
            p.Transaction = t
            p.ExecuteNonQuery()
            'termina  query
            p.Dispose()
            p = Nothing
            'siamo fin qui
            'eseguiamo il commit
            t.Commit()
            ' Catch ex As Exception
            'Response.Write(ex.Message)
            'Stop
            'End Try
            t.Dispose()
        End Using
        Response.Write("OK")
    End Sub
Il difetto quale è....ho commentato il try catch....ma non è che
migliori molto l'individuazione del problema!
Mi dice "ERRORE IN INSERT INTO"
e me lo dà sulla terza query
Siccome sintatticamente sono digeribili da access...pensavo che fosse
un problema sulla mia scrittura delle date il cassico #data#...ed
allora l'ho tolta!
Ma continua a dare errore!
E allora ho pensato....
il programma mi manda in esecuzione 3 query a raffica
la prima è "corta"...ed è la prima!...nessun problema in locale
la seconda è una select....al limite legge dati sbagliati
la terza è un altra insert into
...potrebbe darsi che access non sia disponibile...o il command...???
Che sia lockato qualcosa?
In definitiva deve scrivere su una tabella correlata...se non ha
riaggiornato gli indici può darsi che mi dica errore in insert into
perchè non è ancora disponibile qualcosa?
Nel vecchio vb6 succedeva con le griglie...che no stavano dietro
all'aggiornamento di access...bisonava staccargli la conn e
riattaccargliela per farli veere i nuovi dati....
Ma qui?
Son dentro una transaction...stacco la conn...mi esplode tutto?E
poi...ma la mia diagnosi sarà corretta???
Francamente a quest'ora di notte...non sò che pesci prendere...meglio
che vada a dormire!!!
SOB!

             'id
zac
Mavaffan&%/&
In bagno nella posizione del puttino delle fontane...ascoltando nel
silenzio di questa nottata....l'illuminazione!
I "bravi tecnici" delle microsoft hanno implementato i membership
provider.....ebbene si usando parole riservate!!!
PASSWORD è una parola riservata di Access (e non so se anche di sql
server)
Non mi era venuto in mente perchè io ci sto attento e non ne uso nei
miei db (uso PW o userPassword)
E' bastato fare
            Msql3 = "INSERT INTO aspnet_Membership"
            Msql3 += " (UserID,
[Password],Email,nome,cognome,indirizzo,Citta,prov,Cap,tel,cell,ditta)"
            Msql3 += " VALUES("
ossia racchiudere tra [] ...e tutto funziona!
Va buò!
Fanculo !!!...notte notte!!!
State attenti se usate i controlli login e volete spippolare le
tabelle per aggiungere altre info...mi sa che anche in sqlserver
abbian fatto arrosti simili!!!

 server)
E' riservata in Access ed in postgre, ma non in tutti gli altri database.
Non male questo link:
 
http://www.petefreitag.com/tools/sql_reserved_words_checker/
-- 
S.