¿Por qué OdbcCommand.ExecuteScalar () está lanzando una excepción AccessViolationException?

StackOverflow https://stackoverflow.com/questions/228274

Pregunta

Tengo un bloque de código destinado a extraer descripciones de texto de una tabla de base de datos y guardarlas en un archivo de texto. Se parece a esto (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();

Este código ha guardado con éxito una parte de los datos en archivos .txt, pero para muchas filas, se lanza una excepción AccessViolationException en la siguiente línea:

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

El texto de excepción se " Intenta leer o escribir en la memoria protegida. Esto suele indicar que otra memoria está dañada " ;.

El programa generalmente lanzará la excepción en las mismas filas de la tabla, pero no parece ser 100% consistente. A veces, los datos que han generado la excepción en el pasado funcionarán repentinamente.

Indudablemente, algunas personas se preguntan por qué no seleccioné simplemente ID, DETALLE LA DESCRIPCIÓN DE ELEMENTOS DE ITEMS en getItemsCommand y omití la segunda consulta. En realidad, lo hice de esa manera inicialmente, y me encontré con el mismo error con getItemsCommand.GetString (). Tenía miedo de que tal vez el conjunto de datos estaba ocupando demasiada memoria y tal vez eso estaba causando el error. Así que decidí probar este método para ver si ayudaría. No lo hizo ¿Alguien sabe por qué esto podría estar pasando?

Por cierto, ID es una INT e ITEMDESCRIPTION es una columna VARCHAR (32000). Si hay alguna diferencia, la base de datos es Borland Interbase 6.0 (Ick!)

EDITAR: ¡Me di una línea incorrecta al describir dónde se estaba lanzando la excepción! ARGH !! Arreglado ahora. Además, he probado las cosas sugeridas hasta ahora, pero no ayudaron. Sin embargo, descubrí que solo los registros muy antiguos en la base de datos causaban este error, lo cual es extraño. Si cambio la consulta para solo extraer los registros insertados en los últimos 5 años, no hay problemas. ¿Alguien me sugirió que esto podría ser un problema de conversión de codificación o algo así?

Actualización: Resuelto. El problema resultó ser un error en el controlador ODBC para nuestro software de base de datos no muy confiable. Una solución con otros controladores solucionó el problema.

¿Fue útil?

Solución

Podría ser un error en el controlador ODBC que está utilizando. ¿Qué conductor es? ¿Cuál es tu cadena de conexión?

Otros consejos

Un disparo en la oscuridad aquí ...

Intente ejecutar su lector, guarde su resultado (tal vez en una matriz o lista) y asegúrese de que el lector esté cerrado antes de ejecutar o preparar el siguiente comando. Es posible que incluso desee ir extremo y poner su construcción getItemsCommand dentro de un bloque usando para que sepa que no tiene recursos abiertos antes de ejecutar su próximo comando ...

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top