H2:通过完整路径提供init脚本(Windows 7)

时间:2012-03-28 20:53:38

标签: c# h2

我们的C#应用​​程序通过H2Sharp访问H2数据库(1.3.164)。操作系统是Windows 7,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脚本提供完整路径?我看到的例子总是使用~作为路径的开头,但在我们的情况下可能不是这种情况。

BTW,据我所见,字符串是正确的,直到从H2Sharp传递给H2的那一点(即H2Sharp在java.sql.DriverManager.getConnection(connectionString, userName, password);调用之前没有引起问题。

2 个答案:

答案 0 :(得分:0)

我对h2没有经验,也没有jdbc经验。然而它看起来像反斜杠被剥离。尝试通过添加额外的\ {C:\\Users\\TestUser\\Desktop\\TestAppStorage\\init.sql

来转义它们

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

答案 1 :(得分:0)

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

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

问题是INIT part中的反斜杠是转义字符,以支持INIT部分中的多个语句,如:

jdbc:h2:mem:test;INIT=create schema if not exists test\;create schema if not exists data\;

另一种方法是将init部分中的反斜杠加倍:

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