SQLException:连接字符串包含格式错误的名称或值

时间:2018-12-10 10:22:52

标签: java sql-server automated-tests

我尝试连接到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 :(得分:1)

Microsoft Docs - Building the Connection URL

转义连接URL中的值

  

由于包含特殊字符(例如空格,分号和引号),您可能必须转义连接URL值的某些部分。如果将这些字符括在括号中,则JDBC驱动程序支持对这些字符进行转义。例如,{;}转义为分号。

     

转义的值可以包含特殊字符(特别是'=',';','[]'和空格),但不能包含大括号。必须转义并包含括号的值应添加到属性集合中。

因此,更改密码或将用户名/密码另存为单独的变量,然后将其添加到Connection上。

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

如果要使用属性集合,您将在这里找到属性名称:

Microsoft Docs - Setting the Connection Properties

java2s - Create Connection With Properties有一个很好的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);

从给定的connectionUrl获取(额外)属性:

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 == ';') {...}

绕过此案例切换并直接进入“ 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);
}