首页 文章

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

提问于
浏览
1

我尝试连接到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 回答

  • 1

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

相关问题