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

我尝试连接到MS SQL Server登台环境,但它显示

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

在哪里,我的密码包含 {}

How to correctly escape the characters? 我的JDBC URL:

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

我尝试使用不同的密码登录,并显示异常:

用户'WHOPQDTB_user'登录失败 .

请帮忙 . 提前致谢 .

回答(1)

2 years ago

Microsoft Docs - Building the Connection URL

Escaping Values in the Connection 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服务器,但您只需更改属性名称即可 . (来自上面的链接页面)

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

only way to bypass 这个Case-switch并直接进入"SQLServerConnection.java",是为了发送 proper Property Collection

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);
}