2012-03-28 96 views
2

我们的C#应用​​程序通过H2Sharp访问H2数据库(1.3.164)。操作系统是Windows 7,64位。H2:通过完整路径提供初始化脚本(Windows 7)

连接字符串

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, userName, password);电话。

回答

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\; 

一种替代方法是加倍反斜杠在初始部分:

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

谢谢。我采用了正斜杠的方法。起初我很困惑,因为反斜杠在init部分之外工作正常。 – alokoko 2012-03-31 17:52:11

0

我有H2没有经验,也不是jdbc,但它看起来像反斜杠被剥夺,尝试通过添加一个额外的\来逃脱它们::C:\\Users\\TestUser\\Desktop\\TestAppStorage\\init.sql

我相信这是因为你在连接字符串内传递一个字符串字面值,逃脱

相关问题