Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/database/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 用于在特定文件夹c中定位特定文件的自定义路径_C#_Database_Winforms - Fatal编程技术网

C# 用于在特定文件夹c中定位特定文件的自定义路径

C# 用于在特定文件夹c中定位特定文件的自定义路径,c#,database,winforms,C#,Database,Winforms,我想查看特定文件夹中的数据库文件,我之前所做的工作如下: "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=D:/Fuhans's Folder/Project/SIA - Point of Sales/SIA - Point of Sales/Assets/Database/db1.accdb; Persist Security Info=False;"; 我在想,有没有一种快捷方式来查找数据库的文件,而不是编写特定的文件夹 我想到了: "Prov

我想查看特定文件夹中的数据库文件,我之前所做的工作如下:

"Provider=Microsoft.ACE.OLEDB.12.0;Data Source=D:/Fuhans's Folder/Project/SIA - Point of Sales/SIA - Point of Sales/Assets/Database/db1.accdb; Persist Security Info=False;";
我在想,有没有一种快捷方式来查找数据库的文件,而不是编写特定的文件夹

我想到了:

"Provider=Microsoft.ACE.OLEDB.12.0;Data Source=../Assets/Database/db1.accdb; Persist Security Info=False;";
但是,当我将其更改为与第二个类似时,错误消息如下所示:

我的问题是:有没有办法删除bin位置路径,但仍然像第二个一样查找数据库的文件

谢谢您

在相对路径前面添加另一个../

"Provider=Microsoft.ACE.OLEDB.12.0;Data Source=../../Assets/Database/db1.accdb; Persist Security Info=False;";
在相对路径前面添加另一个../

"Provider=Microsoft.ACE.OLEDB.12.0;Data Source=../../Assets/Database/db1.accdb; Persist Security Info=False;";

您应该避免在连接字符串中使用绝对路径,而在..中使用相对路径。。部署时很容易被破坏

您可以使用的路径| DataDirectory | db1.accdb,在WinForms中它不可用,但常数是使用应用程序域属性解析的。只需在主方法中设置基础浴:

AppDomain.Current.SetData("RootFolder",
    @"D:\Fuhans's Folder\Project\SIA - Point of Sales\SIA - Point of Sales");
和您的连接字符串:

Provider=Microsoft.ACE.OLEDB.12.0;Data Source=|RootFolder|Assets/Database/db1.accdb;
为什么要使用绝对路径而不是相对路径?因为它不受工作目录的影响,并且更容易添加多个常量:

AppDomain.Current.SetData("Bin",
    Application.StartupPath);
AppDomain.Current.SetData("AppData",
    Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData));
第二个选项将更好地与UAC合作,因为程序的文件夹可能根本不可写。还要注意的是,路径仍然是可导航的,因为它将被规范化

假设您在开发环境中编译到bin/debug:

Data Source=|Bin|../../Assets/Database/db1.accdb
假设您的应用程序将被部署,并且它将在数据文件夹而不是程序文件夹上工作:

Data Source=|AppData|Assets/Database/db1.accdb

简单明了。

您应该避免在连接字符串中使用绝对路径,而在..中使用相对路径。。部署时很容易被破坏

您可以使用的路径| DataDirectory | db1.accdb,在WinForms中它不可用,但常数是使用应用程序域属性解析的。只需在主方法中设置基础浴:

AppDomain.Current.SetData("RootFolder",
    @"D:\Fuhans's Folder\Project\SIA - Point of Sales\SIA - Point of Sales");
和您的连接字符串:

Provider=Microsoft.ACE.OLEDB.12.0;Data Source=|RootFolder|Assets/Database/db1.accdb;
为什么要使用绝对路径而不是相对路径?因为它不受工作目录的影响,并且更容易添加多个常量:

AppDomain.Current.SetData("Bin",
    Application.StartupPath);
AppDomain.Current.SetData("AppData",
    Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData));
第二个选项将更好地与UAC合作,因为程序的文件夹可能根本不可写。还要注意的是,路径仍然是可导航的,因为它将被规范化

假设您在开发环境中编译到bin/debug:

Data Source=|Bin|../../Assets/Database/db1.accdb
假设您的应用程序将被部署,并且它将在数据文件夹而不是程序文件夹上工作:

Data Source=|AppData|Assets/Database/db1.accdb

简单明了。

感谢为这个问题投票的人:感谢为这个问题投票的人:谢谢!你是最棒的,谢谢!你是最棒的。但是,这使得应用程序必须安装在特定的文件夹上,对吗,先生@Adriano Repetti?如果用户将文件夹更改为与设置字符串不匹配的其他内容,会发生什么情况?还有容易破碎的,先生,你指的是什么?那怎么可能呢?感谢you@UnknownUser当然,路径不应该硬编码!很容易被破坏,因为相对路径将受到工作目录的影响,如果您将RootFolder声明为Application.StartupPath,则连接字符串中的路径将始终从可执行路径根目录。此外,请注意,如果编译到root\debug\release中,您仍然可以合并,那么您的绝对路径将是| RootFolder |..\..\assets\db1.accdb。请注意,您可以定义多个常量,例如AppData目录,UAC程序文件夹可能不可写…+1,以便您清楚地解释,先生@Adriano Repetti。非常感谢,先生。显然这是一个比我更好的答案!为了其他程序员寻找类似问题的解决方案,您应该接受这个方案。@hantoun我不这么认为!接受的答案是用户发现在他的情况下有用的,如果他不需要任何更复杂的东西,那么简单地添加../就可以了,而且要短得多。将来,程序员会发现这很有用…可能会投票支持。但是,这使得应用程序必须安装在特定的文件夹上,对吗,先生@Adriano Repetti?如果用户将文件夹更改为与设置字符串不匹配的其他内容,会发生什么情况?还有容易破碎的,先生,你指的是什么?那怎么可能呢?感谢you@UnknownUser当然,路径不应该硬编码!很容易被破坏,因为相对路径将受到工作目录的影响,如果您将RootFolder声明为Application.StartupPath,则连接字符串中的路径将始终从可执行路径根目录。此外,请注意,如果编译到root\debug\release中,您仍然可以合并,那么您的绝对路径将是| RootFolder |..\..\assets\db1.accdb。请注意,您可以定义多个常量,例如AppData目录,UAC程序文件夹可能不可写…+1,以便您清楚地解释,先生@Adriano Repetti。非常感谢,先生。显然这是一个比我更好的答案!为了其他寻找s的程序员
类似问题的解决方案,你应该接受这个。@hantoun我不这么认为!接受的答案是用户发现在他的情况下有用的,如果他不需要任何更复杂的东西,那么简单地添加../就可以了,而且要短得多。在未来,程序员会发现这很有用…可能会投票支持。