在Python中使用cx_Oracle时收到ORA-01017错误(无效的用户名/密码)

时间:2017-10-27 16:07:45

标签: python oracle oracle12c

我正在尝试使用带有oracle_Cx库的python建立与oracle 12c数据库的连接,但是我遇到了一些困难。当我使用PL / SQL开发人员(我的普通用户帐户和使用dblink连接的第二个帐户)时,我能够使用两个不同的用户名和密码成功连接到数据库 - 虽然说实话我不知道这意味着什么,这就是我被告知的事情。当我尝试使用python和oracle_Cx库连接到数据库时,我能够毫无困难地使用我的普通用户帐户进行连接,但是当我尝试使用dblink连接时,我收到了ORA-01017错误。我100%肯定我在两种情况下都输入相同的密码,因为我在文本编辑器中键入用户名和密码,然后将其复制并粘贴到PL / SQL中,并将其粘贴到变量中,我将传递给oracle_Cx.connect功能,例如

@IBAction func Rally(_ sender: Any) {
    if schoolTextField.text != nil
    {
        print("inside Rally: ", schoolTextField.text!)
        let url = URL(string: "http://example.com/index.php/api/")!
        var request = URLRequest(url: url)
        //request.setValue("application/x-www-form-urlencoded", forHTTPHeaderField: "Content-Type")
        request.httpMethod = "POST"
        let postString = "name=NAME&email=EXAMPLE@hotmail.com&school=" + schoolTextField.text! + "action=addschool"
        request.httpBody = postString.data(using: .utf8)

        let task = URLSession.shared.dataTask(with: request) { data, response, error in

            guard let data = data, error == nil else
            {// check for fundamental networking error
                print("ZZZerror=\(error)")
                return
            }

            if let httpStatus = response as? HTTPURLResponse, httpStatus.statusCode != 200
            {// check for http errors
                print("ZZZstatusCode should be 200, but is \(httpStatus.statusCode)")
                print("ZZZresponse = \(response)")
            }

            let responseString = String(data: data, encoding: .utf8)
            print("ZZZresponseString = \(responseString)")
        }
        task.resume()
    }
}

我已经阅读了其他一些stackoverflow帖子,由于服务器和客户端的区分大小写之间的差异,可能会出现无效的用户名/密码错误,并且这可以通过引用密码来解决,我也尝试过使用

oracle_ip = ourIpAddres
oracle_port = ourPort
oracle_SID = ourSID
oracle_username = standardUsername
oracle_password = standardPassword
oracle_selfserve_username = selfServeUsernane
oracle_selfserve_password = selfServePassword

但这也无济于事。

有人对我有什么建议吗?

由于 布拉德

1 个答案:

答案 0 :(得分:0)

我想出了一个可以建立连接的解决方案。而不是传递cx_Oracle.connect各个变量名,它可以构建实际的连接字符串,例如。

db_selfserve2 = cx_Oracle.connect('notMyRealUserName/notMyPassword@123.456.121.222:123456/serviceName')

您可以使用可以成功连接并发出以下命令的客户端登录数据库来查找服务名称

select sys_context('userenv','service_name') from dual;