H2: поставка сценария инициализации по полному пути (Windows 7) - PullRequest
2 голосов
/ 29 марта 2012

Наше приложение C # обращается к базе данных H2 (1.3.164) через H2Sharp. ОС 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]

Значение пути зависит от выбора пользователя в пользовательском интерфейсе. Как предоставить сценарию инициализации полный путь под Windows? Примеры, которые я видел, всегда используют ~ в качестве начала пути, но в наших случаях это может быть не так.

Кстати, насколько я вижу, строка верна до тех пор, пока она не будет передана H2 из H2Sharp (т.е. H2Sharp не вызывает проблем до вызова java.sql.DriverManager.getConnection(connectionString, userName, password);.

Ответы [ 2 ]

0 голосов
/ 29 марта 2012

Самое простое решение - везде использовать прямые косые черты:

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

Проблема заключается в том, что обратные косые черты в части INIT являются управляющими символами для поддержки нескольких операторов, как в 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 голосов
/ 29 марта 2012

У меня нет опыта ни в h2, ни в jdbc.Тем не менее, похоже, что обратные слеши удаляются.Попробуйте избежать их, добавив дополнительные \: C:\\Users\\TestUser\\Desktop\\TestAppStorage\\init.sql

Я полагаю, это потому, что вы передаете строковый литерал в строке подключения, который должен быть (дополнительно) экранирован.

...