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

di il
23 risposte

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

Buongiorno, ringrazio in anticipo chi mi aiuterà per il problema che descrivo sotto;

ho una procedura sulla quale lavoro di mio da un decennio e che lato windows è in VB.net (lato web C#, ma tralasciamo qui..._). Tale procedura lavora egregiamente da anni con DB SqlServer, Access e MySql.

Da qualche tempo ho comprato un nuovo PC con WINDOWS 11 (mai usato prima) con il quale ho iniziato a lavorare in sviluppo sula mia procedura in VB.net. Ieri mi sono accorto di un problema: ho una "function" di OPEN DATABASE che uso da decenni e che ha le 2 istruzioni seguenti:

L_connessione.ConnectionString = L_Nuova_ConnString

L_connessione.Open()

La cosa ASSURDA: se vado in DEBUG (ripeto: SOLO in debug) in esecuzione e mi fermo con un Break Point sulla seconda istruzione, ovvero sulla OPEN, la procedura va in errore perchè dice che la connessione è GIA' APERTA. Ovvero è come se la prima istruzione apra di suo la connessione (infatti da debug quando mi fermo sulla Open vedo lo stato connessione a "1" ovvero aperto). La cosa assurda è che succede SOLO se mi fermo in DEBUG sulla Open (scatta il Catch on error) mentre è tutto OK se NON mi fermo in DEBUG su tale istruzione (se metto Break POoint prima o dopo, no problem). Inoltre: problema SOLO su Open SqlServer e Access, mentre tutto OK con MySql.

Riepilogando: solo su macchina win11, se metto Break su Open DB ottengo errore (per connessione che risulta essere già aperta) solo con DB SqlServer e Access.

Grazie a chi mi aiuterà a risolvere un problema sul quale ieri ho sbattuto la testa per una intera giornata senza venirne a capo (ho cambiato opzioni di compilazione e debug da AnyCpu ad altro, ma niente...)

Giovanni Aloisio

23 Risposte

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

    09/12/2024 - GiovanniAloisio ha scritto:

    ho una "function" di OPEN DATABASE che uso da decenni e che ha le 2 istruzioni seguenti:

    <

    L_connessione.Open()

    mah, a me tirano le orecchie se prima di cambiare connessione non chiudo eventuali connessioni aperte.

    da una prima analisi

    L_connessione.ConnectionString = A

    L_connessione.Open()

    L_connessione.ConnectionString = B

    L_connessione.Open()

    sicuro che la connessione aperta sia B e non A?

    se prima aggiungi: 

    L_connessione.Close()

    cosa succede?

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

    Buongiorno Sihsandrea, e grazie per avermi risposto. Sono stra-sicuro che la connessione NON sia già aperta precedentemente da me....e non lo dico per arroganza, ma semplicemente perchè mi fermo con Debugger nella prima istruzione (quella di preparazione indicazione stringa di connsessione) e li se verifico lo stato della connessione risulta "0" ovvero "chiusa", ma se mi muovo con F11 e arrivo sulla riga di OPEN mi trovo invece stato "1" ovvero stato "aperto"...quindi in effetti quando mi fermo col debugger...prima di andare quindi in errore sulla open...vedo che il sistema trova la connessione "aperta" e li è il mistero: NON capisco chi la ha aperta.

    Fra l'altro se mentre sono fermo con il debugger sulla istruzione di Open (quindi istruzione di Open NON ancora eseguita) e vado nella cartella dove c'è il DB access, vedo in tale caertella presente il file .LDB che Access crea appunto quando il DB è aperto da qualche connessione..quiindi a conferma che la connessione sembra venga aperta subito dopo la esecuzione della istruzione ".connectionStrin = Stringa di connessione" e quindi prima della Open vera e propria!!!! 

    Ma perchè tutto ciò SOLO se mi fermo con Break Point su Open?????? E inoltre: perchè solo sul mio unico PC con windows 11????

    Grazie ancora a chi mi aiuterà a risolvere tale arcano!!!

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

    E' un classico esempio di "funziona per sbaglio".

    Il fatto che funzioni in Rellease e non in Debug, vuol dire SOLO che in un caso non intercetti l'eccezione mentre nell'altro si.

    Il problema e' questo: in release i tempi di esecuzione sono molto piu' rapidi, quindi potrebbe accadere che stai EFFETTIVAMENTE aprendo due connessioni in parallelo, MA, per un incredibile colpo di "fondoschiena", ti si apre correttamente la TUA connessione, mentre l'altra genera eccezione.

    Invece in Debug, avviene il contrario.

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

    Ok ma non hai risposto alla domanda: se prima metti close ti da lo stesso problema?

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

    Ciao Migliorabile e Sihsandrea! Ringrazio entrambi per il supporto che mi state dando!!

    @Migliorabile: la funzione di Open viene richiamata da qualunque parte decine di volte in una sessione di lavoro perchè è la classica funzione richiamata da ovunque per fare la connessione al DB....tale funzione ha praticamente solo la inizializzazione stringa e dopo la open, e il tutto è sotto l'egida di un Try/Catch che emette messaggio di errore (e log scritto)... devo dire che, seppur interessante la tua disamina, mi sembra però poco probabile perchè la "eccezione" penso comunque la dovrei trovare nei log (e anche direttamente da messaggio a video) per quanto detto sopra...però ripeto..ogni supposizione è per me interessante e ne prendo atto....sicuramente approfondirò...questa sera

    @Sihsandrea: hai ragione...non ho risposto e non ho provato...ma fra qualche ora (adesso sono fuori casa) metterò la CLOSE fra le 2 istruzioni incriminate perchè effettivamente adesso sono curioso di vedere se la "Close" viene presa in considerazione (e quindi dovrei capire perchè si apre la connessione dopo la assegnazione stringa di connessione...) oppure se tale Close non ha effetto e ottengo comunque errore (e allora capire il perchè)..........Adesso non ho davanti il PC con tutto l'ambiente..ma fra poco sarò li e proverò...e vi aggiornerò!!

    Grazie mille ancora a entrambi!!!

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

    Aggiungo inoltre, in attesa di tornare davanti al PC con tutto il software:

    .Una volta intercettato per caso l'errore ieri, vedendo che il problema era sulla OPEN mi sono spostato allora sulla videata di Login, ovvero la prima che parte all'qvvio della procedura e lì ho cercato di capire il perchè del verificarsi dell'errore: pertanto dubito (potrebbe essere..ma dubito fortemente...) che la connessione sia rimasta aperta per errore da altre parti, proprio perchè mi sono messo nella prima open dalla partenza della procedura...

    .Avendo la procedura sempre la possibilità di puntare a SqlServer, Access o MySql, o appurato che l'errore si verifica SOLO su SqlServer e su Access e NON su MySql!! Pertanto, mi viene da pensare che la macchina con windows 11 c'entri qualcosa (che so qualche parametro di compilazione, dll, nuget....boh...............)

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

    Close prima di cambiare stringa...

    Per esperienza (e logica), visto ce l connessioni non l paghi, io ne userei una per ogni connessione a db. Una per mysql, una per sql server e una per access.

    Ma tu puoi fare come preferisci.

    09/12/2024 - GiovanniAloisio ha scritto:

    che la connessione sia rimasta aperta per errore da altre parti

    Io suppongo che in una programmazione ad oggetti, dove ogni oggetto può eseguire codice in contemporanea ad un altro, potresti trovarti in una situazione ambigua, come ambiguo è un programma con db eterogenei. Ma se lo fai usa una connessione per ogni db, tanto non costa niente.

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

    Buonasera Sihsandrea, ho fatto notte (naturalmente sul pezzo...) ma eccomi qui.

    Come da accordi ho messo la istruzione L_Connessione.Close() prima della Open() e la cosa.........FUNZIONA...ovvero pur andando in debug sulla istruzione Open() tutto procede bene, come a dire, "connessione chiusa regolarmente e quindi puoi fare la Open....". Però ricordando che tale evenienza andava in errore solo in debug e mai senza (da anni lavora regolarmente tale Open()) ho approfondito la cosa e aggiungo:

    1. Mettendo un Break Point sulla nuova istruzione di Close() il valore di L_Connessione.State è ZERO ovvero la connessione risulta comunque già chiusa e lo stesso è sempre risultato naturalmente anche nel break della istruzione precedente dove indico alla connessione la stringa di connessione appunto.

    2. Prima di avere messo la Close(), quando il debug andava in errore con il Break sulla istruzione di Open(), tale Stato risultava = 1 (prima di eseguire la Open) ed ecco che quindi la Open andava in errore trovando tale stato a 1....e io non sapevo perchè tale stato si trovasse a 1 quando nella istruzione di assegnamento strina era invece = 0....e quindi da sembrava che la istruzione di assegnazione stringa, dopo la sua esecuzione mettesse lei lo stato = 1...ma SOLO se mi fermavo in debu subito dopo....

    3. Ultima cosa: al posto della Close() di mezzo,ho provato a fare una operazione fittizia di DELETE o INSERT, che si esegue correttamente solo se la connessione è aperta, e il risultato è stato: ERRORE per connessione CHIUSA.

    Concludendo: lascerò la CLOSE() della connessione per sicurezza (invece della close() ho fatto una function che fa la Close e ove tale close dovesse andare in errore in quanto nessuna connessione è aperta ..proseguo senza dare peso all'errore...) in modo che la Open sia comunque pulita (anche se la cosa mi lascia comunque perplesso....).

    Ma la vera ciliegina finale è: adesso, dopo ore di test, se asterisco la Close() E' COMUNQUE SPARITO L'ERRORE ANCHE SE MI FERMO IN BREAK COL DEBUG!?!?!?!?!?!?!?!?

    Lascio comunque tale Close(), ma mi viene da pensare che c'era qualcosa che era rimasto incastrato con il debug (non saprei che altro pensare.....) e qui vengo al punto che mi indichi, ovvero il fatto di usare una connessione per ogni tipo di DB...ma allego sotto il perchè di una unica variabile-....

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

    La procedura della quale parlo, è stata ideata parecchi anni fa (addirittura in VB6... poi trasformata in VB.net.....cone nuovi sviluppi web poi in C#) e lìobiettivo fin da principio era stato quello di avere un software utilizzabile con i più diffusi database relazionali, ovvero non basato solo su uno di essi. Per questo avevo passato mesi interi a studiare come scrivere funzioni dinamiche che permettessero poi l'utilizzo indistintamente su un database piuttosto che su un altro (tutti poi utilizzati tramite SQL puro..Access compreso..quindi senza personalizzazioni prese dall'uno o dall'altro DB).

    Ecco perchè in installazione procedura, c'è un apposito settaggio che indica quale DB viene usata per quella installazione (o per cliente) ed ecco perchè poi le variabili per la connessione sono fichiarate come Object pr poi diventare "new sqlServer", "new MySql" o altro.... E quindi in ogni installazione si usa sempre un solo tipo di DB.

    Mi viene da pensare che debuggando e mettendo insieme prima un connessione a un DB e poi ad un altro, e andando la procedura in errore, si sia incastrato qualcosa...perchè adesso non capisco il motivo per il quale, pur togliendo la "Close()" risolutiva di mezzo (che io comunque per logica non avrei messo...anche se ora la lascio...) il tutto funziona perfettamente anche debuggando il tutto (ricordo che solo col debug ho avuto i problemi sulla Open)

    Che dire...preferivo adesso aver avuto la possibilità di risimulare l'errore come accadeva ieri e anche qualche ora fa.....ma mi fermo qui....tanto ho i log che mi dicono se qualcosa va male e anche opportuni messaggi a video!!!!!!!

    RINGRAZIO TE IN PRIMIS SHISANDREA E ANCHE MIGLIORABILE, per l'aiuto e naturalmente accetterò con gioia qualsiasi vostro consiglio....e mi auguro di poter essere un giorno io utile a voi!!!!

    Sarà mia cura naturalmente aggiornare il forum con eventuali news...forum che ringrazio e che mi ripropongo di seguire per aiutare anche io all'occorrenza!!!

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

    Perfetto... anche se close ti avevo detto di metterlo come prima istruzione (prima di cambiare stringa di connessione)

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

    Ciao Sihsandrea, non voglio farvi perdere uteriore tempo..ma aggiungo: la function dove avviene il tutto, è una function chiamata con la variabile L_Connessione passata come parametro ByRef, ovvero variabile creata prima della chiamata come Object (per poter poi essere trasformata nel tipo di connessione relativa al DB in linea...) che viene inizializzata a Nothing prima della chiamata stessa....All'interno della funzione vi è poi l'instanziamento della stessa in NEW Tipo connessione di DB, inizializzazione della ConnectionString e infine la Open. Quando ho intercettato quella apertura "magica", evidenziata anche da stato = 1, pareva che il problema fosse fra le ultime 2 istruzioni....ecco perchè ho messo li la Close.............   Purtroppo poi ieri sera, come ho scritto, sembra non verificarsi più l'errore col debug neanche ripristinando la situazione originale.....

    Ad ogni modo forse mi sarebbe utile su questo argomento, confrontarmi con quacuno di voi (forse sbagliato passare la varibile ByRef??? Forse problematico la variabile di tipo Object usata per poter poi aprire qualunque DB? Ecc. Ecc.)

    Per adesso GRAZIE ancora!!!!!

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

    Buongiorno. A parte il tuo problema che comunque hai risolto, mi lascia perplesso questa affermazione:

    09/12/2024 - GiovanniAloisio ha scritto:

     la funzione di Open viene richiamata da qualunque parte decine di volte in una sessione di lavoro perchè è la classica funzione richiamata da ovunque per fare la connessione al DB....

    In pratica apri e chiudi la connessione ad ogni query?  Sei sicuro che sia una buona scelta?

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

    Ciao Grumpy.....anni fa, quando iniziai ad affacciarmi al mondo web, con C#, mi portarono su quella strada....Ovvero, fino a che lavoravo sempre in programmi windows/Desktop aprivo la connessione in entrata e lachiudevo poi in uscita dalla stessa, lasciandola sempre aperta. Ma i colleghi di ambito C#, con i quali iniziai la ristesura del progetto, affiancando alla versione desktop in VB, quella web in C#, mi parlarono di oggetti, DLL in comune, ecc. Da li, anche in ambito Desktop, ragiono sempre in ottica web, ovvero Apertura Connessione e chiusura a emissione pagina (quindi se in elaborazione ho 5 query consecutive, NON apro e chiudo la connessione..in quella fase apro a inizio elaborazione e chiudo la connessione alla fine della stessa...), e stesura del software in maniera più consona al  fatto di avere sia la versione web che quella desktop.......

    A parte il problema di qualche giorno fa (insieme ad altri che ogni tanto capitano...soprattutto in aggiornamento di Framework...) devo dire che sono contento delle dritte avute dai colleghi tempo fa.....

    Però sono qui per qualsiasi consiglio per miglioria ed eventualmente anche per leggere qualche documentazione al riguardo (per chi volesse condividermela),

    Grazie mille!!!

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

    @grumpi: aprire e chiudere una connessione e' una pratica normale, MA c'e il trucco.

    1.  crei la 'connessione' con le informazione come utente e password UNA VOLTA,

    Quindi:

    1. Apri la connessione
    2. fai quello che devi fare
    3. chiudi la connessione

    tutte le volte che ti serve. 

    Il trucco sta nel 'connection pooling': quando chiudi la connessione, non la chiudi veramente, ma la metti nel pool. Quando la apri, non la apri veramente, ma la ricuperi da pool. La crei SOLO se il pool e' vuoto.

    E qui ci potrebbe stare l'inghippo: SE riusi una connessione che e' stata messa nel pool tentando di 'riaprirla',poiche' e' ancora aperta, hai l'eccezzione riscontrata.

    Poi ci sarebbe anche TUTTA la storia della 'transazionalita'. Quando si apre una connessione si apre ANCHE la 'transazione', e quando si 'chiude' la connessione, si chiude ANCHE la 'transazione' con COMMIT. Ma le transazioni possono essere terminate ANCHE con ROLLBACK, che serve per rimuovere tutte le modifiche fatte da quando la transazione e' stata aperta.

    Quindi 'aprire e chiudere' una connessione e' fondamentale per mantenere i dati nel database consistenti e persistenti.

    Si,si, lo so!l Autocommit, begin/end transaction, esecuzione concorrente, ed n-mila altri dettagli. ;-)

Devi accedere o registrarti per scrivere nel forum
23 risposte