JTDS 未连接到正确的数据库

Posted

技术标签:

【中文标题】JTDS 未连接到正确的数据库【英文标题】:JTDS not connecting to correct database 【发布时间】:2014-11-10 15:37:22 【问题描述】:

我正在使用 JTDS 连接到 MS SQL Server。连接数据库没问题,但是当我尝试执行语句时,我得到一个 Database 'java' does not exist 异常。

连接字符串:

conn = DriverManager.getConnection("jdbc:jtds:sqlserver://localhost;DatabaseName=MyDatabase;user=testuser;password=testpassword");

尝试执行脚本:

private void runStatement(String scriptLocation) 
    if(scriptLocation == null) 
        return;
    

    try 
        InputStream is = getClass().getClassLoader().getResourceAsStream(scriptLocation);
        String query = is.toString();
        is.close();

        Statement stmt = conn.createStatement();
        stmt.executeQuery(query);
     catch(IOException | SQLException ex) 
        log.warning(ex.getMessage());
    

堆栈跟踪:

WARNING: Database 'java' does not exist. Make sure that the name is entered correctly.
java.sql.SQLException: Database 'java' does not exist. Make sure that the name is entered correctly.
    at net.sourceforge.jtds.jdbc.SQLDiagnostic.addDiagnostic(SQLDiagnostic.java:372)
    at net.sourceforge.jtds.jdbc.TdsCore.tdsErrorToken(TdsCore.java:2988)
    at net.sourceforge.jtds.jdbc.TdsCore.nextToken(TdsCore.java:2421)
    at net.sourceforge.jtds.jdbc.TdsCore.getMoreResults(TdsCore.java:671)
    at net.sourceforge.jtds.jdbc.JtdsStatement.executeSQLQuery(JtdsStatement.java:505)
    at net.sourceforge.jtds.jdbc.JtdsStatement.executeQuery(JtdsStatement.java:1427)
    at com.exampe.MyJTDSConnection.runStatement(MyJTDSConnection.java:238)
    at com.exampe.MyJTDSConnection.loadPageTitle(MyJTDSConnection.java:208)
    at com.exampe.MyJTDSConnection.runTesting(MyJTDSConnection.java:69)
    at com.exampe.SeleniumTesting.runTest(SeleniumTesting.java:59)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    ...

【问题讨论】:

is.toString() 并没有给你你认为的那样。您必须读取输入流来获取您的“脚本”。 【参考方案1】:

正如对您问题的评论中所述,将.toString() 方法应用于 InputStream 对象不会读取 InputStream。相反,它只返回对象本身的字符串表示,而不是对象包含的内容。

例如,我的 Java 项目有一个名为“script.sql”的资源文件,其中包含:

SELECT @@VERSION

以下代码比较了在对象上简单地执行.toString() 与使用Apache Commons IO 来实际读取 InputStream 成字符串的结果:

package resourceTest;

import java.io.InputStream;
import org.apache.commons.io.IOUtils;

public class ResourceTestMain 

    public static void main(String[] args) 
        try (InputStream is = ResourceTestMain.class.getClassLoader().getResourceAsStream("resources/script.sql")) 
            String toStringValue = is.toString();
            String contents = IOUtils.toString(is, "UTF-8");
            is.close();
            System.out.println("is.toString() returned:");
            System.out.println("    " + toStringValue);
            System.out.println();
            System.out.println("IOUtils.toString(is, \"UTF-8\") returned:");
            System.out.println("    " + contents);
         catch (Exception e) 
            e.printStackTrace(System.out);
        
    


结果是:

is.toString() returned:
    java.io.BufferedInputStream@804a77

IOUtils.toString(is, "UTF-8") returned:
    SELECT @@VERSION

【讨论】:

以上是关于JTDS 未连接到正确的数据库的主要内容,如果未能解决你的问题,请参考以下文章

BigQuery 的自动化 Apps 脚本未连接到正确的项目?

Dockerizing springboot应用程序(在容器中)未连接到rabbitmq(在容器中):连接被拒绝

JTDS (Java/MSSQL) - 找不到存储过程

元数据库未连接到 MySQL(docker 容器)

什么是MS SQL Server 2005 Express的jTDS JDBC Connect URL

Visual Studio,数据库项目未连接到数据库