- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一个使用 JDBC-OBDC 的 Java 小应用程序的奇怪情况。我正在使用 DatabaseMetaData 类检查数据库。当我执行该程序时,一切正常。但是,当我想调试以查看包含 DatabaseMetaData 的 Resulset 中的值时,仅当我在此期间放置断点时才会抛出 java.sql.SQLException。这是我的代码:
DatabaseMetaData patrol = con.getMetaData();
ResultSet answer = patrol.getTables(null, null, null, null);
while(answer.next()) {
if (answer.wasNull() == false) {
tableNamesAsOne = tableNamesAsOne + answer.getString("TABLE_NAME") + " ";
}
}
answer.close();
为什么我不能在这段代码中设置断点??
这是 printStackTrace。
Exception in thread "main" java.sql.SQLException: No data found
at sun.jdbc.odbc.JdbcOdbc.standardError(Unknown Source)
at sun.jdbc.odbc.JdbcOdbc.SQLGetDataString(Unknown Source)
at sun.jdbc.odbc.JdbcOdbcResultSet.getDataString(Unknown Source)
at sun.jdbc.odbc.JdbcOdbcResultSet.getString(Unknown Source)
at sun.jdbc.odbc.JdbcOdbcResultSet.getString(Unknown Source)
at Snooper.inspect(Snooper.java:56)
at Snooper.<init>(Snooper.java:26)
at Snooper.createAndShowGUI(Snooper.java:112)
at Snooper.main(Snooper.java:125)
我代码中的Snooper.java:56行是指
tableNamesAsOne = tableNamesAsOne + answer.getString("TABLE_NAME") + " ";
谢谢。
最佳答案
我已经安装了 SQL Server 来重现您的问题并验证它。
您必须读取值 ONLY ONCE 并且在 ORDER 中它们出现在 SELECT 中。 JdbcOdbc 糟透了。在调试时,您会多次阅读它们。
您正在做的是检查调试器中的有状态对象,这会导致动态结果。
在这种情况下,它是 sun.jdbc.odbc.JdbcOdbcResultSet
并多次执行表达式 resultSet.getString(...)
。第一次,它将起作用(以防您的断点在请求 resultSet 之前暂停线程)。然后,您(或您的调试器)第二次再次检查表达式的值时,getString()
方法再次被调用并且该方法改变了内部ResultSet
对象的状态。
尽管该方法的名称表明它是一个简单的 getter,但事实并非如此。它的作用不止于此。它实际上可能从数据库中检索数据,更改其内部位置计数器等。您不能多次执行 getter 方法。
ODBC 驱动程序是一个非常糟糕的东西,而且质量很差。期待奇怪的行为和其他龙。您可以通过启用 JdbcOdbc Tracing 获得一些调试信息。这是通过在激活 JdbcOdbc-Bridge 之前在 DriverManager 上设置一个 LogWriter
来完成的:
java.sql.DriverManager.setLogWriter(new PrintWriter(System.out));
然后,您将获得 JdbcOdbc-Driver 的详细调试输出,如下所示。它可以帮助您调试遇到的问题。调试时,只需确保将从 ResultSet 对象检索的数据存储在本地对象中,这样您就可以在调试器中多次检查它们。
DriverManager.getConnection("jdbc:odbc:testdbodbc")
JdbcOdbcDriver class loaded
registerDriver: driver[className=sun.jdbc.odbc.JdbcOdbcDriver,sun.jdbc.odbc.JdbcOdbcDriver@7b479feb]
DriverManager.initialize: jdbc.drivers = null
JDBC DriverManager initialized
trying driver[className=sun.jdbc.odbc.JdbcOdbcDriver,sun.jdbc.odbc.JdbcOdbcDriver@7b479feb]
*Driver.connect (jdbc:odbc:testdbodbc)
JDBC to ODBC Bridge: Checking security
No SecurityManager present, assuming trusted application/applet
JDBC to ODBC Bridge 2.0001
Current Date/Time: Wed Jan 26 00:31:27 CET 2011
Loading JdbcOdbc library
Allocating Environment handle (SQLAllocEnv)
hEnv=115724512
Allocating Connection handle (SQLAllocConnect)
hDbc=116219184
Connecting (SQLDriverConnect), hDbc=116219184, szConnStrIn=DSN=testdbodbc
RETCODE = 1
WARNING - Generating SQLWarning...
SQLWarning: reason([Microsoft][ODBC SQL Server Driver][SQL Server]Changed database context to 'master'.) SQLState(01000) vendor code(5701)
SQLWarning: reason([Microsoft][ODBC SQL Server Driver][SQL Server]Changed language setting to us_english.) SQLState(01000) vendor code(5703)
*Connection.getMetaData
*DatabaseMetaData.getDriverName
Get connection info string (SQLGetInfo), hDbc=116219184, fInfoType=6, len=300
SQLSRV32.DLL
*DatabaseMetaData.getDriverVersion
Get connection info string (SQLGetInfo), hDbc=116219184, fInfoType=7, len=300
06.01.7600
*DatabaseMetaData.getDriverName
Get connection info string (SQLGetInfo), hDbc=116219184, fInfoType=6, len=300
SQLSRV32.DLL
Driver name: JDBC-ODBC Bridge (SQLSRV32.DLL)
*DatabaseMetaData.getDriverVersion
附言这是重现的异常,包括 JDK 1.6.0_22 的 Sun 代码的行号。正如您在第一行中看到的,这是我检查 getString()
方法时在控制台上打印的内容。
Get string data (SQLGetData), hStmt=108067024, column=3, maxLen=257
RETCODE = 100
ERROR - No data found
java.sql.SQLException: No data found
at sun.jdbc.odbc.JdbcOdbc.standardError(JdbcOdbc.java:7138)
at sun.jdbc.odbc.JdbcOdbc.SQLGetDataString(JdbcOdbc.java:3907)
at sun.jdbc.odbc.JdbcOdbcResultSet.getDataString(JdbcOdbcResultSet.java:5698)
at sun.jdbc.odbc.JdbcOdbcResultSet.getString(JdbcOdbcResultSet.java:354)
at sun.jdbc.odbc.JdbcOdbcResultSet.getString(JdbcOdbcResultSet.java:411)
at sandbox.DatabaseMetadataTest.testDBMetadata(DatabaseMetadataTest.java:27)
关于java - 为什么我不能调试 DatabaseMetaData?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4795784/
我将 JDBC 与 mysql-connector-java-6.0.2.jar 一起使用,并且除非我做错了什么,否则我认为 DatabaseMetaData.ownDeletesAreVisible
我有一个使用 JDBC-OBDC 的 Java 小应用程序的奇怪情况。我正在使用 DatabaseMetaData 类检查数据库。当我执行该程序时,一切正常。但是,当我想调试以查看包含 Databas
我在 Oracle 数据库中有一些用户,假设 UserOne、UserTwo 和 UserTree 具有相同且非空的表,名称为“tableExample”。 就我而言,我需要通过 getColumns
DatabaseMetaData().getTables() - 速度很慢,有什么替代方法吗? 以下是我的实际代码: connection.getMetaData().getTables(null,n
我在使用 Java 和 NetBeans 从本地运行的 Ubuntu 14 MySQL 连接检索元数据时遇到问题。我从 DatabaseMetaData 对象的 getColumns 方法得到一个空的
我正在使用 MySql、JDBC、Java 来编写我的代码。我无法理解 API 中某些术语的含义。它阻止我做下面的工作-要编写检查特定数据库是否存在的代码,然后检查该数据库中是否存在特定表数据库,然后
我知道如何使用 .getTables() 获取 TABLE 和 ALIAS 条目。 final ResultSet rs = dmd.getTables(null, "MySchema", "%",
元数据上的方法 getColumns() 为同义词返回一个空的结果集(对于表和 View ,它正确地返回列列表)。 这发生在 Oracle 11g Express 上并使用最新的 Oracle JDB
我正在研究 DatabaseMetaData 类以了解它是如何工作的。 java 文档注释似乎声明了一个 thing ,而代码却有所不同。我知道它是一个接口(interface),所以真正由提供 JD
我使用数据库元数据获取 SQL Server 上存储过程的列(读取参数): Connection connection = getConnection(); //getting the connect
trace_xe_action_map 和 trace_xe_event_map - 它们是什么以及它们在哪里?我不想归还那些。如何更改参数? 目前我正在使用: databaseMetadata.ge
我正在尝试 this 中解释的此接口(interface)的方法教程: 我来了: DatabaseMetaData dm = con.getMetaData(); System.err.println
我想使用 java DatabaseMetaData 获取外键并尝试过。 但我只得到外键引用 pk 列,无法引用唯一列。 我尝试使用 getCrossReference()、getImportedKe
我使用 oracle 11g,并创建了一个这样的表: create table test1( id int, name varchar(10), inserttime date ) 然后我用jdbc的
我正忙于编写一段代码以从 Oracle 数据库中获取表的所有列名。我想出的代码如下所示: DriverManager.registerDriver (new oracle.jdbc.driver.Or
我有一个 PostgreSQL 表 create table test ( id int, name varchar(2), active boolean, long_id bigint, creat
根据DatabaseMetaData#getFunctionColumns ,COLUMN_TYPE 的结果列可能是 之一 functionColumnUnknown (0) funtionColum
因此,我在一个需要能够编辑表格的项目中使用 Vaadin Java Web 框架。 Vaadin 提供了一种从 SimpleJDBCConnectionPool ( Here's the API )
什么是 Python 等价于 DatabaseMetaData 最佳答案 这不是特定于 python 的答案;事实上我不知道 Python 数据驱动程序是否有这种东西。但也许这些信息会有所帮助。 AN
我正在编写 java 类来获取所有连接数据库对象(表)。我用过 rs = meta.getExportedKeys(conn.getCatalog(), null, "account_adjustme
我是一名优秀的程序员,十分优秀!