Java 在getTables()方法中,在何处指定数据库名称。
getTables()方法不会返回数据库中存在的表的任何结果。我认为问题在于,它不知道在ip上查看哪个数据库。当我有多个具有相同表的数据库时,如何指定getTables()方法应该查看哪个数据库Java 在getTables()方法中,在何处指定数据库名称。,java,sql-server,jdbc,mssql-jdbc,Java,Sql Server,Jdbc,Mssql Jdbc,getTables()方法不会返回数据库中存在的表的任何结果。我认为问题在于,它不知道在ip上查看哪个数据库。当我有多个具有相同表的数据库时,如何指定getTables()方法应该查看哪个数据库 //concatinating strings for IP to hit String ArchiveDB_URL = "jdbc:sqlserver://" + getArchiveIPaddress(); // Database creden
//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++;
}
}
尝试在ArchiveDB_URL中添加数据库名称
尝试在ArchiveDB_URL中添加数据库名称
的前两个参数是
catalog
和schemaPattern
。“Catalog”是“Database”的另一个名称,因此只需提供数据库名称作为第一个参数:
ResultSet rsTBmd=dbm.getTables(“myDatabase”、“dbo”、“myTable”、新字符串[]{“TABLE”});
请注意,在这种情况下,即使名称包含空格或“有趣的字符”,也不要将名称括在方括号中。的前两个参数是
catalog
和schemaPattern
。“Catalog”是“Database”的另一个名称,因此只需提供数据库名称作为第一个参数:
ResultSet rsTBmd=dbm.getTables(“myDatabase”、“dbo”、“myTable”、新字符串[]{“TABLE”});
请注意,在这种情况下,您不会将名称括在方括号中,即使它们包含空格或“有趣的字符”。根据,您的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++;
}
}
我真的希望这有帮助…根据,您的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++;
}
}
我真的希望这有帮助…您可以尝试使用archiveConn.setCatalog(“myDatabase”)
设置当前数据库。您能更清楚地了解问题吗?它是从该数据库返回所有表,但缺少一个表,还是根本不返回表,还是完全返回了错误的表?每一个都可能意味着不同的问题(错误的服务器、缺乏权限、默认数据库)上面的“DatabaseMetaData dbm=archiveConn.getMetaData();”它现在显示以下异常“数据库“[myDatabase]”不存在。请确保输入的名称正确。“我知道它存在,我可以看到正在复制的其他表。收件人:Aaron Bertrand这应该是我在将该表复制到其他IP之前检查该表是否存在的尝试。”。当表存在时,我可以很好地复制它,但由于某些原因,我似乎无法使“if(rsTBmd.next())”返回true。当我在'getTables()'的第三个参数中输入'null'时,while循环会输出以下内容。master dbo spt_fallback_usg TABLE nullTip:在回复注释时,使用@GordThompson,而不是“to:…”。您可以尝试使用archiveConn.setCatalog(“myDatabase”)
设置当前数据库。您能更清楚地了解问题吗?它是从该数据库返回所有表,但缺少一个表,还是根本不返回表,还是完全返回了错误的表?每一个都可能意味着不同的问题(错误的服务器、缺乏权限、默认数据库)上面的“DatabaseMetaData dbm=archiveConn.getMetaData();”它现在显示以下异常“数据库“[myDatabase]”不存在。请确保输入的名称正确。“我知道它存在,我可以看到正在复制的其他表。收件人:Aaron Bertrand这应该是我在将该表复制到其他IP之前检查该表是否存在的尝试。”。当表存在时,我可以很好地复制它,但由于某些原因,我似乎无法使“if(rsTBmd.next())”返回true。当我在'getTables()'的第三个参数中输入'null'时,while循环会输出以下内容。master dbo spt_fallback_usg TABLE nullTip:在回复注释时,请使用@GordThompson,而不是“to:…”。在删除数据库名称周围的附加括号后,此方法有效。我之所以添加它们,是因为大多数名称中都有下划线和连字符。显然,这种方法不喜欢括号。从[my_Database-v1]
到my_Database-v1
@NullPointerProliferator JDBC API指定您应该指定对象名称,因为它存储在目标数据库的元数据表中。SQL Server在其元数据表中不包含括号。@Mark Rottervell我必须放括号,这样insert、select和delete语句才能处理数据库名称中的下划线和连字符。我在我的StringBuilder变量中使用了这么多,我忘了它们在那里了。在我删除了数据库名称周围的附加括号后,这个方法起作用了。我之所以添加它们,是因为大多数名称中都有下划线和连字符。显然,这种方法不喜欢括号。从[my_Database-v1]
到my_Database-v1
@NullPointerProliferator JDBC API指定您应该指定对象名称,因为它存储在目标数据库的元数据表中。SQL Server在其元数据表中不包含括号。@Mark Rottervell我必须放括号,这样insert、select和delete语句才能处理数据库名称中的下划线和连字符。我在我的StringBuilder变量中使用了这么多,我忘记了它们在那里。