Errore open DB (SqlServer/Access) SOLO in Debug e SOLO su PC win11

di il
23 risposte

23 Risposte - Pagina 2

  • Re: Errore open DB (SqlServer/Access) SOLO in Debug e SOLO su PC win11

    Ciao @Migliorabile: sul discorso POOL mia ignoranza totale!! Ma nozione veramente INTERESSANTE, per quanto mi riguarda per 2 principali motivi:

    1. Ho visto con i miei occhi l'errore SOLO in fase di DEBUG e solo se mi fermavo con Break Point, errore poi magicamente sparito alla fine dei test del secondo giorno...la cosa farebbe pensare che ho modificato qualcosa oppure sbagliavo qualcosa...ma io avrei giurato che invece le 2 righe erano sempre li: ecco una logica spiegazione: tale discorso di POOL (e meno male..io avevo detto che sembrava essersi "incastrato" qualcosa...direi che il POOL potrebbe essere il giusto responsabile...)

    2. Per quanto sopra, salvo il fatto che il pool sia indispensabile per avere una certa velocità nel riaprire connessioni già usate, io che non ritengo utile lasciare connessioni aperte in giro, ovvero apro la connessione, elaboro e chiudo la connessione in attesa di nuovo comando da parte dell'utente vorrei a questo punto che tale pool si svuotasse con la chiusura connessione. Sembra la cosa non sia possibile, ma mi pare di avere letto che sia possibile aprire la connessione indicando un tempo di durata di pool, oltre il quale il pool si auto-pulisce. Mi documenterò.

    Per quanto riguarda le transazioni, io nei test fatti molto tempo fa (quando ho studiato con altri colleghi la scelta delle regole per il nostro progetto....) ho seguito la regola: apertura connessione, se ho più insert/update/delete allora apertura transazione...........elaborazione...... se era aperta una transazione allora se tutto OK Commit (che chiude positivamente la transazione)...  altrimenti Rollback (che chiude negativamente la transazione)......in ogni caso poi chiusura connessione.

    Da anni mi sembra funzionare tutto correttamente...naturalmente ogni consiglio sarebbe bene accetto.

    Grazie ancora!!

  • Re: Errore open DB (SqlServer/Access) SOLO in Debug e SOLO su PC win11

    Salve Giovanni,

    se utilizzi Ado.NET, sia Microsoft.Data.SQLClient che il vecchio System.Data.SQLClient espongono il metodo' possibile utilizzare 

    ...SqlConnection.ClearPool(tuaConnessione)

    al fine di non far inserire la connessione coinvolta nel pool poi riutilizzabile...

    detto questo, non penso che farne il cleanup completo sia la soluzione corretta... credo di piu' che, al momento della chiusura della tua connessione all'uscita di funzione sia meglio fare li' la corretta pulizia, conn.Close() e conn.Dispose... e vedere di correggere eventualmente li' qualche cosa...

    Il pool e' stato appunto pensato per migliorare le funzionalita' perche' creare una connessione ex novo e' un'operazione estremamente pesante..

    comunque, salutoni romagnoli
    -- 
    Andrea

  • Re: Errore open DB (SqlServer/Access) SOLO in Debug e SOLO su PC win11

    Tutto giusto, ma ricordiamoci che, come da titolo, Giovanni intende interfacciarsi con "ogni" specie di DB, Access compreso.

  • Re: Errore open DB (SqlServer/Access) SOLO in Debug e SOLO su PC win11

    11/12/2024 - grumpy ha scritto:

    Tutto giusto, ma ricordiamoci che, come da titolo, Giovanni intende interfacciarsi con "ogni" specie di DB, Access compreso.

    Per questo gli ho detto di chiuderla prima di cambiare connessione.

    Pippo.ConnectionString = A

    Pippo.Open()

    Se controlla vede che pippo è connesso ad A

    Pippo.ConnectionString = B

    Se controlla adesso vede che è connesso ma ad A non a B

    Pippo.Open()

    Adesso è connesso a B

    Semplicemente in debug vedi lo stato a connesso ma al precedente db non all'attuale.

    Io userei una connessione per ogni db, almeno non rischio di aggiornare mysql pensando di aggiornare access.

  • Re: Errore open DB (SqlServer/Access) SOLO in Debug e SOLO su PC win11

    Non credo che intenda connettersi contemporaneamente a DB diversi. Più semplicemente intende rendere la sua applicazione compatibile con DB di diverso tipo.

  • Re: Errore open DB (SqlServer/Access) SOLO in Debug e SOLO su PC win11

    Buongiorno @Grumpy @Sihsandrea @Asql e grazie a tutti.

    Premetto: il progetto del quale parlo, non è installato presso grandi clienti, ma è da me sviluppato e usato giornalmente in 3 differenti installazioni (ognuna con un tipo di diverso di DB proprio per averne sempre esempi attivi ufficiali...) ormai da più di un decennio e devo dire che alcuni argomenti (come ad esempio quelli inerenti alle connessioni...) li ho valutati anni fa e mai più toccati...e mi sembrano perfettamente funzionanti. Mensilmente porto avanti lo sviluppo di nuove funzioni oppure il porting di qualcosa rimasto nella vecchia versione VB6.

    Detto questo:

    @Asql: Grazie per le preziosi info... Io uso, ne caso di SqlServer,  System.Data.SQLClient e non sapevo della nuova versione Microsoft.Data.SQLClient della quale vedo comunque le info su Microsoft Learn e andrò a documentarmi!

    @Grumpy @Sihsandrea: Confermo che la connessione viene effettuata ad UNO SOLO dei tipi DB (a scelta può essere uno fra quelli previsti...ma quello rimane all'interno poi della installazione) ovvero non faccio convivere 2 diversi DB contemporaneamente in una installazione.

    Poi poichè l'errore capitato per puro caso in un test e SOLO in DEBUG mode, per quanto mi ha fatto aggiungere la Close di precauzione prima di eventuale Open, mi fa pensare che comunque sia da attribuire al concetto di Pool (a me sconosciuto fino a poche ore fa...), ma rimane il fatto che penso (senza arroganza...) che quanto da me verificato sia un piccolissimo bug/particolarità che dovrebbe essere presa in considerazione da chi di dovere, poichè se io dichiaro una NUOVA VARIABILE per la connessione, MAI la apro, anzi la inizializzo a nothing e poi in seguti alla assegnazione di una stringa me la trovo improvvisamente in STATO 1 ovvero aperta , vuoi per un pool rimasto per il debug precedente (ma poi interrotto!?!?!?!?) vuoi per qualcos'altro (NON dipendente da mia precedente istruzione di Open..in quanto mi sono posizionato nella prima Open di partenza applicazione...) NON dovrei trovare tale connessione aperta!!! Fortunatamente ore e ore perse, ma solo per un qualcosa capitato in una casuale sessione di Debug e mai in produzione (come da logo verificati) e che comunque m sta facendo scoprire nuove cose....non tutto il male viene per nuocere!!

    Grazie veramente a tutti nuovamente!!

  • Re: Errore open DB (SqlServer/Access) SOLO in Debug e SOLO su PC win11

    In generale l'implementazione di un pool ha una serie di configurazioni quali:

    1. numero minimo di connessioni mantenute aperte
    2. tempo massimo che una connessione rimane nel pool, dopo di che viene chiusa

    .

    I valori di default in genere vanno piu' che bene.

    Il problema NON E' la connessione, MA la TRANSAZIONE. Una connessione aperta SENZA una transazione aperta non genera nessun tipo di problema. 

    MA una transazione aperta genera un sacco di problemi, il principale dei quali e' che le modifiche fatte usando qiella connessione sono visibili SOLO in quella connessione/transazione, e non vedi le modifiche fatte da ALTRE transazioni. Inoltre, poiche' potresti chiuderela con ROLLBACK, il dbms si deve tenere traccia di TUTTE le modifiche in modo da poterle 'abortire' se neccessario.

    Nota/1: un connection pooling non dipende dal dbms.

    Nota/2: quando non apri ESPLICITAMENTE una transazione, la apri IMPLICITAMENTE.

    La transazione ESISTE SEMPRE. E no, non risparmi tempo nel non aprirla esplicitamente.

    Nota/3: e' totalmente sbagliato andare a pasticciare direttamente con il connection pool SOLO perche' non si riesce a trovare la magagna. Si DEVE RISOLVERE la rogna e basta!

  • Re: Errore open DB (SqlServer/Access) SOLO in Debug e SOLO su PC win11

    Salve @migliorabile,

    come correttamente dici, il pool e' mantenuto e gestito da Ado.NET e non, nel caso, ad esempio SQL Server... Non devo assolutamente insegnare a te che Ado.NET e' il layer di piu' alto livello di accesso ai db, e ogni SQL provider gestisce eventualmente questo pool un po' a modo suo, infatti non mi risulta che i vari provider espongano la medesima interfaccia, ma potrei sbagliarmi... non ho mai approfondito driver diversi da SQL Server....

    e fino a qui, mi torna il tuo ragionamento... non capisco pero' perche' parli di transazioni aperte... al di la' che, almeno in SQL Server, una transazione aperta esplicitamente viene automaticamente rollbackata se non espressamente committata al momento della chiusura/rilascio del comando/connessione.

    in ogni caso, @Giovanni indica che il metodo .Open() solleva immediatamente l'eccezione alla sua prima esecuzione.
    SE questo e' davvero il caso, il fatto mi pare un po' strano, e SE si risolve facendo (dico ad esempio) eseguendo una .Close(), allora il problema DEVE essere li', anche se continua a non tornarmi il quadro..

    eseguendo ad esempio

    System.Data.SqlClient.SqlConnection cn = new System.Data.SqlClient.SqlConnection();
    // 1^ connessione
    cn.ConnectionString = @"Server=(local);Database=tempdb;Trusted_Connection=True;";
    cn.Open();
    
    // 2 cambio connessione
    // eccezione
    cn.ConnectionString = @"Server=(local)\SQLExpress;Database=tempdb;Trusted_Connection=True;";
    cn.Open();
    

    al cambiamento di connection string viene sollevata l'eccezione Not allowed to change the 'ConnectionString' property. The connection's current state is open.'

    quindi tutto questo sinceramente non mi torna...
    sinceramente vorrei vedere come viene inizializzata la variabile L_Connessione di @Giovanni, perche' a mio parere "c'e' dello sporco in Danimarca", ma non nello stralcio di codice parziale che ha mandato...

    salutoni romagmoli
    -- 
    Andrea

  • Re: Errore open DB (SqlServer/Access) SOLO in Debug e SOLO su PC win11

    @Migliorabile   @Asql     Ciao

    Per quanto riguarda la Transazione, io la utilizzo SOLO SE ho una serie di operazioni sql (query escluse) in elaborazione consecutiva e quindi ove una di queste va in errore, nessuna delle precedenti operazioni effettuate (dalla apertura di transazione) deve essere committata e quindi ho possibilità di RollBack.

    Ove faccio delle singole insert/update/delete non ho trovato utile aprire anche una transazione, in quanto se l'operazione NON termina con esito positivo NON ho altre operazioni collegate da annullare.

    Sul discorso dichiarazione variabile di connessione, allego sotto pezzo di codice estrapolato dove vediamo:

    1. Dichiarazione di variabile di connessione come Object generico appositamente fatto per poi pter essere instanziata con tipo relativo a DB in uso (ho sempe voluto che il mio codice potesse funzionare con qualsiasi tipo di DB relazionale, anche se poi le mie prove iniziali sono state fatte sui 3 DB già menzionati + SqlIte). Ricordo che l'errore in oggetto è saltato fuori solo con DB Microsoft e NON con MySql (che poi è quello che conosco di meno...)

    2. Chiamata a function di apertura transazione dove si è verificato il problema qualche giorno fa SOLO in DEBUG.

    Aggiungo:

    1. Quando ho intercettato il problema la prima volta stavo facendo un normale debug e forse (dico forse...) ero in un punto in cui era aperta una transazione e lì è iniziato lo sfinimento che mi ha portato fino a notte senza capire il perchè dell'assurdo errore solo in debug.

    2. Il giorno dopo, giorno in cui ho iniziato a chiedere aiuto su questo forum, al rientro a casa ho riprovato a capire il perchè dell'errore, ma dopo avere spento e riacceso il PC (chissa' se qualcosa rimane attivo lo stesso....) ma SOPRATUTTO mi sono messo in una posizione diversa di codice, ovvero mi sono messo nella prima operazione di apertura connessione che incontra il codice quando parte....lì NON ho alcuna transazione aperte,,,ma sempre li l'errore, sempre e solo con il Debug, è riapparso per un po' di volte...salvo poi scomparire "magicamente" dopo che ho messo la Close() (per me assurda) prima della Open (come suggerito da Sishandrea) ovvero togliendo poi tale Close e risimulando la situazione di errore (in Debug) non è più saltato fuori...quasi come se la Close aggiunta in quel punto abbia pulito anche qualcosa rimasto in giro da precedenti Thread.

    P.S. Se vi chiedete il perchè delle mie nomenclature: arrivavo dal Cobol (che uso tuttora con un grosso cliente) e mi sono portato dietro quello che consideravo cose utili di quel linguaggio!!

    Grazie a tutti (sotto allegato estrapolazione codice)

    Dim L_Conn_1 As Object

    '--------------------------------
    'Apertura(connessione)
    '-------------------------------
    F_RcSQL = dalXXdb_OpenDB(L_Conn_1)

    Public Function dalXXdb_OpenDB(ByRef L_connessione As Object) As Boolean

    Select Case Tipo_DB_Corrente

     Case clsXXcostanti.C_DB_ACCESS  'Microsoft Access
        L_connessione = New System.Data.OleDb.OleDbConnection()
             L_Nuova_ConnString = stringa....
        
    Case clsXXcostanti.C_DB_SqlServer  'Microsoft SQL server
        L_connessione = New System.Data.SqlClient.SqlConnection()
        L_Nuova_ConnString = stringa....

    Case clsXXcostanti.C_DB_MySql  'MySql
        L_connessione = New MySql.Data.MySqlClient.MySqlConnection()
        L_Nuova_ConnString = stringa....

    End Select

    L_connessione.ConnectionString = L_Nuova_ConnString

    'ISTRUZIONE SOTTO DI CLOSE AGGIUNTA SU SUGGERIMENTO SI SISHANDREA

    L_RC = dalXXdb_PrimaDiOpen_CloseDB(L_connessione)   'CHIAMA FUNCTION DI CHIUSURA CONNESSIONE..CHE NON VA IN ERRORE ANCHE SE LA TROVA CHIUSA

    'SE METTEVO BREAK QUI IN DEBUG OTTENEVO ERRORE PER CONNESSIONE GIA' APERTA E STATO = 1

    'SOLO SE MI FERMAVO CON BREAK SU ISTRUZIONE SOTTO...ALTRIMENTI NO PROBLEM...

    L_connessione.Open()

Devi accedere o registrarti per scrivere nel forum
23 risposte