Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/27.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java SQLException:连接字符串包含格式错误的名称或值_Java_Sql Server_Automated Tests - Fatal编程技术网

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

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

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

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