connectionString 上的“值不能为空。(参数'path1')”

问题描述 投票:0回答:3

调试时我可以成功连接到 SQLite 数据库。但是在构建 .NET 应用程序之后,SQLite 在使用时遇到了麻烦

system.IO.Path.Combine
:

at System.IO.Path.Combine(String path1, String path2)
at System.Data.SQLite.SQLiteConnection..ctor(String connectionString, Boolean parseViaFramework)
at LDF_DetectionTool.DatabaseConnector.GetApplicationsList() in SomePath\DatabaseConnector.cs:line 23

代码:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Data.SQLite;
using System.Data;

namespace LDF_DetectionTool
{
    internal class DatabaseConnector
    {

        public List<string> GetApplicationsList()
        {
            string databaseFileName = "Databases\\LDF_DETECTION_TOOL_DATA.db";
            string databaseFilePath = AppDomain.CurrentDomain.BaseDirectory + databaseFileName;
            string connectionString = "Data Source=" + databaseFilePath;

            List<string> applicationList = new List<string>();
            try
            {
                using (SQLiteConnection connection = new SQLiteConnection(connectionString, true))
                {
                    connection.Open();

                    string query = "SELECT * FROM APPLICATIONS";
                    using (SQLiteCommand command = new SQLiteCommand(query, connection))
                    {
                        using (SQLiteDataReader reader = command.ExecuteReader())
                        {
                            while (reader.Read())
                            {
                                applicationList.Add(reader.GetString(0));
                            }
                        }
                    }

                    connection.Close();
                }
            } 
            catch (Exception ex) 
            {
                MessageBox.Show(connectionString);
                MessageBox.Show(ex.Message);
                MessageBox.Show(ex.StackTrace);
            }

            return applicationList;
        }

异常消息:

值不能为空。 (参数“路径1”)

没有一个变量为空(即使在构建之后,我也可以在消息框中显示它们)。构建后出现问题,但在调试时有效。数据库位于正确的位置。

我尝试重新安装 nuget 包,删除我自己使用的

Path.Combine
(已在上面的代码中消失),重建几次,重新启动 Visual Studio 并再次构建,并将
parseViaFramework
设置为 true 和 false(第 23 行的
new SQLiteConnection(connectionString, false)
) ).

c# sqlite system.data.sqlite
3个回答
2
投票

我遇到了同样的问题。

当我在应用程序中使用

PublishSingleFile
为 csproj 指定
System.Data.SQLite.Core
属性时,似乎会发生这种情况。

结果,我通过将

IncludeNativeLibrariesForSelfExtract
属性设置为
true
来解决它。

正如 René 指出的那样,这似乎是

Assembly.GetExecutingAssembly().Location
的问题。在单一可执行发布格式中,无法检索程序集的当前路径,因为托管 DLL 被提取并加载到内存中

下一页表示,通过将

IncludeNativeLibrariesForSelfExtract
属性设置为
true
,包括托管程序集的所有文件都将被提取到一个文件夹(可能是临时文件夹)。

https://learn.microsoft.com/en-us/dotnet/core/deploying/single-file/overview?tabs=cli

仅托管 DLL 与应用程序捆绑到单个可执行文件中。 当应用程序启动时,托管 DLL 被提取并加载到内存中, 避免提取到文件夹。 通过这种方法,托管二进制文件嵌入到单个文件包中, 但核心运行时本身的本机二进制文件是单独的文件。

要嵌入这些文件以进行提取并获得一个输出文件, 将属性 IncludeNativeLibrariesForSelfExtract 设置为 true。

指定 IncludeAllContentForSelfExtract 提取所有文件, 在运行可执行文件之前,包括托管程序集。 这可能有助于解决罕见的应用程序兼容性问题。


0
投票

我几周前也遇到了同样的问题。

它寻找 Assembly.GetExecutingAssembly().Location。

我的代码位于单个文件 Windows 服务中,因此该位置是一个空字符串。

在调试时它不为空。

希望这有帮助。


0
投票

我遇到了同样的问题,我将 IncludeNativeLibrariesForSelfExtract 设置为 true,但不起作用,同样的问题...有什么想法吗?

© www.soinside.com 2019 - 2024. All rights reserved.