2011-01-30 13 views
5

Bir süredir F-Spot veri tabanımla ilgili sorun yaşıyorum, ama hiçbir şey sakatlanmadı. Şimdi, ancak, benim yaptığım gibi görünüyor; Açılışta çöktüğü için F-Spot'u bile başlatamıyorum. Konsolu kontrol etmek, "System.UriFormatException: URI şeması bir harfle başlamalı ve alfabeden, haneden," + "," - "veya". "Dan oluşan bir ileti ile UriFormatException'un ne olduğunu keser. karakter.". Bu Microsoft'un çalışma zamanı değil, Mono 2.4.4.0 üzerinde çalışıyor.Basit bir Mono/C# uygulamasından bir SQLite3 veritabanı okunuyor mu?

Temel olarak, tam olarak hangi veri satırlarının bozuk olduğunu bulmaya çalışıyorum, ya onları onarabilirim veya F-Spot'a karşı bir hata raporu yazabilirim. (Daha önce veritabanı dosyasında dolaşıyordum, bu da bu belaya neden olmuş olabilir - her iki şekilde de, böyle bir şeyle uğraşmaktan çok daha iyi bir şey yapmalı gibi görünüyor, ama bu anda daha çok ilgileniyorum Verilerin düzeltilmesinde, başarısızlığın neden daha az zarif bir şekilde ele alınmadığının tam nedeninden daha fazlası.) Veritabanı bir SQLite3 dosyasıdır ve komut satırı sqlite3 uygulamasında manuel olarak çalıştırılarak, hem tablo meta verilerine hem de veri tablolarının kendileri gibi. Yine de, the official guide for SQLite and Mono'dan bir kopyala yapıştırmadan başka hiçbir şey olmayan basit bir sınama uygulamasından Mono.Data.SqliteClient.SqliteConnection.Open() öğesinden işlenmeyen bir özel durum System.ApplicationException: file is encrypted or is not a database aldım. Kesinlikle orada

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; 
} 

veritabanı dosyası olup, kendisi vardır Sqlite3 (cezası çalışma: System.Data.dll ve Mono.Data.SqliteClient.dll karşı Bağlama, ben şeyiyle burada da ilgili kodun taklit ediyorum bunun hakkında hiçbir şikayetler. Googling, çeşitli küçük boyutlu veritabanı motorlarını karşılaştıran birçok sayfayı bana sağlıyor ve belki de bir SQLite2 veritabanı olan dosyadaki ipuçlarını veriyor. Ancak, AFAIK Sistemimde SQLite2 kütüphanesi yok ve file özellikle dosyanın "SQLite 3.x veritabanı" olduğunu iddia ediyor. Sadece bu değil, 0.3.5 require SQLite 3'dan daha yeni F-Spot sürümleri ve 0.6.2 sürümü üzerindeyim ve şu an uzun süredir varım. Yanlış API kullanarak okumaya mı çalışıyorum yoksa DSN yanlış bir ihtimal mi?

Denenmesi gerekenler hakkında herhangi bir öneride bulunulur. Verileri ayıklamak, metin dosyalarına kaydetmek ve sonra bunları ayrıştırmak için sqlite3 kullanabileceğime eminim, ancak F-Spot ile aynı API'ye yakın olarak kullanmaktan gerçekten kaçınmayı tercih ettiğim birkaç belirsizlik katmanını tanıtır. Verilere erişebilmek için

cevap

4

Özellikle bağlantı dizesinde sqlite motor sürümünü ayarlamanız gerektiğini düşünüyorum. Bağlantı dizgisi sabitinize "sürüm = 3" eklemeyi deneyin. Kodunu biraz değiştirdim, senin için çalışıp çalışmadığını gör. Daha fazla ayrıntı için

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; 
} 

bakımından, dokümantasyon bu yardımcı olur here

umut "Bağlantı Dize Biçimi" bölümünü kontrol

İlgili konular