Tu sei qui

Problema con i campi memo a seconda di come viene creato il recordset ADO

  • Sharebar

Premessa.

Questo è un bug non documentato che mi è capitato più volte in passato su alcuni sistemi Windows, server web IIS, più o meno tutte le versioni.

Pensavo, come da articolo di Bill Wilkinson su aspfaqs.com, curato dal mitico Scott Mitchell, che si presentasse solo lavorando su database di casa Microsoft, ma purtroppo ho dovuto constatare che si presenta anche su mysql. Non esiste apparentemente una logica: sul mio notebook il bug è ben presente, sul PC desktop non lo è affatto.

Il problema si è riproposto pesantemente dopo l'uscita di Fruibile cms open source, sin dalla prima versione utilizzando MS Access, ora sulla versione 2.0 beta a cui stiamo lavorando e questa volta su mysql!

In pratica il problema è il seguente:

  1. inserisco un nuovo record nel database che contiene dei campi memo, l'inserimento avviene correttamente
  2. tramite una pagina ASP cerco di visualizzare il contenuto dei campi memo ma non viene visualizzato nella pagina, come se il campo fosse vuoto (blank), mentre non lo è affatto.

Tutto questo è dovuto al modo in cui si crea il recordset nel codice ASP utilizzando ADO.

Esistono diversi metodi per risolvere questo fastidiosissimo problema e sono tutti descritti nella pagina suddetta. Ciò che segue sono i metodi, fra quelli citati che applico quando scrivo il codice e che stiamo applicando a Fruibile per risolvere il bug.

Come procedere:

  1. Non utilizzare mai i metodi execute dell'oggetto ADODB.Connection o ADODB.command per creare il recordset. Es.:
    sql = "SELECT * FROM tabella"
    Set RS = conn.execute(sql)
  2. Utilizzare un tipo di cursore lato client, es.:
    RS.CursorLocation = adUseClient
  3. Usare adOpenKeyset come modalità di apertura del recordset

Esempio completo in base ai punti appena elencati:

Set RS = Server.CreateObject("ADODB.RecordSet")
RS.CursorLocation = adUseClient
RS.Open (nome tabella o query sql, connessione, adOpenKeyset)

In alcuni casi, se si tratta di manutenzionare applicazioni già esistenti e che non soddisfano le suddette regole per la costruzione del recordset è anche possibile ovviare all'inconveniente salvando il contenuto del campo memo in una variabile temporanea e poi utilizzare la variabile nel resto del codice. Es.:

strTmpMemofield= rs("mymemofield")
response.write(strTmpMemofield)

Il cuore del problema infatti è che senon si utilizzano i punti 1,2,3 per costruire il recordset, la query recupererà anche il contenuto dei campi memo, ma sarà utilizzabile una sola volta, dopodichè se tenteremo di utilizzarlo in seguito il risultato sarà NULL, con spiacevoli errori di run-time o nella migliore delle ipotesi il non riuscire a visualizzare il contenuto dei campi memo nelle pagine XHTML.

Ritratto di Pietro Cappai

About the author

Vivo in Sardegna a Carloforte (CI) sull'Isola di San Pietro. Realizzo siti web dinamici, principalmente utilizzando il cms open source Drupal.