Newsgroup: it.comp.software.database
Titolo: [?] ADO+SQLSrv - Errore 80040E14-Access Violation

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.
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


Ipotizzo: potrebbe essere il testo della query troppo grande per essere
gestita correttamente dal provider Ado.
Al limite prova a verificare se ci sono errori nella collection Errors della
Connessione tipo:
Public Sub DebugErrorsProv(adoConn As ADODB.Connection)
  Dim i As Long
  For i = 0 To adoConn.Errors.Count - 1
    Debug.Print "Errore n.: " & _
        "Num: " & adoConn.Errors(i).Number & " - " & _
        "Des: " & adoConn.Errors(i).Description & " - " & _
        "Err: " & adoConn.Errors(i).NativeError & " - " & _
        "Src: " & adoConn.Errors(i).Source & " - " & _
        "SQL: " & adoConn.Errors(i).SQLState, , 1
  Next
End Sub
Martino.
PS: Siamo leggermente OT... ;)

 PS: Siamo leggermente OT... ;)
Perchč? Non direi proprio, comunque, vorrei capire...

 Connessione tipo:
Ho provato, ho solo un errore nell'insieme, quello citato all'inizio.
Dimenticavo: Uso SQLOLEDB.
Il valore di SQLState è 42000 che da BOL significherebbe:
      42000 207,208,213,229,
      230,260 Syntax error, permission violation, or other nonspecific
error.

 ha scritto nel messaggio
news:HHg%8.20336$s74.5...@twister1.libero.it...

Hai provato a verificare se parti più piccole di quella query, vengono
eseguite correttamente?
A me sembra un casino di ADO dato che il QA riesce ad eseguirlo
correttamente... Su MSDN non c'è nulla riguardi il prb.
Martino.

 correttamente... Su MSDN non c'è nulla riguardi il prb.
In effetti:
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.
SCA.SCAD_RIMESSA_DIRETTA e SCA.SCAD_EFFETTI sono due campi booleani (BIT)

 ha scritto nel messaggio
news:MKr%8.23776$GV2.5...@twister2.libero.it...

Prova a scriverla così:
AND ((SCA.SCAD_RIMESSA_DIRETTA<>0) OR (SCA.SCAD_EFFETTI<>0))
Martino.

 AND ((SCA.SCAD_RIMESSA_DIRETTA<>0) OR (SCA.SCAD_EFFETTI<>0))
Non va lo stesso. Vedi anche (se vuoi) post seguente.

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.