好的,我认为问题在于我没有正确连接到数据库,但我不确定。
首先,我要连接数据库:
Class.forName("com.extendedsystems.jdbc.advantage.ADSDriver");
connection = DriverManager.getConnection("jdbc:extendedsystems:advantage://*ip*\D:\*path*\db.add;User ID=*username*;Password=*password*;ServerType=REMOTE;"
然后我尝试使用数据:
statement = connection.createStatement();
results = statement.executeQuery("SELECT * FROM [TABLE]");
......我得到了例外:
com.microsoft.sqlserver.jdbc.SQLServerException: Invalid object name 'TABLE'.
我知道[Table]存在,所以我最终尝试进行测试,看看我是否实际上能够看到我正在寻找的表格。所以我这样做了:
DatabaseMetaData dmd = cConnection.getMetaData();
ResultSet rs = dmd.getTables(cConnection.getCatalog(), null, "TAB_%", null);
while (rs.next()) {
System.out.println(rs.getString(3));
}
..并获得此输出:
TABLE_CONSTRAINTS
TABLE_PRIVILEGES
TABLES
table_types
tables
它显然看起来像系统表,并且不包含我所知道的数据库中的任何MANY表。
这让我相信我可能没有正确连接到数据库。
这就是我所知道的:
感谢您提供任何帮助,我相信我错过了一些小事。
更新:我更新了问题标题,以便更好地反映我现在找到问题根源的问题。
感谢Luke Woodward在下面的评论中帮助我找到问题的根源。但是,我仍然无法找到解决方案。
我在应用程序的早期使用
Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver");
要建立与SQL Server 2008数据库的连接,此连接可以正常工作。
似乎发生了错误,因为DriverManager也尝试使用SQL驱动程序而不是Advantage驱动程序进行第二次连接。这导致它无法正确读取表格。我能够找到类似的问题here,但我不确定如何使这个解决方案适应我的问题。这个问题的建议解决方案是使用DriverManager.deregisterDriver()
来阻止其他驱动程序。
所以我从上述问题的一个答案中借用了这段代码:
java.util.Enumeration<Driver> drivers = DriverManager.getDrivers();
while (drivers.hasMoreElements()) {
Driver d = drivers.nextElement();
if (d.getClass().getName().equals("com.microsoft.sqlserver.jdbc.SQLServerDriver")) {
try {
DriverManager.deregisterDriver(d);
} catch (SQLException e) {
throw new RuntimeException("Could not deregister redshift driver");
}
break;
}
}
现在,由于某种原因,仅在应用程序中存在此代码会停止建立第一个连接,即使它位于不同的类中,并且应该在已建立第一个连接之后执行。一旦我发表评论,第一个连接就可以了。
这个应用程序的目的是从源A中提取数据,格式化它并添加一些位,然后将其移动到源B.由于我必须处理的处理,我需要从A中获取一些数据,做一些事情,然后从B获取数据,做一些事情,向B添加一些数据,然后向A添加一些数据,所以我必须同时打开两个连接。
所以这个问题现在变成了,我如何处理这个驱动程序冲突,以便我同时连接到同一个应用程序中的两个数据库?
答案 0 :(得分:0)
这可能对您有所帮助。
public static Connection getConnection() throws Exception {
String driver = "com.mysql.jdbc.Driver";
String url = "jdbc:mysql://localhost/atm";
String username = "root";
String password = "";
Class.forName(driver);
Connection conn = DriverManager.getConnection(url, username, password);
return conn;
}
更多检查我的简单控制台(仍然需要锻炼完成)atm但在这个项目中连接是完美的。链接在这里。 https://github.com/SaugatBhattarai/atm/blob/master/DbPreparedStatement.java
答案 1 :(得分:0)
我找到了这个问题,老实说,我觉得我浪费了你所有的时间。
感谢 Luke Woodward 帮助我找到解决方案。
当我构建用于连接到两个数据库的类时,我知道它们将共享许多相同的函数,因此我使用这些函数构建了父类,然后将父类扩展为ADBConnection和SQLConnection类。当我这样做时虽然有一些我错过的变量问题,包括一个包含静态变量的问题,这些问题搞砸了所有事情。我根本没有连接到Advantage数据库,而是创建了另一个SQL服务器连接并寻找不存在的数据库。不知道这是如何转化为甚至能够看到系统表,但这是问题。
我已更正了变量命名问题,现在正在创建与两个数据库的连接并使数据移动。
感谢您的帮助。