Работа с SQLite в C#

Кратко, по существу, решение проблем с которыми пришлось столкнуться:

  1. При открытии базы
    using (SQLiteConnection conn = new SQLiteConnection(ConnectionString, true))
                {
                    using (SQLiteCommand cmd = new SQLiteCommand(sql, conn))
                    {
                        if (conn.State == ConnectionState.Closed)
                            try
                            {
                                conn.Open();
                            }
                            catch (System.Exception ex)
                            {
                                sr.Close();
                              System.Windows.Forms.MessageBox.Show(ex.ToString());
                            }
    после conn.Open(); вылетала ошибка
    unable to open database file (код ошибки 14 или 0x80004005)
    как оказалось это было связано с правами доступа к файлу базы данных добавление FileShare.ReadWrite решило проблему
    FileStream sr = File.Open(openFileDialog1.FileName, FileMode.Open, FileAccess.Read, FileShare.ReadWrite);
  2. Две связанные проблемы
    В существующем файле базы данных примерно следующая структура
    id, INTEGER
    name, TEXT
    ver, TEXT
    данные в полях TEXT хранятся в кодировке cp-1251 и при выполнении запроса
    SELECT id, name, ver from database
    данные в строковых переменных присутствую вопросики «����»
    решается все выполнением запроса следующего вида
    SELECT id, hex(name), hex(ver) from database
    в этом случае возвращается строка, содержащая HEX значения,
    в дальнейшем эта строка конвертируется в нормальный вид.
    using (SQLiteDataReader dr = cmd.ExecuteReader())
    {
    foreach (DbDataRecord record in dr)
    {
    string id= record.GetValue(record.GetOrdinal(«id»)).ToString();
    string name = FromHexString(record.GetValue(record.GetOrdinal(«hex(name)»)).ToString());
    string ver= FromHexString(record.GetValue(record.GetOrdinal(«hex(ver)»)).ToString());
    }
    }
    функция преобразования
    public static string FromHexString(string hexString)
    {
    var bytes = new byte[hexString.Length / 2];
    for (var i = 0; i < bytes.Length; i++)
    {
    bytes[i] = Convert.ToByte(hexString.Substring(i * 2, 2), 16);
    }
    return Encoding.GetEncoding(1251).GetString(bytes);
    }
     

    вторая проблема — доступ к содержимому по имени столбца
    если в таким виде все хорошо работало
    1 запись — record.GetValue(0)).ToString())
    2 запись — record.GetValue(1)).ToString())
    то для доступа по имени надо делать такую конструкцию
    record.GetOrdinal(«hex(name)»).ToString()), т.е.
    НЕ name или ver, а в соответствии с запросом
    hex(name) и hex(ver)