我尝试连接到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'登录失败。
请帮助。预先感谢。
答案 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);
}