System.Data.SQLite.SQLiteException 尝试在Windows 8上写入只读数据库

6

我开发了一个应用程序,在Windows 7及以下版本中运行良好。它使用VB和C#编写的SQLlite数据库。然而,在Windows 8上(在其他Windows操作系统上从未遇到过这个问题),尝试向数据库写入时会出现问题。

System.Data.SQLite.SQLiteException: Attempt to write a read-only database

我在Windows 8电脑上创建了一个数据库文件,如下:

 Try
     If (Not File.Exists(System.Environment.CurrentDirectory & "\MY_DB.db")) Then
                Dim conn = New SQLite.SQLiteConnection("Version=3;New=True;Compress=False;Read Only=False;Data Source=" & System.Environment.CurrentDirectory & "\MY_DB.db")
                conn.Open()
                '...DO STUFF  
                conn.Close()
                conn.Dispose()
                conn = Nothing
     End If

 Catch ex As Exception
            'Throw ex
            Return False
 End Try

但是没有起作用。

所以我尝试了以下方法:

  1. 创建db文件时添加Read Only=False,但没有起作用。
  2. 数据库所在的文件夹必须具有写入权限,实际的数据库文件也是如此。我已经做过了,但没起作用(在Windows 7上看起来像这样enter image description here)。

我该怎么做才能让数据库可写?


1
我曾经遇到过同样的问题,那是因为文件夹权限的原因。你尝试给“Everyone”组分配修改和写入权限了吗? - Mark PM
为什么要通过System.Environment.CurrentDirectory访问数据库?如果用户打开了文件对话框(会更改当前目录选择),这种方法就行不通了。而且,应该将数据库放在应用程序数据中,而不是与程序一起。 - Sheng Jiang 蒋晟
实际上,数据库只是用于日志问题的存在原因,但是当我尝试编写任何事件时,我会收到这个错误... - edgarmtze
1个回答

6

我不知道你的调用瞬间是什么当前目录,但我会确保按设计将我的数据库放置于每个用户都具有读写权限的文件夹中。

为什么不使用由Environment.SpecialFolder枚举表示的文件夹?

你可以将代码更改为以下内容:

 Try
      Dim appFolder = Environment.GetFolderPath(Environment.SpecialFolder.CommonApplicationData)
      appFolder = Path.Combine(appFolder, "MyAppDatabaseFolder")
      If Not Directory.Exists(appFolder) Then
           Directory.CreateDirectory(appFolder)
      End If
      Dim myDB = Path.Combine(appFolder, "MY_DB.db")
      If (Not File.Exists(myDB)) Then
          .....
      End If
 Catch ex As Exception
      'Throw ex
      Return False
 End Try

有没有办法以编程的方式授予文件夹权限,并按照@Mark PM的建议将“Everyone”组的修改和写入权限赋予程序? - edgarmtze
你可以查看这个问题,并检查是否对你可行。然而,我建议避免这条路。遵循操作系统所建立的规则。用于存储所有用户应用程序数据的文件夹(文件数据库是一个完美的例子)是使用SpecialFolder.CommonApplicationData定义的。使用不同的文件夹是可能的,但是,为什么要与操作系统争斗呢?无论如何,你都会失去一些东西(肯定会浪费时间来解决问题)。 - Steve

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接