Newsgroup: it.comp.lang.visual-basic
Titolo: [?] ADO+SQLSrv-Errore 80040E14-Access Violation

Vabbè (scusate) cross-posto anche qui:
Win XP Pro, VB6 SP5, ADO 2.7, SQL Server 7.0 SP2
La query che riporto sotto, genera (solo con VB+ADO, mentre con Query
Analyzer ottengo, senza alcun errore, il risultato atteso!) un
errore -
2147217900
 (80040E14) la cui proprietà Description riporta:
"SqlDumpExceptionHandler: Process 9 generated fatal exception c0000005
EXCEPTION_ACCESS_VIOLATION. SQL Server is terminating this process."
Avete qualche idea/workaround? Grazie. (Ma sarà mica che sono sfigato...?)
Le tabelle PDC e SCA fanno parte dello stesso database.
SELECT
PDC.CODICE_VOCE,
PDC.DES_ABB,
PDC.RISERVATO,
(PDC.DARE-PDC.AVERE) AS SALDO_PDC,
(SELECT SUM (SCA.IMPORTO* (CASE WHEN SCA.STORNO<>0 THEN -1 ELSE 1 END) )
FROM SCA WHERE SCA.CODICE_VOCE=PDC.CODICE_VOCE AND
(SCA.SCAD_RIMESSA_DIRETTA<>0 OR SCA.SCAD_EFFETTI<>0) )
AS SCADENZE,
(SELECT SUM (SCA.GIA_PAGATO* (CASE WHEN SCA.STORNO<>0 THEN -1 ELSE 1 END) )
FROM SCA WHERE SCA.CODICE_VOCE=PDC.CODICE_VOCE AND
(SCA.SCAD_RIMESSA_DIRETTA<>0 OR SCA.SCAD_EFFETTI<>0) )
AS TOT_GIA_PAGATO,
(SELECT SUM ((SCA.IMPORTO* (CASE WHEN SCA.STORNO<>0 THEN -1 ELSE 1 END) )
-(SCA.GIA_PAGATO* (CASE WHEN SCA.STORNO<>0 THEN -1 ELSE 1 END) ))
FROM SCA WHERE SCA.CODICE_VOCE=PDC.CODICE_VOCE AND
(SCA.SCAD_RIMESSA_DIRETTA<>0 OR SCA.SCAD_EFFETTI<>0) ) AS SALDO_SCA
FROM
PDC
WHERE (PDC.DARE-PDC.AVERE)* (CASE WHEN PDC.TIPO='CL' OR PDC.TIPO='CD' THEN 1
ELSE -1 END)
<>
(SELECT SUM ((SCA.IMPORTO* (CASE WHEN SCA.STORNO<>0 THEN -1 ELSE 1 END) )
-(SCA.GIA_PAGATO* (CASE WHEN SCA.STORNO<>0 THEN -1 ELSE 1 END) ))
FROM SCA WHERE SCA.CODICE_VOCE=PDC.CODICE_VOCE AND
(SCA.SCAD_RIMESSA_DIRETTA<>0 OR SCA.SCAD_EFFETTI<>0) )
ORDER BY PDC.CODICE_VOCE ASC

 EXCEPTION_ACCESS_VIOLATION. SQL Server is terminating this process."
[cut]
nel Knowledge Base di M$ ho trovato 59 articoli relativi a quell'errore.
purtroppo forse e' meglio che provi tu a vedere se qualche articolo
c' azzecca piu' o meno. a me non sono sembrati pertinenti,
ma...pero'...forse...
prima cosa inizierei scricando il SP4 di SQL 7.
bye
R

 prima cosa inizierei scricando il SP4 di SQL 7.
Sarà l'ultima spiaggia. Il fatto è che l'errore non è documentato fra i FIX
Facendo 8000 prove ho scoperto che sbaglia anche solo così:
SELECT
(
SELECT SUM (SCA.IMPORTO* (CASE WHEN SCA.STORNO<>0 THEN -1 ELSE 1 END) )
FROM SCA WHERE SCA.CODICE_VOCE=PDC.CODICE_VOCE
AND (SCA.SCAD_RIMESSA_DIRETTA<>0 OR SCA.SCAD_EFFETTI<>0)
)
AS SCADENZE
FROM PDC
e, in particolare, non gli piace la:
AND (SCA.SCAD_RIMESSA_DIRETTA<>0 OR SCA.SCAD_EFFETTI<>0)
basta trasformarla in:
AND (SCA.SCAD_RIMESSA_DIRETTA<>0)
oppure in:
AND (SCA.SCAD_EFFETTI<>0)
che va tutto bene.

 Sarà l'ultima spiaggia. Il fatto è che l'errore non è documentato fra i
FIX
E poi, ragionando, se con Query Analyzer funziona, sarà mica che il problema
è concentrato su ADO (chissà mai se Query Analyzer usa ADO??? Noooooooo)
Amo ADO, da morire! :-((

 Amo ADO, da morire! :-((
non e' che con DAO fossero tutte rose e fiori!
mi sono scontrato con alcuni bug da diventare matto.
bye
R

 che va tutto bene.
Tanto per provare: aggiungi delle parentesi:
((SCA.SCAD_RIMESSA_DIRETTA<>0) OR (SCA.SCAD_EFFETTI<>0))
chissa' ... magari il parser di ADO contiene un baco! ;-)
ciao
		maxx

chissa' ... magari il parser di ADO contiene un baco! ;-)
Seeeee, da seta. Un paracadute intero, per taglie extralarge. Un anaconda,
direi.

Win XP Pro, VB6 SP5, ADO 2.5 (anche 2.7), SQL Server 7.0 SP2, SQLOLEDB
Sono riuscito a ridurre il problema già indicato "al minimo":
Avendo una tabella (anche assolutamente vuota) denominata "prove" con i
campi:
c_long, c_integer, c_single, c_long (tutti di qualunque tipo numerico)
ed eseguendo questa query:
Select c_long, (Select Sum(c_integer) From prove Where c_single<>0 Or
c_long<>0) As somma From prove
A me, solo con VB+ADO+SQL Server via SQLOLEDB, non con Query Analyzer (non
ho provato con archivio di tipo Access), genera questo errore:
-
2147217900
 (80040E14)
la cui proprietà Description riporta:
"SqlDumpExceptionHandler: Process 8 generated fatal exception c0000005
EXCEPTION_ACCESS_VIOLATION. SQL Server is terminating this process."
Il problema è concentrato nella SubQuery ed è causato dalla presenza della
condizione "Or".
Cambiando la query in:
Select c_long, (Select Sum(c_integer) From prove Where c_single<>0) As somma
From prove
oppure in:
Select c_long, (Select Sum(c_integer) From prove Where c_long<>0) As somma
From prove
oppure in (ma è un'altra cosa):
Select Sum(c_integer) As somma From prove Where c_single<>0 Or c_long<>0
allora va tutto bene.
Mi piacerebbe, se qualcuno ha tempo e voglia di provare, avere conferma o
smentita e, magari, qualche suggerimento per bypassare il problema (su MSDN
non ho trovato nulla che descriva tali, direi semplici, condizioni). Grazie
infinite.

Risolto, insomma, si fa per dire...
Anche grazie a prove fatte da Albe: Il problema si presenta solo con cursore
lato server.