我在哪里可以在客户端PC中安装数据库并将其路径用作连接字符串?

时间:2016-11-24 06:54:31

标签: c# ms-access installation

我使用Access数据库在C#中创建了一个软件投诉跟踪系统。

基本上,它已经完成,但我在质疑在客户端的PC上安装它的位置? 我试图在DataDirectory中安装它,但是我收到了一个错误:

  

操作必须在应用程序中使用可更新查询。

我的连接字符串是1) initializationError(com.ex.test.1_UT) org.junit.runners.model.InitializationError at org.junit.runners.ParentRunner.validate(ParentRunner.java:346) at org.junit.runners.ParentRunner.<init>(ParentRunner.java:74) at org.junit.runners.BlockJUnit4ClassRunner.<init>(BlockJUnit4ClassRunner.java:55) at org.robolectric.RobolectricTestRunner.<init>(RobolectricTestRunner.java:84) at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:57) at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45) at java.lang.reflect.Constructor.newInstance(Constructor.java:526) at org.junit.internal.builders.AnnotatedBuilder.buildRunner(AnnotatedBuilder.java:31) at org.junit.internal.builders.AnnotatedBuilder.runnerForClass(AnnotatedBuilder.java:24) at org.junit.runners.model.RunnerBuilder.safeRunnerForClass(RunnerBuilder.java:57) at org.junit.internal.builders.AllDefaultPossibilitiesBuilder.runnerForClass(AllDefaultPossibilitiesBuilder.java:29) at org.junit.runner.Computer.getRunner(Computer.java:38) at org.junit.runner.Computer$1.runnerForClass(Computer.java:29) at org.junit.runners.model.RunnerBuilder.safeRunnerForClass(RunnerBuilder.java:57) at org.junit.runners.model.RunnerBuilder.runners(RunnerBuilder.java:98) at org.junit.runners.model.RunnerBuilder.runners(RunnerBuilder.java:84) at org.junit.runners.Suite.<init>(Suite.java:79) at org.junit.runner.Computer.getSuite(Computer.java:26) at org.junit.runner.Request.classes(Request.java:69) at org.junit.runner.JUnitCore.run(JUnitCore.java:117) at org.junit.runner.JUnitCore.runMain(JUnitCore.java:98) at org.junit.runner.JUnitCore.runMainAndExit(JUnitCore.java:53) at org.junit.runner.JUnitCore.main(JUnitCore.java:45) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) t java.lang.reflect.Method.invoke(Method.java:606) at com.vladium.emma.rt.AppRunner$Invoker.run(AppRunner.java:655) at java.lang.Thread.run(Thread.java:745) FAILURES!!! Tests run: 1, Failures: 1
我通过installshield

创建了安装项目

如何解决此问题?

1 个答案:

答案 0 :(得分:0)

由于您有一个带有 | DataDirectory | 的ConnectionString,因此数据库文件很可能位于程序文件夹中,并且由于安全权限,用户无法写入文件。

因此,您应该修改安装数据库文件的位置(APPDATA,如果每个用户,请参见下文)。 如果添加以下代码以告知应用程序占位符 | DataDirectory | 应替换为APPDATA文件夹

,则连接可保持不变
AppDomain.CurrentDomain.SetData("DataDirectory", Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData));

| DataDirectory目录|

  

| DataDirectory目录| (用管道符号括起来)是一个替换字符串,表示数据库的路径。它消除了对完整路径进行硬编码的需要,这导致了几个问题,因为数据库的完整路径可以在不同的地方序列化。 DataDirectory还可以轻松共享项目以及部署应用程序。

     

要设置DataDirectory属性,请调用AppDomain.SetData方法。如果未设置DataDirectory属性,则将应用以下默认规则来访问数据库文件夹:

     
      
  • 对于放在用户计算机上的文件夹中的应用程序,数据库文件夹使用应用程序文件夹。
  •   
  • 对于在ClickOnce下运行的应用程序,数据库文件夹使用创建的特定数据文件夹。
  •   

Source: SQL Server Forum(我强调的重点)

安装地点

  

10.1默认情况下,您的应用必须安装在Program Files文件夹中   对于%ProgramFiles%中的本机32位和64位应用程序,以及在x64上运行的32位应用程序的%ProgramFiles(x86)%。 由于为此文件夹配置了安全权限,因此绝不能将用户数据或应用数据存储在此位置。

     

10.3您的应用数据必须在计算机上的用户之间共享,应存储在 ProgramData

中      

10.4您的应用数据是特定用户专有且无法与计算机的其他用户共享,必须存储在用户\&lt;用户名&gt; \ AppData

Source: Certification requirements for Windows Desktop Apps (我强调的重点)