【问题标题】:SQLite file location in a Visual Studio projectVisual Studio 项目中的 SQLite 文件位置
【发布时间】:2011-04-10 21:26:51
【问题描述】:

我正在开发一个小型应用程序,该项目的部分目标只是更熟悉 SQLite。主要入口点是控制台应用程序(名为 Console 的子项目),但数据访问代码位于不同的子项目(名为 Infrastructure)中。我刚刚在 Infrastructure 中创建了一个名为 Data 的文件夹,并将 .sqlite 文件放在那里,并添加了一些虚拟表和数据。

项目如下所示:

  • 解决方案
    • 控制台(项目)
    • 域(项目)
    • 基础设施(项目)
      • 数据(文件夹)

我原来的连接字符串是这样的:

var cnx = new SQLiteConnection("Data Source=testing.sqlite; FailIfMissing=True");

我首先看到的是一个 0KB 的 testing.sqlite 被放到了 Debug 目录中。一个简单的计数查询会失败,因为我引用的表显然不存在于空文件中。经过一番尝试,我发现如果我将 .sqlite 文件上的属性设置为 Content and Copy Always 并且如果我更改了连接字符串,我可以按预期连接。

var cnx = new SQLiteConnection("Data Source=Data\\testing.sqlite; FailIfMissing=True");

我在这里遗漏了什么,或者这确实是我应该在我的项目中包含文件的方式吗?

【问题讨论】:

  • 我对在这里或在 Code Review 上问这个问题犹豫不决,但我想我会先在这里尝试。

标签: sqlite ado.net


【解决方案1】:

我认为最好的方法可能是将文件移到项目之外,然后只使用 App.config 中的设置。

在 App.config 中:

<connectionStrings>
  <add name="mydb" connectionString="Data Source=D:\\Data\\testing.sqlite; FailIfMissing=True"/>
</connectionStrings>

在代码中:

private string _connectionString = ConfigurationManager.ConnectionStrings["mydb"].ConnectionString;

如果我想要项目中的物理文件,我可以继续执行上述操作。

【讨论】:

    【解决方案2】:

    如果 SQLite 数据库在分发之前不需要填充大量数据,您可以在运行时创建它。如果您希望它与可执行文件位于同一位置,请尝试创建它(VB.Net 代码)

     Dim SQLconnect As New SQLite.SQLiteConnection()
     SQLconnect.ConnectionString = "Data Source=" & Application.StartupPath & "\database.db;"
     SQLconnect.Open()
     SQLconnect.Close()
    

    这将创建一个空白数据库文件,如果您想创建表和/或加载一些数据,您可以执行以下操作(当然,在检查表是否已经存在之后):

        If tblSettingsExist = False Then
            SQLconnect.Open()
            SQLcommand = SQLconnect.CreateCommand
            SQLcommand.CommandText = "CREATE TABLE Settings(setting TEXT PRIMARY KEY, value TEXT);"
            SQLcommand.ExecuteNonQuery()
            SQLcommand.Dispose()
            SQLconnect.Close()
    
            'add records for all default settings
            SQLite_InsertRecord("Settings", "setting, value", "'someSetting1', '-1'")
            SQLite_InsertRecord("Settings", "setting, value", "'someSetting2', '0'")
            SQLite_InsertRecord("Settings", "setting, value", "'someSetting3', '1'")
        End If
    

    为了完整起见,这里是我用来插入数据的子程序:

    Public Sub SQLite_InsertRecord(ByVal table As String, ByVal fields As String, ByVal values As String)
        Dim SQLcommand As SQLiteCommand
        SQLconnect.Open()
        SQLcommand = SQLconnect.CreateCommand
        SQLcommand.CommandText = "INSERT INTO " & table & " (" & fields & ") VALUES (" & values & ")"
        Try
            SQLcommand.ExecuteNonQuery()
        Catch ex As Exception
            MsgBox(ex.Message, MsgBoxStyle.Critical, "Database Insertion Error")
        Finally
            SQLcommand.Dispose()
            SQLconnect.Close()
        End Try
    End Sub
    

    【讨论】:

      猜你喜欢
      • 2017-08-01
      • 2017-03-19
      • 1970-01-01
      • 2017-04-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-10-12
      • 1970-01-01
      相关资源
      最近更新 更多