Username
Password

Programmazione

Supporto per Linguaggi di Programmazione
Wednesday, 19 May 2010, 07:44
gillesvilleneuve
 GillesVilleneuve
 Utente Appassionato
 
L'avatar di  gillesvilleneuve
 
 Messaggi: 1,446

Problema con "Attempted to read or write protected memory"


Errore:

System.AccessViolationException non è stata gestita
Message="Attempted to read or write protected memory. This is often an indication that other memory is corrupt."
Source="System.Data.SqlServerCe"
StackTrace:
at System.Data.SqlServerCe.NativeMethods.SafeRelease( IntPtr& ppUnknown)
at System.Data.SqlServerCe.SqlCeDataReader.ReleaseNat iveInterfaces()
at System.Data.SqlServerCe.SqlCeDataReader.Dispose(Bo olean disposing)
at System.Data.SqlServerCe.SqlCeDataReader.Finalize()
InnerException:

Ne sapete qualcosa? se compilo e lancio il programma, mi da questo errore, se invece lancio il programma dall'eseguibile compilato mi funziona...

La cosa strana è che me lo da in punti diversi (quando eseguo qualcosa sul DB) e se provo ad eseguirlo passo passo ogni tanto non me lo da... (partendo sempre dagli stessi dati)

P.S. mi sento un po rompiscatole
    Rispondi Citando Rispondi
Wednesday, 19 May 2010, 08:03
Neles
 Davide P.
 Militante
 
L'avatar di  Neles
 
 Località: Genoa
 Età: 45
 Messaggi: 3,577

Due cose ho trovato in giro velocemente:
  • problemi di sicurezza col framework 2.0 (qui);
  • DataReader lasciati aperti "in giro" (qui).
Spero possa aiutare in qualche modo...
__________________
There is no dark side of the Moon really... matter of fact it's all dark.

Chuck Norris non bestemmia, è Dio che compie una metamorfosi per accontentarlo
    Rispondi Citando Rispondi
Wednesday, 19 May 2010, 08:44
Bramins
 VG Vip
 
L'avatar di  Bramins
 
 Messaggi: 297

Non sò se è il tuo caso ......

http://support.microsoft.com/kb/923028

http://connect.microsoft.com/VisualS...ownloadID=6003
    Rispondi Citando Rispondi
Wednesday, 19 May 2010, 09:40
gillesvilleneuve
 GillesVilleneuve
 Utente Appassionato
 
L'avatar di  gillesvilleneuve
 
 Messaggi: 1,446

Quote:
Originariamente inviato da Neles
DataReader lasciati aperti "in giro"

Questa è la mia funzione che uso per connettermi.

Codice:
static public SqlCeConnection ConnettiDB(string NomeDB) { SqlCeConnection Connessione = null; try { Connessione = new SqlCeConnection("Data Source=" + NomeDB + ";Persist Security Info=False"); Connessione.Open(); } catch (Exception ex) { MessageBox.Show("Connessione al DB non riuscita\n" + ex, "Errore", MessageBoxButtons.OK, MessageBoxIcon.Error); Connessione.Dispose(); } return Connessione; }

Questa invece è la funzione per la la Select:

Codice:
static public SqlCeDataReader SelezionaInDB(string NomeDB, string NomeTabella, string NomeColonna, string Condizione, ref int NumeroRighe) { SqlCeConnection Connessione = null; SqlCeCommand Query = null; SqlCeDataReader RisQuery = null; if (NAttivita > LogAttivita.Count() - 500) { Array.Resize(ref LogAttivita, LogAttivita.Count() + 500); LogAttivita[NAttivita++] = DateTime.Now + ":" + DateTime.Now.Millisecond.ToString().PadLeft(3, '0') + " Debug -> Aumentato a " + LogAttivita.Count() + " l'Array delle attivita"; } if (File.Exists(NomeDB)) //mi chiedo se il file esiste { Connessione = ConnettiDB(NomeDB); if (Connessione != null) { if (Condizione == "") { //Seleziono tutto senza nessuna eccezione string strQuery = ""; if (NomeTabella.Contains(" ")) strQuery = "SELECT COUNT(*) FROM " + (NomeTabella.Remove(NomeTabella.IndexOf(" "),(NomeTabella.Length-NomeTabella.IndexOf(" ")))); else strQuery = "SELECT COUNT(*) FROM " + NomeTabella; Query = new SqlCeCommand(strQuery, Connessione); NumeroRighe = Convert.ToInt32(Query.ExecuteScalar()); strQuery = "SELECT " + NomeColonna + " FROM " + NomeTabella; Query = new SqlCeCommand(strQuery, Connessione); RisQuery = Query.ExecuteReader(); LogAttivita[NAttivita++] = DateTime.Now + ":" + DateTime.Now.Millisecond.ToString().PadLeft(3, '0') + " Query -> " + strQuery; } else { //Seleziono con eccezione string strQuery = "SELECT COUNT(*) FROM " + NomeTabella + " WHERE " + Condizione; Query = new SqlCeCommand(strQuery, Connessione); NumeroRighe = Convert.ToInt32(Query.ExecuteScalar()); strQuery = "SELECT " + NomeColonna + " FROM " + NomeTabella + " WHERE " + Condizione; Query = new SqlCeCommand(strQuery, Connessione); RisQuery = Query.ExecuteReader(); LogAttivita[NAttivita++] = DateTime.Now + ":" + DateTime.Now.Millisecond.ToString().PadLeft(3, '0') + " Query -> " + strQuery; } } } return (RisQuery); }

Richiamo il tutto così
Codice:
SqlCeDataReader RisQuery = SelezionaInDB(NomeDataBaseEasyBills, "Clienti", "*", "", ref NumeroRighe);

dopo che ho finito di usare la RisQuery faccio il Dispose();

Sbaglio qualcosa?

in effetti la connessione non la chiudo... forse è questo il problema
    Rispondi Citando Rispondi
Commenti a questo messaggio
  Neles: RisQuery.Close()
  SataNik: Concordo con Neles.
Wednesday, 19 May 2010, 11:12
gillesvilleneuve
 GillesVilleneuve
 Utente Appassionato
 
L'avatar di  gillesvilleneuve
 
 Messaggi: 1,446

Neles, la cosa che mi risulta strana è che se avvio l'eseguibile FUNZIONA!!! e che caspita!!!!
    Rispondi Citando Rispondi
Wednesday, 19 May 2010, 11:30
Neles
 Davide P.
 Militante
 
L'avatar di  Neles
 
 Località: Genoa
 Età: 45
 Messaggi: 3,577

La differenza di eseguire l'applicativo in ambiente di debug o meno può modificare in effetti dei tempi di accesso in modo (per quanto ne sappia io) pressoché impredicibile.

L'unico tentativo che si può fare in tempi brevi è modificare la Dispose() di RisQuery in Close(), giusto per capire se è l'esecuzione dei dispose che può essere diversa nell'ambiente di test rispetto all'esecuzione "normale".
__________________
There is no dark side of the Moon really... matter of fact it's all dark.

Chuck Norris non bestemmia, è Dio che compie una metamorfosi per accontentarlo
    Rispondi Citando Rispondi
Wednesday, 19 May 2010, 11:45
SataNik
 Raffaele Fazio
 Staff
 
L'avatar di  SataNik
 
 Località: Serrastretta (CZ)
 Messaggi: 10,655

Potrebbe essere un problema legato al garbage collector che in modalità debug lavora in un modo (meno ottimizzato) e in release in un altro.
La dispose potresti pure non chiamarla, perchè l'oggetto verrebbe ripulito al primo giro di garbage collector che non trova riferimento all'oggetto.
Usa la Close, ma non è detto sia quello.
Che versione di CF stai usando ? C'è dentro l'ultimo SP ?
__________________


"Se il risultato conferma le ipotesi, allora hai appena fatto una misura, se il risultato è contrario alle ipotesi, allora hai fatto una scoperta."
    Rispondi Citando Rispondi
Wednesday, 19 May 2010, 14:18
gillesvilleneuve
 GillesVilleneuve
 Utente Appassionato
 
L'avatar di  gillesvilleneuve
 
 Messaggi: 1,446



ok? il SO è windows XP 32bit

il CF è aggiornato!
Icone Allegate
Clicca sull'immagine per ingrandirla

Nome:  Visiva.jpg
Visite: 1535
Dimensione:  30.5 KB
ID: 12815  
    Rispondi Citando Rispondi
Wednesday, 19 May 2010, 14:29
gillesvilleneuve
 GillesVilleneuve
 Utente Appassionato
 
L'avatar di  gillesvilleneuve
 
 Messaggi: 1,446

Scusate l'OT ma non mi arrivano più le notifiche quando qualcuno risponde agli argomenti dove sono iscritto. (era già successo tempo fa)
    Rispondi Citando Rispondi
Thursday, 20 May 2010, 06:39
gillesvilleneuve
 GillesVilleneuve
 Utente Appassionato
 
L'avatar di  gillesvilleneuve
 
 Messaggi: 1,446

ho sostituito le Dispose con delle Close, ma il risultato non cambia.
    Rispondi Citando Rispondi
Thursday, 20 May 2010, 07:08
SataNik
 Raffaele Fazio
 Staff
 
L'avatar di  SataNik
 
 Località: Serrastretta (CZ)
 Messaggi: 10,655

Se tu programmavi in C o C++, il problema era identificabile con un puntatore a null .. che andava a scrivere in una zona protetta.
Sotto .NET, visto che i puntatori sono mascherati e quindi tu non puoi impostarli a mano, direi che il problema è nelle librerie, anche perchè l'unica cosa scorretta (la dispose), l'hai corretta, quindi non penso sia roba tua.
Consiglio: prova a cambiare versione di sqlce, magari metti un'altra lingua, o una versione prima, tanto per quello che devi fare va bene lo stesso.
Potresti segnalare la cosa alla ms .. c'è un forum apposito. Qua non ne usciamo sicuro
__________________


"Se il risultato conferma le ipotesi, allora hai appena fatto una misura, se il risultato è contrario alle ipotesi, allora hai fatto una scoperta."
    Rispondi Citando Rispondi
Thursday, 20 May 2010, 07:24
gillesvilleneuve
 GillesVilleneuve
 Utente Appassionato
 
L'avatar di  gillesvilleneuve
 
 Messaggi: 1,446

Allora, ho trovato un modo per far andare il programma... mi pare una cavolata, ma così funziona.

Questo è il codice che si avvia allo shown della Form1

Codice:
//Azioni eseguite alla prima visualizzazione della form private void Home_Shown(object sender, EventArgs e) { //Carico tutti i clienti e li metto in tabella LogAttivita[NAttivita++] = DateTime.Now + ":" + DateTime.Now.Millisecond.ToString().PadLeft(3, '0') + " -> Caricamento elenco clienti..."; TimerStart = DateTime.Now; int NumClienti = 0; SqlCeDataReader RisQuery = SelezionaInDB(NomeDataBaseEasyBills, "Clienti", "*", "", ref NumClienti); if (PopolaTabellaClienti(RisQuery, NumClienti) == true) { TimeSpan TempoPassato = DateTime.Now - TimerStart; LogAttivita[NAttivita++] = DateTime.Now + ":" + DateTime.Now.Millisecond.ToString().PadLeft(3, '0') + " -> Fatto! (" + Convert.ToString(TempoPassato.Seconds).PadLeft(2, '0') + ""." + Convert.ToString(TempoPassato.Milliseconds).PadLeft(3, '0') + ")"; } RisQuery.Close(); //Fine caricamento clienti AggiornaStatistiche(); //Carico tutti i filtri Se ce ne sono 0 devo selezionare tutte le fatture altrimenti applico l'ultimo filtro usato if (CaricaStoricoFiltri() == 0) { TimerStart = DateTime.Now; LogAttivita[NAttivita++] = DateTime.Now + ":" + DateTime.Now.Millisecond.ToString().PadLeft(3, '0') + " -> Caricamento elenco fatture emesse..."; int NumFatture = 0; RisQuery = SelezionaInDB(NomeDataBaseEasyBills, "Fatture", "*", "", ref NumFatture); if (PopolaTabellaFatture(RisQuery, NumFatture) == true) { TimeSpan TempoPassato = DateTime.Now - TimerStart; LogAttivita[NAttivita++] = DateTime.Now + ":" + DateTime.Now.Millisecond.ToString().PadLeft(3, '0') + " -> Fatto! (" + Convert.ToString(TempoPassato.Seconds).PadLeft(2, '0') + ""." + Convert.ToString(TempoPassato.Milliseconds).PadLeft(3, '0') + ")"; } } else { TimerStart = DateTime.Now; LogAttivita[NAttivita++] = DateTime.Now + ":" + DateTime.Now.Millisecond.ToString().PadLeft(3, '0') + " -> Caricamento elenco fatture emesse..."; int NumeroRighe = 0; RisQuery = SelezionaInDB(NomeDataBaseEasyBills, "Filtri", "MAX(DataUltimoUtilizzo)", "", ref NumeroRighe); RisQuery.Read(); RisQuery = SelezionaInDB(NomeDataBaseEasyBills, "Filtri", "TestoFiltro", "DataUltimoUtilizzo = '" + RisQuery.GetString(0) + "'", ref NumeroRighe); RisQuery.Read(); comboBoxFiltro.Text = RisQuery.GetString(0); } RisQuery.Close(); VisualizzaMappa("Italia", "", "", "", "", "4"); }

Prima mettevo la procedura AggiornaStatistiche(); in fondo, sotto VisualizzaMappa("Italia", "", "", "", "", "4"); e mi dava errore.

Allora ho provato a spostarlo in alto come prima istruzione, e anche li mi dava errore, messo invece dove è messo ora, funziona.... non chiedetemi il perchè...
    Rispondi Citando Rispondi
Commenti a questo messaggio
  Neles: Yabadabaduu!
Thursday, 20 May 2010, 07:47
Neles
 Davide P.
 Militante
 
L'avatar di  Neles
 
 Località: Genoa
 Età: 45
 Messaggi: 3,577

Sono contento che si sia risolto, anche perché il prossimo passo sarebbe stato lo sgozzamento del gallo nero...

Domanda: AggiornaStatistiche() e/o VisualizzaMappa(...) hanno a che fare con dei DataReader?
__________________
There is no dark side of the Moon really... matter of fact it's all dark.

Chuck Norris non bestemmia, è Dio che compie una metamorfosi per accontentarlo
    Rispondi Citando Rispondi
Thursday, 20 May 2010, 08:24
gillesvilleneuve
 GillesVilleneuve
 Utente Appassionato
 
L'avatar di  gillesvilleneuve
 
 Messaggi: 1,446

AggiornaStatistiche(), si fa una decina di select
Visualizzamappa() no...
    Rispondi Citando Rispondi
Monday, 3 October 2011, 08:36
gillesvilleneuve
 GillesVilleneuve
 Utente Appassionato
 
L'avatar di  gillesvilleneuve
 
 Messaggi: 1,446

Allora, ho capito il problema e sono riuscito a risolverlo, perlomeno ho trovato un metodo che mi evita il blocco.

Allora...

se io fatto due select di cui la seconda dipende dai risultati della prima il db si blocca...

faccio un esempio che non mi so spiegare bene.

RisQuery = SelezionaInDB(NomeDataBaseEasyBills, "Clienti", "Denominazione,Nome,Cognome", "IdCliente = " + IdClinte, ref NumeroRighe);

adesso, se io rifaccio una select senza fare un risquery.dispose
il programma solo in fare di debug si blocca.

quindi per fare la seconda select, mi salvo i dati in variabili separate:

quindi faccio 3 stringhe con la denominazione il nome e il cognome

faccio il dispose

e poi rifaccio la select utilizzando le stringhe!!!!

diventa così!

Codice:
RisQuery = SelezionaInDB(NomeDataBaseEasyBills, "Clienti", "Denominazione,Nome,Cognome", "IdCliente = " + IdClinte, ref NumeroRighe); RisQuery.Read(); Denominazione = RisQuery.GetString(0); Nome = RisQuery.GetString(1); Cognome = RisQuery.GetString(2); RisQuery.Dispose(); RisQuery.Close(); labelClienteMenoFatture.Text = "Cliente con meno Fatture : " + Denominazione + ", " + Nome + ", " + Cognome; RisQuery.Dispose(); RisQuery.Close();
    Rispondi Citando Rispondi
Commenti a questo messaggio
  RomeoKnight: Soluzione rapida!
Rispondi Invia Nuova Discussione


Utenti attualmente attivi che stanno leggendo questa discussione: 1 (0 utenti e 1 visitatori)
 

Thread già visto da:
C0m4nch3, Pocket, SilBerg, RomeoKnight, Duilio, JoeBar, palin, S71ng, gattonero, BRAVO 2, SatRider, Foxes, ale82x, Neles, Attilio, rachel, Bramins
Strumenti Discussione Cerca in questa Discussione
Cerca in questa Discussione:

Ricerca Avanzata
Modalità Visualizzazione

top Regole di scrittura
Tu non puoi inserire messaggi
Tu non puoi rispondere ai messaggi
Tu non puoi inviare allegati
Tu non puoi modificare i tuoi messaggi

codice vB è Attivo
Smilies è Attivo
[IMG] il codice è Attivo
Il codice HTML è Attivo

Se hai problemi, contattaci


Visite Totali Posts: 81.268.632
Tutti gli Orari sono GMT +1. Attualmente sono le 06:54.

iGroup Black
Powered by vBulletin Versione 3.5.6
Copyright ©2000 - 2020, Jelsoft Enterprises Ltd.
Traduzione italiana a cura di: Enzo-Staff-VbulletinItalia.it
 
2000, 2012 © Visiva Group