2011-01-30 17 views
5

He estado teniendo problemas con mi base de datos F-Spot por un tiempo, pero nada paralizante. Ahora, sin embargo, parece que sí; Ni siquiera puedo ejecutar F-Spot, ya que se bloquea al inicio. Comprobando la consola, lo que se rompe es un UriFormatException con el mensaje "System.UriFormatException: el esquema URI debe comenzar con una letra y debe consistir en uno de los siguientes: alfabeto, dígitos, '+', '-' o '.' personaje.". Esto se ejecuta en Mono 2.4.4.0, no en el tiempo de ejecución de Microsoft.¿Lectura de una base de datos SQLite3 desde una aplicación simple Mono/C#?

Básicamente, estoy tratando de averiguar qué filas de datos exactas están rotas, así que puedo repararlas o presentar un informe de error contra F-Spot. (He estado inmiscuyéndome en el archivo de la base de datos directamente antes, lo que podría haber causado este problema - de cualquier manera, parece que debería manejar algo así mejor que estrellándose fuerte, pero en este momento estoy más interesado en la fijación de los datos que la razón exacta por la cual la falla no se maneja de una manera un poco más elegante). La base de datos es un archivo SQLite3, y ejecutándolo manualmente en la aplicación de línea de comandos sqlite3, puedo seleccionar ambos metadatos de tabla como así como las tablas de datos en sí. Sin embargo, recibo una excepción no controlada System.ApplicationException: file is encrypted or is not a database de Mono.Data.SqliteClient.SqliteConnection.Open() desde una aplicación de prueba simple que es prácticamente una copia y pega de the official guide for SQLite and Mono. El ligado con System.Data.dll y Mono.Data.SqliteClient.dll, estoy copiando el código en cuestión aquí también está completo:

public static void Main(string[] args) { 
    string connectionString = "URI=file:f-spot.photos.db"; 
    IDbConnection dbcon; 
    dbcon = (IDbConnection) new SqliteConnection(connectionString); 
    dbcon.Open(); 
    dbcon.Close(); 
    dbcon = null; 
} 

El archivo de base de datos es, sin duda existe, y funciona bien (sqlite3 en sí tiene no tengo quejas al respecto). Google me ordena muchas páginas que comparan varios motores de bases de datos de pequeño tamaño, y sugiere que el archivo puede ser una base de datos SQLite2. Sin embargo, AFAIK no tengo bibliotecas SQLite2 en mi sistema, y ​​file específicamente afirma que el archivo es una "base de datos SQLite 3.x". No solo eso, las versiones de F-Spot más nuevas que 0.3.5 require SQLite 3, y estoy en la versión 0.6.2, y lo he estado haciendo durante mucho tiempo. ¿Intento leerlo utilizando la API incorrecta o, por casualidad, el DSN está equivocado?

Cualquier sugerencia sobre qué probar sería apreciada. Claro que puedo usar sqlite3 para extraer los datos, guardarlos en archivos de texto, luego analizarlos, pero eso introduce otro par de niveles de incertidumbre que realmente preferiría evitar si fuera posible usando tan cerca de la misma API que F-Spot como puedo para acceder a los datos.

Respuesta

4

Creo que necesita establecer específicamente la versión del motor sqlite en la cadena de conexión. Intente agregar "version = 3" a la constante de cadena de conexión. Cambié un poco tu código, a ver si funciona para ti.

public static void Main(string[] args) { 
    string connectionString = "URI=file:f-spot.photos.db,version=3"; //<-- version is set to 3 
    IDbConnection dbcon; 
    dbcon = (IDbConnection) new SqliteConnection(connectionString); 
    dbcon.Open(); 
    dbcon.Close(); 
    dbcon = null; 
} 

Para más información Comprobar sección "Cadena de conexión Formato" de la documentación here

esperanza que esta ayuda, que se refiere a

Cuestiones relacionadas