SQLException: строка подключения содержит неправильно сформированное имя или значение - PullRequest
0 голосов
/ 10 декабря 2018

Я пытался подключиться к промежуточной среде MS SQL Server, но он отображает

SQLException: The connection string contains a badly formed name or value

Где мой пароль содержит { и }

Как правильно выйтисимволы? Мой JDBC URL:

jdbc:sqlserver://localhost;databaseName=WHOPQDTB_test;integratedSecurity=false;user=WHOPQDTB_user;password='ahsdgahgsd';

Я пытаюсь войти в систему с другим паролем и появляется исключение:

Ошибка входа пользователя 'WHOPQDTB_user '.

Пожалуйста, помогите.Заранее спасибо.

1 Ответ

0 голосов
/ 10 декабря 2018

Документы Microsoft - создание URL-адреса подключения

Экранирование значений в URL-адресе подключения

Возможно, вам придется экранировать определенные частизначений URL соединения из-за включения специальных символов, таких как пробелы, точки с запятой и кавычки.Драйвер JDBC поддерживает экранирование этих символов, если они заключены в фигурные скобки.Например, {;} экранирует точку с запятой.

Экранированные значения могут содержать специальные символы (особенно '=', ';', '[]' и пробел), но не может содержать фигурные скобки ,Значения, которые должны быть экранированы и содержать фигурные скобки, должны быть добавлены в коллекцию свойств.

Поэтому измените пароль или сохраните имя пользователя / пароль как отдельные переменные и добавьте его в Connection.

String dbURL = "jdbc:sqlserver://localhost\\sqlexpress";
String user = "sa";
String pass = "secret";
conn = DriverManager.getConnection(dbURL, user, pass);

Здесь вы найдете имена правильных имен, если хотите использовать коллекцию свойств:

Документы Microsoft - настройка свойств соединения

java2s - создание соединения со свойствами имеет хороший пример для java.Это для MySQL Server, но вам нужно только изменить имена свойств.(со страницы выше)

tl; dr Погружение в источнике

SourceCode - DriverManager.java

использование .getConnection(String url, String user, String password) создаст запись Properties.

@CallerSensitive
public static Connection getConnection(String url,
    String user, String password) throws SQLException {
    java.util.Properties info = new java.util.Properties();

    if (user != null) {
        info.put("user", user);
    }
    if (password != null) {
        info.put("password", password);
    }

    return (getConnection(url, info, Reflection.getCallerClass()));
}

Код mssql-jdbc

MSSQL-JDBC - SQLServerDriver.java

public java.sql.Connection connect(String Url, Properties suppliedProperties)
использует:

// Merge connectProperties (from URL) and supplied properties from user.
Properties connectProperties = parseAndMergeProperties(Url, suppliedProperties);

для получения (дополнительных) свойств из данного соединенияUrl:

private Properties parseAndMergeProperties(String Url, Properties suppliedProperties)

использует:

Properties connectProperties = Util.parseUrl(Url, drLogger);

И в MSSQL- Util.java является нарушителем.

    if (ch == ';') {...}
case inEscapedValueStart: 
    if (ch == '}') {...}
case inEscapedValueEnd: 
    if (ch == ';') {...}

Только способ обойти этот Case-switch и перейти прямо к «SQLServerConnection.java», это доставить правильную коллекцию свойств !

MSSQL-JDBC - SQLServerConnection.java

Функция Connection connect(Properties propsIn, SQLServerPooledConnection pooledConnection)
соответственно Connection connectInternal(Properties propsIn, SQLServerPooledConnection pooledConnection):

sPropKey = SQLServerDriverStringProperty.PASSWORD.toString();
sPropValue = activeConnectionProperties.getProperty(sPropKey);
if (sPropValue == null) {
    sPropValue = SQLServerDriverStringProperty.PASSWORD.getDefaultValue();
    activeConnectionProperties.setProperty(sPropKey, sPropValue);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...