Newsgroup: it.comp.appl.access
Titolo: DAO e SQL Server 7.0 _ errata corrige

Avevo dimenticato di riportare anche la creazione del workspace nel
codice VB di esempio. Per chiarazza lo aggiunta.
Da Access vorrei creare, attraverso il codice VB, una connessione al
server SQL Server 7 utilizzando ODBC e RecordSet DAO per aggiornare le
tbl.
Per spiegare il mio problema vi sottopongo un esempio di codice
semplificato:
(tralascio la dichiarazione delle variabili)
(...)
'Connessione al server
Set ws = DBEngine.CreateWorkspace("", "", "", dbUseODBC)
Set conn = ws.OpenConnection("", dbDriverNoPrompt, False,
"ODBC;Driver=SQL Server;SERVER=SERVER;DATABASE=DB;UID=sa;PWD=;")
strSQL = "SELECT Campo1 FROM Tbl1"
Set rstT = conn.OpenRecordset(strSQL, dbOpenDynaset)
rstT.Edit
' A questo pundo mi compare il seguente errore:
' Errore di run-time '3027'.
' Impossibile aggiornare. Database o oggetto di sola lettura.
rstT.Fields("Campo1").Value = rstT.Fields("Campo1").Value + 1
rstT.Update
(...)
Su alcuni articoli Microsoft ho trovato indicato tale problema e la
soluzione indicata è che se si devono effettuare operazioni di
modifica ai dati (come è nel mio caso) è necessario utilizzare un
RecordSet di tipo DAO.dbOpenDynamic.
Io ho provato ma l'errore 3027 persiste.
Qualcuno di voi mi può aiutare?
Grazie.
UJ.

 wrote:
:: Avevo dimenticato di riportare anche la creazione del workspace nel

Sul sito Microsoft ho trovato vari articoli che fanno riferimento a
questo problema. In particolare l'articolo 209943 indica che la
soluzione sta nel settare indispensabilmente una delle opzioni
disponibili di LockEdits del RecordSet.
Io ho provato ma il problema persiste.
Es. 
(...)
Set rstT=conn.OpenRecordset(strSQL, dbOpenDynaset, 0, dbOptimistic)
(...)
Qualcuno mi potrebbe cortesemente dare una dritta?
Grazie.
UJ.

 ha scritto nel messaggio
news:bmpsavcepd2pvd1g2...@4ax.com...

Ciao John
Io utilizzo questo metodo
Set rstT = Conn.OpenRecordset(strSQL, dbOpenDynamic, 0, dbOptimisticValue)
Ma funziona anche quello da te trovato.
La tua tabella Ha un Campo Identity indicizzato ?
Se la risposta è no allora il recordset è di sola lettura.
Per creare un campo Identity puoi fare :
Conn.Execute "Alter Table Tbl1 Add Id_Rec Int IDENTITY(1,1)"
Conn.Execute "Create UNIQUE Index Ix_Tbl1 ON Tbl1(Id_Rec)"
Ciao Giorgio

 ha scritto nel messaggio

::
Ciao Giorgio,
la mia tabella effettivamente non aveva un campo Identity indicizzato.
Ho eseguito le 2 righe che mi hai riportato e controllando nella tbl
in questione ho visto che il campo è stato aggiunto e indicizzato
correttamente.
Ho riprovato poi l'esecuzione di un .Edit sul RecordSet ma l'errore
3027 persiste.
Ho provato a cercare info in merito al tipo di campo Identity (che
onestamente non conoscevo) ma non ho trovato nulla che mi chiarisca le
idee.
Mi potresti dare qualche info (anche sul dove reperire info da
studiare)?
Se hai qualche altra idea per l'errore in questione te ne sarei grato.
Grazie.
UJ.
------------
Grazie
UJ

 ha scritto nel messaggio
news:hns1bvg3at7ts3oo4...@4ax.com...

Ciao UJ.
Il campo Identity in SQL Server è l'equivalente del campo Contatore dei Db
di Access.
Il campo Identity identifica in modo univoco un record e viene utilizzato
dai driver ODBC e OLEDB per conoscerne la posizione.
Un altro campo che aiuta ODCB e OLEDB è timestamp e viene utilizzato dal
driver per sapere se il record è stato variato da un altro operatore senza
confrontare tutti i campi della tabella.
Per Aggiungere timestamp ...
Conn.Execute "Alter Table Tbl1 Add timestamp"
Per maggiori informazioni sui campi identity e timestamp puoi riferirti alla
guida di Sql 7.0 scaricabile da
http://www.microsoft.com/sql/techinfo/productdoc/70/books.asp
Ho dato uno sguardo all'articolo 209943 e riporta come esempio
Set rstT=conn.OpenRecordset(strSQL, dbOpenDynamic, 0, dbOptimistic)
Hai provato a mettere al posto di OpenDynaset OpenDynamic come da esempio ?
Un'altra causa anche se remota potrebbe essere la chiave di registro
HKEY_LOCAL_MACHINE\Software\Microsoft\Jet\4.0\Engines\ODBC
o a seconda della versione di Jet
HKEY_LOCAL_MACHINE\Software\Microsoft\Jet\3.5\Engines\ODBC
Il valore di SnapshotOnly deve essere 0 altrimenti ODBC apre i recordset in
read only.
Ultima cosa che mi viene in mente è aggiornare i driver ODBC e OLEDB da
www.Microsoft.com/data
Ciao Giorgio.

 ha scritto nel messaggio
:: news:hns1bvg3at7ts3oo4...@4ax.com...

Ciao Giorgio.
Grazie per le tue spiegazioni sui campi Identity. Ora vado a consulare
i link che mi hai suggerito.
Per quanto riguarda il mio problema ho ricontrollato il codice ed
effettivamente c'era un mio piccolo (grande!) errore nel nome della
tbl alla quale avevo aggiunto il campo Identity rispetto a quella a
cui andavo ad effettuare l'Edit (cappella da pivello!).
Sono quindi contento di dirti che il problema, con il campo Identity,
è effettivamente risolto!
Grazie per la tua disponibilità ed alla prossima.
Ciao UJ.