Visualizzazione dei risultati da 1 a 4 su 4
  1. #1
    Utente bannato
    Registrato dal
    Oct 2000
    Messaggi
    18

    Modifica recordset disconnesso

    Ho un bel problemino su una classe creata da me che dovrebbe usare un metodo Save() per salvare i suoi parametri nel database.
    Per semplificare :

    Ho due classi, la classe Articolo e la classe Connessione

    Nella classe Connessione ho 2 metodi,
    e sono rispettivamente :

    codice:
    '// restituisce un recordset disconnesso
    Public Function RetrieveRS(sSQL)
    	Dim objConn, objRS
    	Set objConn = Server.CreateObject("ADODB.CONNECTION")
    	Set objRS = Server.CreateObject("ADODB.RecordSet")
    	objConn.ConnectionString = sConn
    	objConn.Open
    	objRS.CursorLocation = adUseClient
    	objRS.CursorType = adOpenStatic	 'adOpenKeyset(1)
    	objRS.LockType = adLockBatchOptimistic
    	objRS.Open sSQL, objConn, , , adCmdText
    	Set objRS.ActiveConnection = Nothing
    	Set RetrieveRS = objRS.clone
    	Set objRS = Nothing
    	Set objConn = Nothing
    End Function

    codice:
    '// dovrebbe salvare nel db un recordset disconnesso
    Public Sub SaveRS(objRS)
    	Dim objConn
    	Set objConn = Server.CreateObject("ADODB.CONNECTION")
    	objConn.ConnectionString = sConn
    	objConn.Open
    	Set objRS.ActiveConnection = objConn
    	objRS.UpdateBatch
    	Set objRS = Nothing
    	Set objConn = Nothing
    End Sub
    Queste due classi io le utilizzo dalla classe Articolo che ha come parametri :
    iId | sTitle | sText

    e come metodi :
    Load() e Save()

    codice:
    Public Sub Load()
    if iId > 0 then ' Modifica
    			strSQL = "Select * From Articoli Where art_ID = "& iId
    		else ' Crea Nuovo
    			strSQL = "Select * From Articoli Where art_ID = 0"
    		end if
    	Set objData = New Connessione
    	objData.ConnectionString = sConn 
    	Set objRS = objData.RetrieveRS(strSQL)
    
    	With objRS
    		If Not .EOF Then ' Load
    			.MoveFirst
    				
    			iId = cInt(objRS("art_ID"))
    			sTitle = Trim(objRS("art_titolo"))
    			sText = Trim(objRS("art_testo"))
    				
    		End If
    	End With
    		
    	If IsObject(objData) Then Set objData = Nothing	
    	If IsObject(objRS) Then Set objRS = Nothing
    End Sub
    codice:
    Public Sub Save()		
    if iId > 0 then ' Modifica
    			strSQL = "Select * From Articoli Where art_ID = "& iId
    		else ' Crea Nuovo
    			strSQL = "Select * From Articoli Where art_ID = 0"
    		end if		
    	Set objData = New Connessione
    	Set objRS = Server.CreateObject("ADODB.Recordset")
    	objData.ConnectionString = sConn
    	Set objRS = objData.RetrieveRS(strSQL)
    		
    		
    	If objRS.EOF = True And objRS.BOF = True Then 
    		objRS.AddNew	
    	End If
    	if objRS.state = 1 then
    		objRS("art_titolo") = sTitle
    		objRS("art_testo") = sText		
    		objRS.Update
    	
    		objData.SaveRS(objRS)	
    	end if
    
    		
    	If IsObject(objData) Then Set objData = Nothing	
    	If IsObject(objRS) Then Set objRS = Nothing		
    		
    End Sub
    Il problema è sul Save()
    Ogni tanto lo fa, ogni tanto no.
    Il problema lo da nella riga del metodo Save(), dove i campi del recordset disconnesso vengono modificati.
    codice:
    	objRS("art_titolo") = sTitle
    	objRS("art_testo") = sText
    i campi nel db esistono, quindi teoricamente esistono con quel nome anche nel recordset disconnesso...

    e l'errore è questo :

    Microsoft Cursor Engine (0x80040E21)
    Si sono verificati errori in un'operazione composta da più passaggi. Controllare i singoli valori di stato.


    Cosa posso fare?

    p.s. la variabile sConn è impostata dalla pagine che istanzia la classe Articolo.

  2. #2
    non usare i metodi UPDATE o UPDATEBATCH degli oggetti RS

    è molto più semplice (e anche maggiormente compatibile con database non MDB) usare delle semplici query di UPDATE...

    nel tuo caso

    codice:
    Public Sub Save()
    	sqlTITLE = replace(sTitle,"'","''")
    	sqlTEXT = replace(sText ,"'","''")
    	if iId > 0 then 'MODIFICA RECORD
    		strSQL = "UPDATE FROM Articoli SET art_titolo = '" & sqlTITLE & "', art_testo = '" & sqlTEXT & "' WHERE art_ID = " & iId
    	else 'NUOVO RECORD
    		strSQL = "INSERT INTO Articoli (art_testo,art_articolo) VALUES ('" & sqlTITLE & "','" & sqlTEXT & "')"
    	end if
    
    	Set objData = New Connessione
    	objData.ConnectionString = sConn
    	objData.Execute(strSQL) 
    
    	If IsObject(objData) Then Set objData = Nothing	
    		
    End Sub
    dovrebbe essere corretto e funzionare
    provalo

    inoltre è anche meno codice :P
    san imente saluta

    * http://simonecingano.it *

  3. #3
    Utente bannato
    Registrato dal
    Oct 2000
    Messaggi
    18
    ti ringrazio molto.
    Xò devi spiegarmi una cosa, per quale motivo esistono molti componenti di asp che non vengono assolutamente utilizzati per le applicazioni web?
    Tutti gli script che vedo in giro, non vedo mai una bella classe fatta adoc, sempre e solo funzioni.
    L'updatebatch è in assoluto credo uno dei comandi che su internet è stato discusso di meno, eppure la possibilità di lavorare con recordset disconnessi teoricamente ti fa risparmiare un bel po di risorse...
    Teoricamente potresti anche salvarli su una sessione e non eccedere con la pesantezza..

    Per quanto riguarda lo script che mi hai consigliato..
    ero capace a realizzarlo, ma sai quando ti incastri su qualcosa che non funziona per un motivo che non conosci...
    è un amo a cui non posso resistere ^__^
    Penso che solo se mi fossi arreso avrei intrapreso un'altra strada, tipo quella che mi hai consigliato tu.

    ...grazie

    ps della serie "Fuori dal Tunnel"

  4. #4
    per la questione delle classi non è assolutamente così. almeno non nel mio caso. io mi costruisco librerie che spesso riutilizzo (e ovviamente quella per le connessioni e le operazioni sui recordset è una delle prime che ho fatto)

    per quanto riguarda invece la updatebatch non hai tutti i torti, ma io rimango dell'idea che la cosa più importante sia la PORTABILITA'...

    semplicemente perchè io lavoro con più tipi di database e non amo particolarmente scrivere il codice due volte...

    non sono molto esperto sulle operazioni recordset su cui stai lavorando (anche se non sono nulla di esageratemanete complesso, non le uso mai), quindi ti chiedo scusa per l'intervento.

    qualcun'altro ti saprà aiutare (a meno che tutti non lavorino come me :P :P :P)

    ciao
    san imente saluta

    * http://simonecingano.it *

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.