我们的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);
调用之前没有引起问题。
答案 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'