It is currently 10 July 2020, 9:32 Advanced search

Errore Dynamic SQL generation failed

Domande e risposte su come utilizzare Instant Developer Foundation al meglio

Errore Dynamic SQL generation failed

Postby geraci » 30 June 2020, 9:27

Ciao a tutti,
al passaggio da versione inde 18.5 a 19.5 (ambiente .net) riscontriamo un errore su un particolare pannello DB presente in una videata:
Dynamic SQL generation failed. Either no base tables were found or more then one tables was found.
Il pannello è basato su una tabella con chiave composta (nessuna particolarità), nel quale è abilitata la sola modifica di due campi. Quando l'utente preme il bottone di salvataggio nel pannello viene ritornato l'errore, ripeto solo dopo che siamo passati alla versione 19.5. Aggiungo che stiamo parlando di un DB Oracle 11 e utilizziamo l'ODAC 11.
Abbiamo il sospetto che per questa determinata operazione non venga utilizzato l'ODAC ma il driver .NET System.Data.OracleClient (modifica introdotta nella release 19) il quale ha dei problemi con la configurazione Real Application Cluster di Oracle. Effettivamente tale errore si verifica solo da questo cliente che ha questa particolare installazione db.
Qualche idea?
Davide
User avatar
geraci
 
Posts: 658
Joined: 8 July 2013, 7:23
Location: Fossano

Re: Errore Dynamic SQL generation failed

Postby lucabaldini » 30 June 2020, 9:37

Proverei a guardare il debug e capire quale driver sta effettivamente utilizzando.

Lo trovi come parametro del messaggio OpenConnection.
User avatar
lucabaldini
Pro Gamma
Pro Gamma
 
Posts: 4494
Joined: 1 October 2010, 17:03
Location: Bologna

Re: Errore Dynamic SQL generation failed

Postby geraci » 30 June 2020, 9:44

Ciao Luca,
grazie per la risposta, il problema è che non posso effettuare una pubblicazione con Debug e non è possibile avere "in casa" quella configurazione per via dei costi esagerati
Davide
User avatar
geraci
 
Posts: 658
Joined: 8 July 2013, 7:23
Location: Fossano

Re: Errore Dynamic SQL generation failed

Postby geraci » 30 June 2020, 9:58

Da noi "in configurazione normale" utilizza l'ODAC...
Attachments
Annotazione 2020-06-30 115616.png
Annotazione 2020-06-30 115616.png (99.53 KiB) Viewed 124 times
Davide
User avatar
geraci
 
Posts: 658
Joined: 8 July 2013, 7:23
Location: Fossano

Re: Errore Dynamic SQL generation failed

Postby lucabaldini » 30 June 2020, 11:24

Dunque, senza vedere altro non è facile... ci provo.

Il framework di Instant Developer, per Oracle, fa questo:
- tenta di caricare l'assembly Oracle.ManagedDataAccess (dalla GAC o dalla Bin e comunque seguendo gli algoritmi di .NET per la ricerca degli assembly)
- se non lo trova prova a cercare l'assembly Oracle.DataAccess
- se non lo trova usa la classe .NET OracleConnection (quella di Microsoft)

Il tipo di classe viene scritto nel debug. Quel messaggio (Dynamic SQL generation failed) viene generato quando, a partire dall'istruzione SELECT in un pannello, il driver deve calcolare le istruzioni UPDATE, INSERT, DELETE per operare in scrittura su database. Quell'operazione viene fatta automaticamente dal driver a cui è stata fornita la query di SELECT del pannello. Se il pannello contiene più tabelle in JOIN nella query principale può essere che il driver non riesca a generare tali istruzioni SQL per la scrittura.

In 19.0 è stato aggiunto il supporto per il driver Oracle Managed Data Access (https://doc.instantdeveloper.com/?ARTID=A7D42B19-D2DB-49E8-B4F4-E3AB84872704&LANG=it) però mi sembra strano che gli altri driver (Oracle.DataAccess o OracleConnection) fossero in grado di creare le istruzioni di scrittura a partire dalla select... Ma potrei sbagliarmi...

Comunque, potresti iniettare una riga di codice che scrive da qualche parte il tipo di driver usato... Purtroppo l'ordine di ricerca è quello scritto sopra e non è aggirabile... nel senso che se uno ha il Managed installato nella GAC il sistema trova quello e usa quello anche se nella Bin metti altre DLL... E quello di Microsoft viene usato solo se non ci sono gli altri due (né nella GAC né nella Bin).

L'espressione potrebbe essere qualcosa del genere:

Code: Select all
  new IDVariant($0.getConnection().GetType().Assembly.Name)


Così ottieni il nome completo dell'assembly usato in quel momento... Poi lo puoi scrivere dove puoi vederlo (magari in un file, o una messageBox quando si preme control o qualcosa del genere... qualcosa che in produzione non dia problemi...
User avatar
lucabaldini
Pro Gamma
Pro Gamma
 
Posts: 4494
Joined: 1 October 2010, 17:03
Location: Bologna

Re: Errore Dynamic SQL generation failed

Postby geraci » 30 June 2020, 13:55

Ti sottolineo che non ci sono join nella master query del pannello! E' quello che ci ha fatto pensare al discorso del Real Application Cluster di Oracle, che ha la particolarità di avere più database sullo stesso nodo. Quindi come dice il messaggio, ci sono più tabelle con lo stesso nome su istanze diverse e sostanzialmente il driver non sa quale prendere anche se in teoria non dovrebbe poter "vedere" direttamente il db (è il nodo che gestisce la ridondanza). E' questo dovrebbe essere un difetto riconosciuto del driver Microsoft, ma non sappiamo come sia possibile il fatto che, solo in quel pannello (forse perchè è un db gli altri sono tutti do), "scavalchi" Oracle.DataAccess che siamo sicuri sia presente nella bin.
Davide
User avatar
geraci
 
Posts: 658
Joined: 8 July 2013, 7:23
Location: Fossano

Re: Errore Dynamic SQL generation failed

Postby geraci » 30 June 2020, 13:58

Differenze tra ODAC e Microsoft Data Acess:
https://www.oracle.com/topics/technolog ... rison.html
Davide
User avatar
geraci
 
Posts: 658
Joined: 8 July 2013, 7:23
Location: Fossano

Re: Errore Dynamic SQL generation failed

Postby lucabaldini » 1 July 2020, 6:54

Non saprei... il sistema utilizza la sequenza che ho descritto sotto per la ricerca del driver giusto...

Io proverei a capire quale driver sta effettivamente utilizzando quella configurazione recuperando il nome fisico dell'assembly usato dalla connessione.
User avatar
lucabaldini
Pro Gamma
Pro Gamma
 
Posts: 4494
Joined: 1 October 2010, 17:03
Location: Bologna

Re: Errore Dynamic SQL generation failed

Postby dr_whiteriver » 1 July 2020, 7:57

Forse ti do un'idea stupida...ma se trasformi il pannello in DO, mi sembra che con la DO non hai problemi...
bye
Alessandro
User avatar
dr_whiteriver
 
Posts: 327
Joined: 3 September 2012, 13:44

Re: Errore Dynamic SQL generation failed

Postby geraci » 1 July 2020, 10:34

Purtroppo trattasi di un cliente particolare, dove abbiamo pochissime finestre per i rilasci e che non ci fornisce un ambiente per effettuare i test con il debug attivo (solo produzione e collaudo che devono essere allineati).
Grazie Alessandro per il suggerimento, avevamo già pensato di intraprendere quella strada, soltanto che il pannello è un po' complesso da "girare" in do. Probabilmente prima opteremo per la gestione manuale degli update: nell'evento di before update mettiamo il Cancel a true e creiamo la query di Update prelevando le informazioni dal pannello.
Grazie ad entrambi
Davide
User avatar
geraci
 
Posts: 658
Joined: 8 July 2013, 7:23
Location: Fossano


Return to Tips & Tricks - Foundation

Who is online

Users browsing this forum: No registered users and 64 guests

cron