【问题标题】:Where do I specify the database name in the getTables() method.在 getTables() 方法中在哪里指定数据库名称。
【发布时间】:2018-04-30 14:27:38
【问题描述】:

getTables() 方法没有为数据库中存在的表返回任何结果。我认为问题在于不知道在 ip 上查看哪个数据库。我如何指定 getTables() 方法应该在哪个数据库中查找,因为我有多个具有相同表的数据库?

         //concatinating strings for IP to hit
        String ArchiveDB_URL = "jdbc:sqlserver://" + getArchiveIPaddress();


        //  Database credentials
        String USER = "Removed";
        String PASS = "Removed";

        Connection archiveConn = null;
        Statement archiveStmt = null;

        try {

            // Register JDBC driver
            Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver");

            // Open a connection   

            archiveConn = DriverManager.getConnection(ArchiveDB_URL, USER, PASS);

            DatabaseMetaData dbm = archiveConn.getMetaData();
            ResultSet rsTBmd = dbm.getTables(null,null, "[myDatabase].[dbo].[myTable]", new String[] {"TABLE"});

            System.out.println(rsTBmd.getString("TABLE_NAME"));

             if (rsTBmd.next()){
               //result sets start at 1 not 0
               int rsTBmdi = 1;  
               while(rsTBmd.next()){
                   System.out.println(rsTBmd.getString(rsTBmdi));
                   rsTBmdi++;
               }
           }

【问题讨论】:

  • 您可以尝试使用archiveConn.setCatalog("myDatabase"); 设置当前数据库。
  • 你能把问题说清楚一点吗?它是返回该数据库中的所有表并丢失了一个,还是根本不返回表,还是完全返回错误的表?每一个都可能意味着不同的问题(错误的服务器、缺少权限、默认数据库)。
  • 致:Gord Thompson 我输入了 'archiveConn.setCatalog("myDatabase");'以上'DatabaseMetaData dbm = archiveConn.getMetaData();'它现在显示以下异常“数据库'[myDatabase]'不存在。确保输入的名称正确。”我知道它存在,我可以看到正在复制的其他表。
  • 收件人:Aaron Bertrand 这应该是我在将表复制到其他 IP 之前检查表是否存在的尝试。当表格在那里时,我可以很好地复制它,但由于某种原因,我似乎无法让“if (rsTBmd.next())”返回 true。当我将“null”放在“getTables()”的第三个参数中时,while 循环会打印出以下内容。 master dbo spt_fallback_usg TABLE null
  • 提示:回复 cmets 时,请使用@GordThompson,而不是“To: ...”。

标签: java sql-server jdbc mssql-jdbc


【解决方案1】:

getTables 的前两个参数是catalogschemaPattern。 “目录”是“数据库”的另一个名称,因此只需提供数据库名称作为第一个参数:

ResultSet rsTBmd = dbm.getTables("myDatabase", "dbo", "myTable", new String[] {"TABLE"});

请注意,在这种情况下,您不要将名称括在方括号中,即使它们包含空格或“有趣的字符”。

【讨论】:

  • 在我删除了数据库名称周围的附加括号后,此方法有效。我之所以添加它们,是因为大多数名称中都有下划线和连字符。显然这种方法不喜欢括号。从[my_Database-v1]my_Database-v1
  • @NullPointerProliferator JDBC API 指定您应该指定对象名称,因为它存储在目标数据库的元数据表中。 SQL Server 的元数据表中不包含方括号。
  • @Mark Rottevell 我不得不把括号放在里面,以便插入、选择和删除语句可以处理数据库名称中的下划线和连字符。我在我的 StringBuilder 变量中经常使用它们,我忘了它们在那里。
【解决方案2】:

根据Microsoft,您的JDBC URL 看起来像"jdbc:sqlserver://localhost:1433;databaseName=AdventureWorks;user=UserName;password=*****";,使您的代码:

    //  Database credentials
    String USER = "Removed";
    String PASS = "Removed";

    Connection archiveConn = null;
    Statement archiveStmt = null;

    try {

        // Register JDBC driver
        Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver");

        // Open a connection   
     //concatinating strings for IP to hit
    String ArchiveDB_URL = "jdbc:sqlserver://" + getArchiveIPaddress() + ";database=myDatabase;username="+USER+";password="+PASS;

        archiveConn = DriverManager.getConnection(ArchiveDB_URL);

        DatabaseMetaData dbm = archiveConn.getMetaData();
        ResultSet rsTBmd = dbm.getTables(null,null, "[myDatabase].[dbo].[myTable]", new String[] {"TABLE"});

        System.out.println(rsTBmd.getString("TABLE_NAME"));

         if (rsTBmd.next()){
           //result sets start at 1 not 0
           int rsTBmdi = 1;  
           while(rsTBmd.next()){
               System.out.println(rsTBmd.getString(rsTBmdi));
               rsTBmdi++;
           }
       }

我希望这会有所帮助...

【讨论】:

    【解决方案3】:

    尝试在ArchiveDB_URL中添加数据库名称

    String ArchiveDB_URL = "jdbc:sqlserver://" + getArchiveIPaddress() + "/yourDatabaseNameHere";
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-03-06
      • 1970-01-01
      • 1970-01-01
      • 2011-07-17
      • 2011-06-16
      相关资源
      最近更新 更多