在Linux中使用RODBC连接到SQL Server时出错

时间:2017-10-30 14:04:02

标签: sql-server r linux database

我在linux服务器上运行不同的r程序。程序因数据库连接而失败,会出现以下错误: -

  

1:在odbcDriverConnect中(paste0(“DRIVER = {SQL Server}; server =”,服务器,   :[RODBC] ERROR:状态08001,代码0,消息   [unixODBC] [FreeTDS] [SQL Server]无法连接到数据源

     

2:在odbcDriverConnect中(paste0(“DRIVER = {SQL Server}; server =”,服务器,   :[RODBC] ERROR:状态01000,代码20002,消息   [unixODBC] [FreeTDS] [SQL Server] Adaptive Server连接失败

     

3:在odbcDriverConnect中(paste0(“DRIVER = {SQL Server}; server =”,服务器,   :[RODBC] ERROR:状态01000,代码20017,消息   [unixODBC] [FreeTDS] [SQL Server]来自服务器的意外EOF

     

4:在odbcDriverConnect中(paste0(“DRIVER = {SQL Server}; server =”,服务器,   :ODBC连接失败执行暂停

有时,程序运行完全没有任何错误。有时会失败。我无法确切地知道问题所在。

我测试了一段代码,看看它是如何表现的:

private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {                                         
    String xmldoc="./src/com/ui/Data.xml";
    try {
        // background and layout should be set only once
        jPanel7.setBackground(Color.WHITE);
        jPanel7.setLayout(new FlowLayout());

        File fXmlFile = new File(xmldoc);
        DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance();
        DocumentBuilder dBuilder = dbFactory.newDocumentBuilder();
        Document doc = dBuilder.parse(fXmlFile);
        doc.getDocumentElement().normalize();
        NodeList nList = doc.getElementsByTagName("username");

        for (int temp = 0; temp < nList.getLength(); temp++) {
            Node nNode = nList.item(temp);
            if (nNode.getNodeType() == Node.ELEMENT_NODE) {
                Element eElement = (Element) nNode;
                String text = eElement.getTextContent();
                System.out.println(text);

                JLabel label2 = new JLabel(text);  // create a new JLabel with the given text
                // set label2's attributes
                label2.setPreferredSize(new Dimension(100,40));
                label2.setFont(new Font("Times New Roman", Font.BOLD, 24)); 

                jPanel7.add(label2);  // add it to jPanel7
            } 
        }
    } catch (Exception ex) {
        System.out.println("Database exception : userExists()");
    }
}

有时它会被完全执行。有时它介于两者之间失败(例如第45次连接数据库失败)

我从未在Windows环境中遇到过这个问题。

我想知道在这种情况下究竟是什么问题。它是与网络,驱动程序,我的连接字符串或数据库相关的东西。

这可能是解决这个问题的方法。

1 个答案:

答案 0 :(得分:0)

我猜我的连接字符串配置文件看起来不错。

可能有一个网络问题正在删除一个开放的RODBC连接。

我尝试了这个解决方案: -

 repeat
        {
          dbhandle <- odbcDriverConnect(paste0("DRIVER={SQL Server}; server=",server,"; database=",dbname,"; uid=",usernm,"; pwd=",passwd, "; TDS_Version=8.0; Port=1433;", sep=""))
          if(class(dbhandle) == "RODBC"){
              break
            }
        }

有了这个,我不会继续进行,直到dbhandle成为班级RODBC

通过在我的程序中将此代码集成到需要数据库连接的任何地方,我能够运行程序而不会收到这些错误消息。