Чтение базы данных SQLite3 из простого приложения Mono / C #? - PullRequest
5 голосов
/ 30 января 2011

У меня были проблемы с базой данных F-Spot, но ничего не мешало.Теперь, однако, похоже, что я делаю;Я даже не могу запустить F-Spot, так как он падает при запуске.Проверяя консоль, что она ломает, это UriFormatException с сообщением «System.UriFormatException: схема URI должна начинаться с буквы и должна состоять из одного из алфавита, цифр,« + »,« - »или«. »персонаж.".Это работает на Mono 2.4.4.0, а не на Microsoft.

По сути, я пытаюсь выяснить, какие именно строки данных повреждены, так что я могу либо исправить их, либо подать отчет об ошибке в F-Место.(Я непосредственно раньше вмешивался в файл базы данных, что могло бы вызвать эту проблему - в любом случае, казалось бы, что он должен справиться с чем-то подобным лучше, чем с помощью крушения, но в этот самый момент меня больше интересуетв исправлении данных, чем точная причина, по которой сбой не обрабатывается немного более изящно.) База данных представляет собой файл SQLite3, и, запустив его вручную в приложении командной строки sqlite3, я могу выбрать обе таблицыметаданные, а также сами таблицы данных.Тем не менее, я получаю необработанное исключение System.ApplicationException: file is encrypted or is not a database из Mono.Data.SqliteClient.SqliteConnection.Open () из простого тестового приложения, которое является ничем иным, как копированием-вставкой из официального руководства для SQLite и Mono .Связывая System.Data.dll и Mono.Data.SqliteClient.dll, я также копирую соответствующий код здесь для полноты:

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

Файл базы данных определенно существует и работает нормально (sqlite3сам по себе нареканий нет).Поиск в Google дает мне множество страниц, сравнивающих различные малогабаритные движки баз данных, и намекает на то, что файл может быть базой данных SQLite2.Тем не менее, AFAIK У меня нет библиотек SQLite2 в моей системе, и file специально заявляет, что файл является «базой данных SQLite 3.x».Мало того, версии F-Spot, более новые, чем 0.3.5 , требуют SQLite 3 , а я использую версию 0.6.2, и уже давно.Я пытаюсь прочитать его, используя неправильный API, или случайно DSN не так?

Буду признателен за любые предложения о том, что попробовать.Конечно, я могу использовать sqlite3 для извлечения данных, сохранения их в текстовые файлы, а затем для их анализа, но это вводит еще пару уровней неопределенности, которых я действительно предпочел бы избежать, если это возможно, используя как можно более близкий API, чем F-Спот как я могу получить доступ к данным.

1 Ответ

4 голосов
/ 31 января 2011

Я думаю, вам нужно специально установить версию движка sqlite в строке подключения. Попробуйте добавить « version = 3 » в константу строки подключения. Я немного изменил ваш код, посмотрите, будет ли он работать на вас.

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

Подробнее см. В разделе «Формат строки подключения» документации здесь

надеюсь, это поможет, с уважением

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...