Domanda

Ho un blocco di codice destinato a estrarre le descrizioni di testo da una tabella del database e salvarle in un file di testo. Sembra così (C # .NET):

        OdbcCommand getItemsCommand = new OdbcCommand("SELECT ID FROM ITEMS", databaseConnection);
        OdbcDataReader getItemsReader = getItemsCommand.ExecuteReader();
        OdbcCommand getDescriptionCommand = new OdbcCommand("SELECT ITEMDESCRIPTION FROM ITEMS WHERE ID = ?", databaseConnection);
        getDescriptionCommand.Prepare();
        while (getItemsReader.Read())
        {
            long id = getItemsReader.GetInt64(0);
            String outputPath = "c:\\text\\" + id + ".txt";
            if (!File.Exists(outputPath))
            {
                getDescriptionCommand.Parameters.Clear();
                getDescriptionCommand.Parameters.AddWithValue("id", id);
                String description = (String)getDescriptionCommand.ExecuteScalar();
                StreamWriter outputWriter = new StreamWriter(outputPath);
                outputWriter.Write(description);
                outputWriter.Close();
            }
        }
        getItemsReader.Close();

Questo codice ha salvato correttamente una parte dei dati in file .txt, ma per molte righe, viene lanciata una AccessViolationException sulla seguente riga:

                String description = (String)getDescriptionCommand.ExecuteScalar();

Il testo dell'eccezione è tentato di leggere o scrivere nella memoria protetta. Questo è spesso un'indicazione che l'altra memoria è corrotta " ;.

Il programma di solito genera l'eccezione sulle stesse righe della tabella, ma non sembra coerente al 100%. A volte i dati che avevano generato l'eccezione in passato funzioneranno improvvisamente.

Alcune persone si chiedono senza dubbio perché non ho semplicemente SELEZIONATO ID, DESCRIZIONE ARTICOLO DAGLI ARTICOLI nel comando getItemsCommand e ho saltato la seconda query. In realtà, l'ho fatto inizialmente così e stavo riscontrando lo stesso errore con getItemsCommand.GetString (). Temevo che forse il set di dati occupasse troppa memoria e che forse causasse l'errore. Quindi ho deciso di provare questo metodo per vedere se sarebbe stato d'aiuto. No Qualcuno sa perché questo potrebbe accadere?

A proposito, ID è un INT e ITEMDESCRIPTION è una colonna VARCHAR (32000). Se fa la differenza, il database è Borland Interbase 6.0 (Ick!)

EDIT: ho indicato la linea sbagliata nel descrivere dove veniva generata l'eccezione !! ARGH !! Riparato ora. Inoltre, ho provato le cose suggerite finora, ma non mi hanno aiutato. Tuttavia, ho scoperto che solo i record molto vecchi nel database causavano questo errore, il che è strano. Se cambio la query per estrarre solo i record inseriti negli ultimi 5 anni, non ci sono problemi. Qualcuno mi ha suggerito che questo potrebbe essere un problema di conversione della codifica o qualcosa del genere?

Aggiornamento: risolto. Il problema si è rivelato essere un errore nel driver ODBC per il nostro software di database non molto affidabile. Una soluzione alternativa con altri driver ha risolto il problema.

È stato utile?

Soluzione

Potrebbe trattarsi di un bug nel driver ODBC in uso. Che driver è? Qual è la tua stringa di connessione?

Altri suggerimenti

Uno scatto nel buio qui ...

Prova a eseguire il tuo lettore, salvando il tuo risultato (magari in un array o in un elenco) e assicurandoti che il lettore sia chiuso prima di eseguire o preparare il comando successivo. Potresti anche voler andare estremo e mettere la tua costruzione getItemsCommand in un blocco usando così sai che non ha risorse aperte prima di eseguire il tuo prossimo comando ...

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top