Newsgroup: it.comp.lang.visual-basic
Titolo: [ADO vs. SQL Server] Tipi di variabili

Ciao a tutti!
Stò scrivendo una piccola applicazione con ADO in VB6 (ma anche in VBA
di Access) che legge/scrive in un DB SQL Server 7 esistente e remoto.
In un certo campo di una tabella del DB vengono generalmente scritti
testi piuttosto lunghi.
Non conoscendo le caratteritiche del DB ho chiesto informazioni
tramite ADODB e ADOX.
Per questo ho analizzato, tramite un recordset, il contenuto del campo
e le sue caratteristiche.
La proprietà rs.Fields("COLONNA_TAL_DEI_TALI).Value è in realtà un
vettore che contiene, in ogni elemento, il codice ASCII del singolo
carattere che compone il testo.
Il Tipo che viene evidenziato nella finestra "Espressione di
Controllo" per la proprietà Value del campo in questione è
Variant/Byte(0 to 456) dove, come esempio, 456 è il numero di
caratteri del testo quando il campo non è Empty.
Il Tipo per ogni elemento Value(n) è Byte.
La proprietà rs.Fields("COLONNA_TAL_DEI_TALI").Type è 205 cioè
adLongVarBinary (che è contenuto in DataTypeEnum).
Premesso questo, non riesco a scrivere niente in quel campo.
Ho provato passando in un ciclo For il valore ASCII di ogni carattere
del testo ad ogni elemento Value(ennesimo) del campo, dopo aver
provato tutte le funzioni di conversione C* che conosco...(CByte,
CLng, CVar, ecc.)
For i = 0 To Len(TestoDaScrivereNelCampo) - 1
  carattere = Mid(strEstesa, i+1, 1)
  rs.Fields("COLONNA_TAL_DEI_TALI").Value(i) = CByte(Asc(carattere))
Next i
rs.Update
L'errrore è sempre "Tipo non corrispondente".
Dove sbaglio?
La riprova che ho fatto è stata quella di creare una tabella in run
time con ADOX e creare una colonna di tipo adLongVarBinary. In questo
caso riesco a riempirla con le righe di codice scritte sopra e senza
bisogno di conversioni (la funzione Asc restituisce un Integer).
Ciao e grazie!
-- 
Giorgio M.

 Premesso questo, non riesco a scrivere niente in quel campo.
Tanto per cominciare, tieni conto di questo: 
ci sono dei bug noti che dipendono dal provider utilizzato. 
Piů sotto ti ho postato un estratto da MSDN.
Sempre in Msdn, cerca 
"HOWTO: Sample Functions Demonstrating GetChunk and AppendChunk"
che ti mostra come lavorare con quel tipo di campo...
Ciao!
Cesare I.
'-------------------------------
Da Msdn:
BUG: Parameterized Insert of LongVarBinary Data Type Can Return
 "Type Is Invalid" Error 
Q264242
--------------------------------------------------------------------------------
The information in this article applies to:
Microsoft Data Access Components versions 2.1, 2.5 
ActiveX Data Objects (ADO), versions 2.1, 2.5
--------------------------------------------------------------------------------
SYMPTOMS
When you attempt a parameterized insert of an SQL_LONGVARBINARY 
(adLongVarBinary) data type with the ActiveX Data Objects (ADO) 
command object, the following error message may be returned: 
Type is Invalid 
This problem occurs with the Microsoft Visual FoxPro driver, or 
with any of the Microsoft Jet Indexed Sequential Access Method 
(ISAM) drivers. 
CAUSE
The Microsoft OLE DB Provider for ODBC (MSDASQL) assumes a data 
type of SQL_BINARY (and not SQL_LONGVARBINARY). The Visual FoxPro 
and Jet ISAM drivers do not support the SQL_BINARY data type. 
RESOLUTION
In the case of the Jet ISAM drivers, you can resolve the problem 
by using the native Microsoft Jet 4.0 OLE DB Provider, which does 
support the SQL_BINARY type. There is no known workaround for the 
Visual FoxPro driver. 
'-------------------------------------------
PRB: Error Message 3421 Passing a Blob Argument to a Stored Procedure 
Q190450
-------------------------------------------------------------------------------
The information in this article applies to:
ActiveX Data Objects (ADO), versions 1.5, 2.0, 2.1 SP2, 2.5, 2.6
--------------------------------------------------------------------------------
SYMPTOMS
When you use the CreateParameter method to pass a Binary Large Object 
(BLOB) data to a stored procedure you need to specify the Maximum 
size of the data to be passed. However, when specifying the exact 
size of blob data the following error is generated when the parameter 
is actually passed: 
Run-time error '3421':
The application is using a value of the wrong type for the current 
operation. 
RESOLUTION
Add one to the value of Parameter.Size property when passing a BLOB. 
In the following example, ImgLen is LOF(<path>\imageFile): 
   Set ADOprm = ADOCmd.CreateParameter
   (, adLongVarBinary, adParamInput, (ImgLen + 1)) 
-- 
Posted via Mailgate.ORG Server - 
http://www.Mailgate.ORG