2013-06-12 3 views
2

В настоящее время я использую эту библиотеку SQLite для своего консольного приложения: http://system.data.sqlite.org/index.html/doc/trunk/www/index.wiki - что до сих пор было выполнено с запросами SELECT, но выполнение этого INSERT вызывает у меня проблемы, которые у меня нет нашел решение для.System.Data.SQLite lock/sharing conflict

Я предполагаю, что код может быть переработан, но я не вижу, как это сделать?

Код

public string NewChannel(string _channel) 
{ 
    SQLiteConnection m_dbConnection = new SQLiteConnection(m_connection); 
    using (var cmd = m_dbConnection.CreateCommand()) 
    { 
     m_dbConnection.Open(); 
     cmd.CommandText = "INSERT INTO channels (name) VALUES (@name)"; 
     cmd.Parameters.AddWithValue("@name", _channel); 

     try 
     { 
      int result = cmd.ExecuteNonQuery(); 
      return "New channel added: " + _channel; 
     } 
     catch (Exception ex) 
     { 
      Console.WriteLine(ex.InnerException); 
      return null; 
     } 
    } 
} 

Ошибка

ошибка SQLite (10): замедленные 1375ms для SQLite блокировки/обмена конфликтов

ошибка (14): os_win.c: 34909: (5) winOpen (c: \ db.sqlite-journal) - Доступ запрещен. SQLite ошибка (14): os_win.c: 34909: (2)

winOpen (с: \ DB.SQLite-журнал) - Система не может найти файл

указан. Ошибка SQLite (14): не удается открыть файл в строке 34917 из

[118a3b3569] ошибка SQLite (14): заявление прерывается в 7: [INSERT INTO каналов (имя) VALUES (@name)]

+0

Он пытается записать файл в корне диска 'c:'. Каким пользователем вы работаете в программе? Что это за программа? (командной строки, asp.net и т. д.) И имеет ли указанный пользователь права на запись в это место? –

+0

Если вы пишете на корневом диске, они должны быть «Power User» или выше. В противном случае разрешение * Folder Permission * для этого пользователя должно быть установлено на «Чтение и запись». – Greg

+0

Но почему он пишет новый файл? Запуск визуальной студии с помощью администратора. – Michael

ответ

0

Конкретный код ошибки представляет собой следующее:

Код ошибки 14: Файл базы данных SQL Lite не может быть открыт.

Причина, по которой работает Visual Studio, как Администратор работал потому, что вы повышали разрешение на чтение и запись. Дело не в том, что на самом деле создается новый файл, но может быть Чтение или запись данных в файл.

Исходя из конкретных разрешений, которые могут быть ограничены в зависимости от заданной роли, если только разрешения не были явно определены.

Как я уже упоминал выше корня C: требует питания пользователя или выше для того, чтобы Write данных на корню. Который, когда ваша база данных пытается добавить, считается Напишите, который он, возможно, не сможет сделать.

  1. Решение 1. Четко определить разрешение для приложения/пользователя, чтобы избежать проблемы.
  2. Решение второе: напишите чек, прежде чем он попытается получить доступ к файлу данных, чтобы обеспечить надлежащее разрешение.

Пример такой проверки:

public ValidFolderPermission(string filePath) 
{ 
    if(File.Exist(filePath)) 
    { 
      // Open Stream and Read. 
      using (FileStream fs = File.Open(filePath, FileMode.Open)) 
      { 
       byte[] data = new byte[1024]; 
       UTF8Encoding temp = new UTF8Encoding(true); 

       while (fs.Read(b, 0, b.Length) > 0) 
       { 
         Console.WriteLine(temp.GetString(b)); 
       } 
      } 
    } 
} 

В этом случае, если он на самом деле открывает файл в этом пути, у вас есть соответствующий доступ. Если это не так, то у вас нет разрешения.

Важно: Для того, чтобы действительно проверить, вы должны использовать try и catch, даже, возможно, boolean returns, чтобы убедиться, что он сделал точно обрабатывать, прежде чем писать в базу данных.

Вы можете даже проверить уровень пользователей разрешения, как это:

WindowsIdentity user = WindowsIdentity.GetCurrent(); 
WindowsPrincipal role = new WindowsPrincipal(user); 

if(role.IsInRole(WindowsBuiltInRole.Administrator) 
{ 
    // Do Something 
} 
else 
{ 
    // Do Something Else 
} 

То есть общий подход, но лучше более лаконичные те, которые испытают для операционной системы для доступа пользователя к функциям управления, нулевые значения для учетной записи пользователя и т. д. для других проблем, с которыми вы можете столкнуться.

Надеюсь, это указывает на то, что вы в правильном направлении.

Смежные вопросы