C# H2:通过完整路径提供初始化脚本(Windows 7)

C# H2:通过完整路径提供初始化脚本(Windows 7),c#,h2,C#,H2,我们的C#应用程序正在通过H2Sharp访问H2数据库(1.3.164)。操作系统是Windows7,64位 连接字符串 jdbc:h2:C:\Users\TestUser\Desktop\TestAppStorage\TestDB;INIT=RUNSCRIPT FROM 'C:\Users\TestUser\Desktop\TestAppStorage\init.sql' 导致以下异常: 连接到数据库时出错: IO Exception: "java.io.FileNotFoundExcept

我们的C#应用程序正在通过H2Sharp访问H2数据库(1.3.164)。操作系统是Windows7,64位

连接字符串

jdbc:h2:C:\Users\TestUser\Desktop\TestAppStorage\TestDB;INIT=RUNSCRIPT FROM 'C:\Users\TestUser\Desktop\TestAppStorage\init.sql'
导致以下异常:

连接到数据库时出错:

IO Exception: "java.io.FileNotFoundException: Could not find file 'C:\Users\TestUser\Desktop\VS Projects\TestManagerApp\bin\Debug\UsersTestUserDesktopTestAppStorageinit.sql'."; "C:UsersTestUserDesktopTestAppStorageinit.sql"; SQL statement:
RUNSCRIPT FROM 'C:UsersTestUserDesktopTestAppStorageinit.sql' [90031-164]
路径值来自用户在UI中的选择。如何在Windows下为init脚本提供完整路径?我看到的例子总是使用
~
作为路径的开始,但在我们的例子中可能不是这样


顺便说一句,据我所知,字符串在从H2Sharp传递到H2之前是正确的(即H2Sharp在
java.sql.DriverManager.getConnection(connectionString、用户名、密码)之前不会引起问题);
call.

我对h2和jdbc都没有经验。但是看起来反斜杠被剥掉了。尝试通过添加额外的\:
C:\\Users\\TestUser\\Desktop\\TestAppStorage\\init.sql来逃避它们。


我相信这是因为您正在连接字符串中传递字符串文字,需要(额外)转义。

我没有h2和jdbc方面的经验。但是,看起来反斜杠被剥去了。请尝试通过添加额外\:
C:\\Users\\TestUser\\Desktop\\TestAppStorage\\init.sql来转义它们。


我认为这是因为您正在连接字符串中传递字符串文字,需要(额外)转义。

最简单的解决方案是在任何地方使用前斜杠:

jdbc:h2:C:/Users/TestUser/Desktop/TestAppStorage/TestDB;
  INIT=RUNSCRIPT FROM 'C:/Users/TestUser/Desktop/TestAppStorage/init.sql'
问题在于,中的反斜杠是转义字符,以支持INIT部分中的多个语句,如:

jdbc:h2:mem:test;INIT=create schema if not exists test\;create schema if not exists data\;
另一种方法是将初始部分中的向后斜杠加倍:

jdbc:h2:C:\Users\TestUser\Desktop\TestAppStorage\TestDB;
  INIT=RUNSCRIPT FROM 'C:\\Users\\TestUser\\Desktop\\TestAppStorage\\init.sql'

最简单的解决方案是在任何地方使用正斜杠:

jdbc:h2:C:/Users/TestUser/Desktop/TestAppStorage/TestDB;
  INIT=RUNSCRIPT FROM 'C:/Users/TestUser/Desktop/TestAppStorage/init.sql'
问题在于,中的反斜杠是转义字符,以支持INIT部分中的多个语句,如:

jdbc:h2:mem:test;INIT=create schema if not exists test\;create schema if not exists data\;
另一种方法是将初始部分中的向后斜杠加倍:

jdbc:h2:C:\Users\TestUser\Desktop\TestAppStorage\TestDB;
  INIT=RUNSCRIPT FROM 'C:\\Users\\TestUser\\Desktop\\TestAppStorage\\init.sql'

谢谢。我用的是正斜杠方法。一开始我很困惑,因为反斜杠在init部分外工作得很好。谢谢。我用的是正斜杠方法。一开始我很困惑,因为反斜杠在init部分外工作得很好。