Java SQLException:连接字符串包含格式错误的名称或值
我试图连接到MS SQL Server登台环境,但它显示Java SQLException:连接字符串包含格式错误的名称或值,java,sql-server,automated-tests,Java,Sql Server,Automated Tests,我试图连接到MS SQL Server登台环境,但它显示 SQLException: The connection string contains a badly formed name or value 其中,我的密码包含{和} 如何正确转义字符? 我的JDBC URL: jdbc:sqlserver://localhost;数据库名称=WHOPQDTB_测试;集成安全=假;用户=WHOPQDTB_用户;密码='ahsdgahgsd' 我尝试使用不同的密码登录,它显示异常: 用户“WHOPQ
SQLException: The connection string contains a badly formed name or value
其中,我的密码包含{
和}
如何正确转义字符?
我的JDBC URL:
jdbc:sqlserver://localhost;数据库名称=WHOPQDTB_测试;集成安全=假;用户=WHOPQDTB_用户;密码='ahsdgahgsd'代码>
我尝试使用不同的密码登录,它显示异常:
用户“WHOPQDTB_user”登录失败
请帮忙。提前谢谢。
在连接URL中转义值
由于包含空格、分号和引号等特殊字符,您可能必须转义连接URL值的某些部分。如果这些字符用大括号括起来,JDBC驱动程序支持转义这些字符。例如,{;}转义分号
转义值可以包含特殊字符(特别是“=”、“;”、“[]”和空格),但不能包含大括号。必须转义并包含大括号的值应添加到属性集合中
因此,更改密码或将用户/密码保存为单独的变量,并将其添加到连接中
String dbURL = "jdbc:sqlserver://localhost\\sqlexpress";
String user = "sa";
String pass = "secret";
conn = DriverManager.getConnection(dbURL, user, pass);
如果要使用属性集合,请在此处找到属性名称:
有一个很好的java示例。它适用于MySQL服务器,但您只需更改属性名称。(从上面的链接页面)
tl;dr
追根究底
使用.getConnection(字符串url、字符串用户、字符串密码)
将创建一个属性
条目
@CallerSensitive
公共静态连接getConnection(字符串url,
字符串用户,字符串密码)引发SQLException{
java.util.Properties info=new java.util.Properties();
如果(用户!=null){
信息放置(“用户”,用户);
}
if(密码!=null){
信息输入(“密码”,密码);
}
返回(getConnection(url、info、Reflection.getCallerClass());
}
mssql jdbc代码
public java.sql.Connection connect(字符串Url、属性suppliedProperties)
用途:
要从给定的connectionUrl获取(额外)属性,请执行以下操作:
private Properties parseAndMergeProperties(字符串Url,Properties suppliedProperties)
正在使用:
Properties connectProperties = Util.parseUrl(Url, drLogger);
而且
你是交易破坏者
if (ch == ';') {...}
case inEscapedValueStart:
if (ch == '}') {...}
case inEscapedValueEnd:
if (ch == ';') {...}
绕过这个Case开关直接进入“SQLServerConnection.java”的唯一方法是提供一个正确的属性集合
函数连接连接(属性属性属性,SQLServerPooledConnection pooledConnection)
分别连接连接内部(属性propsIn,SQLServerPooledConnection pooledConnection)
:
你能给我们看一下你试过的网址吗?如果您不想向我们显示真实密码,请给我们一个可以使用的代理。您现在显示的内容应该会失败,但不是因为JDBCURL。这可能会变得很糟糕。您可能必须将转义字符从方括号更改为其他字符。我无法为此请求其他用户或密码。这是一个漫长的过程。我在网上搜索如何逃离这个角色,但没有找到解决办法。有什么想法吗,兄弟?这就是问题所在。要转义,可以使用{blah blah}
。但是,如果密码本身包含{
或}
,我不知道该如何/是否工作。我的建议是告诉你的用户不要创建这样的密码。是的,密码本身在特定的索引中包含{和}。还有其他建议吗?是的,他无法在连接字符串中转义密码。但他可以把它当作财产。(正如MS所说:“必须转义并包含大括号的值应该添加到属性集合中。”)向我展示这种解决方法有效的证据,我很乐意投票。:-)是的,它通过使用属性工作,但这是原始JDBC库。我需要使用其他提供这种功能的库。请推荐一个好的JDBC库,比如ormlite、jooq或其他什么。JDBC是Java应用程序和数据库之间的连接。jooq或ormlite在后台使用JDBC。SpringJDBC模板是否提供属性功能?
if (ch == ';') {...}
case inEscapedValueStart:
if (ch == '}') {...}
case inEscapedValueEnd:
if (ch == ';') {...}
sPropKey = SQLServerDriverStringProperty.PASSWORD.toString();
sPropValue = activeConnectionProperties.getProperty(sPropKey);
if (sPropValue == null) {
sPropValue = SQLServerDriverStringProperty.PASSWORD.getDefaultValue();
activeConnectionProperties.setProperty(sPropKey, sPropValue);
}