Newsgroup: it.comp.www.asp
Titolo: Scrivere caratteri speciali in database

Salve,
ho la necessità di memorizzare del testo inserito dall'utente all'interno di
un campo MEMO di un database. La scrittura l'effettuo utilizzando la
sintassi SQL (insert into) e i campi testo li delimito con l'apice. Se però
il testo scritto dall'utente contiene caratteri riservati per la sintassi
SQL (apici, doppi apici, parentesi graffe, etc.) il motore del database mi
restituisce errore. Ho cercato di risolvere l'inconveniente utilizzando la
funzione di codifica URLEncode: il testo viene scritto codificato (access
accetta tutto) ma non riesco a trovare una funzione di decodifica del testo
per riproporlo all'utente così come era stato scritto in origine.
Qualcuno può aiutarmi?
Esiste già una funzione di decodifica?
Grazie.
Carlo.

 restituisce errore.
Usa la Replace() per sostituire i vari caratteri "illegali" con il loro
equivalente "legale". Di solito solo l'apice singolo da' questo tipo di
problemi, altri caratteri (se sono dentro a stringhe come di solito
avviente) sono ignorati.
Davide

La URLEncode serve solo per codificare, appunto, le URL ed i suoi parametri.
Tu hai bisogno di rimpiazzare (replace()) i caratteri "illegali".
In generale, per la maggior parte dei DB è sufficiente rimpiazzare l'apice
con la classica, strausata e conosciutissima funzione:
Testo = Replace(Testo, "'", "''")
Se il tuo DB si comporta in modo strano, ovvero protesta anche per
l'inserimento di caratteri diversi dall'apice, è un DB Access.
Romeo_


 per riproporlo all'utente così come era stato scritto in origine.
Forse potrebbe esserti utile questo script:
---[inizio]---
<%
' Funzione per codificare il messaggio in modo da evitare che simboli
particolari mandino in crash il database
Function DBEncode(ByVal s)
 Dim result, ch
 Do While Len(s) > 0
  ch = Asc(s)
  s = Right(s, Len(s)-1)
  If (ch >= Asc("a") And ch <= Asc("z")) Or (ch >= Asc("A") And ch <= Asc("Z"))
Then
   result = result & Chr(ch)
  ElseIf ch = Asc(" ") Then
   result = result & " "
  Else
   If Ch < 10 then
    Char = "00" & Ch
   ElseIF Ch > 9 and Ch < 100 then
    Char = "0" & Ch
   Else
    Char = Ch
   End If
   result = result & "&" & Char
  End If
 Loop
 DBEncode = result
End Function
'Funzione per decodificare il messaggio
Function DBDecode(s)
 Dim Result, ch
 Do while Len(s) > 0
  ch = Left(s,1)
  If ch <> "&" then
   Result = Result & ch
   s = Right(s,len(s)-1)
  Else
   Cod_Ch = Cint(Mid(s,2,3))
   If Cod_Ch <> 60 and Cod_Ch <> 62 then
    Result = Result & Chr(Cod_Ch)
   Else
    If Cod_Ch = 60 then
     Result = Result & "&lt;"
    Else
     Result = Result & "&gt;"
    End If
   End If
   s = Right(s,len(s)-4)
  End If
 Loop
 DBDecode = Result
End Function
---[fine]---
Per usarle:
<%
Testo = "Qualsiasi carattere"
Codifica = DBEncode(Testo)
Decodifica = DBDecode(Codifica)
%>
Praticamente DBEncode codifica ogni singolo carattere in codice esadecimale, e
DBDecode effettua l'operazione contraria.
La sequenza delle conversioni è molto banale infatti, DBEncode converte il
carattere nel relativo codice ASCII (quindi possono essere inseriti tutti i
caratteri a partire dal codice ASCII 0 sino al 255) e quindi effettua la
conversione da numero a base dieci a numero a base 16 ( 0 = 00 ... 255 = FF).
DBDecode effettua le operazioni inverse.
L'unico problema riguarda lo spazio utilizzato infatti, ogni singolo carattere
occuperà non uno ma due caratteri (scusate la ripetizione) e quindi se devo
memorizzare un testo di 27 caratteri, il campo del DB deve accettarne 54.
Avevo creato le stesse function in modo tale da convertire in esadecimale solo i
caratteri non letterali e/o numerici in modo da limitare lo spazio utilizzato.
Naturalmente, la procedura di codifica inseriva PRIMA del codice esadecimale il
carattere & (o qualsiasi altro carattere diverso da quelli letterali e numerici)
in modo che la funzione di decodifica, trovando questo carattere, convertisse le
due lettere che lo seguivano altrimenti non effettuava alcuna conversione.
Sò di non essere una cima nelle spiegazioni però spero di essere stato
abbastanza chiaro.
Michele Mariotti