无法使用 JDBC 从 MSSQL 获取自动生成的 ID
Cannot get auto generated ID from MSSQL with JDBC
public String getKey() {
Connection con = null;
Statement stmt = null;
String generatedKey = null;
try {
con = dataSrc.getConnection();
stmt = con.createStatement();
// ask to return generated key
int affectedRows = stmt.executeUpdate("Insert into CountTab(t) value('0')",
Statement.RETURN_GENERATED_KEYS);
if (affectedRows == 0) {
throw new SQLException(
"Creating row failed, no rows affected.");
}
try (ResultSet generatedKeys = stmt.getGeneratedKeys()) {
ResultSetMetaData rsmd = generatedKeys.getMetaData();
int columnCount = rsmd.getColumnCount();
if (Log4j.log.isEnabledFor(Level.INFO)) {
Log4j.log.info("count: " + columnCount);
}
if (generatedKeys.next()) {
generatedKey = generatedKeys.getString(1);
if (Log4j.log.isEnabledFor(Level.INFO)) {
Log4j.log.info("key: " + generatedKey);
}
} else {
throw new SQLException(
"Creating row failed, no ID obtained.");
}
}
} catch (SQLException se) {
// Handle any SQL errors
throw new RuntimeException("A database error occured. "
+ se.getMessage());
} finally {
// Clean up JDBC resources
if (stmt != null) {
try {
stmt.close();
} catch (SQLException se) {
se.printStackTrace(System.err);
}
}
if (con != null) {
try {
con.close();
} catch (Exception e) {
e.printStackTrace(System.err);
}
}
}
return generatedKey;
}
CountTab{---this is my table(designed by other)
id char(10) NOT NULL, ----Auto increament from 0000000001
t char(1) NOT NULL, ----just for insert to get the id
PRIMARY KEY(id)
};
我正在尝试使用 java 1.7.0 来获取从 MS SQL 数据库生成的唯一 ID,上面的代码就是我用来执行此操作的;我还从 MSDN 获得了 sqljdbc_4.1.5605.100 并将 jar 添加到我程序的类路径中。
我的问题:我从 getKey() 得到的值是 NULL。我不确定为什么会发生这种情况,因为此函数确实在每个 运行 处向我的 table 添加了新行,但它没有回复我键值而是 NULL(即使在日志中;但我这样做从 columnCount 得到 1)。
我在 Whosebug 上搜索了一下,没有看到任何类似或符合我的情况的答案。有解决办法请帮帮我
==============
更新:
这是table架构
CREATE TABLE [CountTab](
[id] [char](10) NOT NULL,
[t] [char](1) NOT NULL,
CONSTRAINT [PK_CountTab] PRIMARY KEY CLUSTERED
(
[id] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
我想我可能想通了为什么 he/she 会这样 table: 因为 ID 需要以这样的日期格式开头 yyMMddxxxx
.
例如:如果我今天有3条插入,那么我在table(1609060000, 1609060001, 1609060002)中可以看到3条记录;第二天,新记录将有新的开始日期(1609070000、1609070001、1609070002)。
这很棘手,但可能对某些地区有用(但我仍然无法从 RETURN_GENERATED_KEYS 获得密钥)。
没关系,我创建了另一个具有自动递增标识的 table,现在 RETURN_GENERATED_KEYS 可以使用了。看起来它不支持不是身份的密钥。
public String getKey() {
Connection con = null;
Statement stmt = null;
String generatedKey = null;
try {
con = dataSrc.getConnection();
stmt = con.createStatement();
// ask to return generated key
int affectedRows = stmt.executeUpdate("Insert into CountTab(t) value('0')",
Statement.RETURN_GENERATED_KEYS);
if (affectedRows == 0) {
throw new SQLException(
"Creating row failed, no rows affected.");
}
try (ResultSet generatedKeys = stmt.getGeneratedKeys()) {
ResultSetMetaData rsmd = generatedKeys.getMetaData();
int columnCount = rsmd.getColumnCount();
if (Log4j.log.isEnabledFor(Level.INFO)) {
Log4j.log.info("count: " + columnCount);
}
if (generatedKeys.next()) {
generatedKey = generatedKeys.getString(1);
if (Log4j.log.isEnabledFor(Level.INFO)) {
Log4j.log.info("key: " + generatedKey);
}
} else {
throw new SQLException(
"Creating row failed, no ID obtained.");
}
}
} catch (SQLException se) {
// Handle any SQL errors
throw new RuntimeException("A database error occured. "
+ se.getMessage());
} finally {
// Clean up JDBC resources
if (stmt != null) {
try {
stmt.close();
} catch (SQLException se) {
se.printStackTrace(System.err);
}
}
if (con != null) {
try {
con.close();
} catch (Exception e) {
e.printStackTrace(System.err);
}
}
}
return generatedKey;
}
CountTab{---this is my table(designed by other)
id char(10) NOT NULL, ----Auto increament from 0000000001
t char(1) NOT NULL, ----just for insert to get the id
PRIMARY KEY(id)
};
我正在尝试使用 java 1.7.0 来获取从 MS SQL 数据库生成的唯一 ID,上面的代码就是我用来执行此操作的;我还从 MSDN 获得了 sqljdbc_4.1.5605.100 并将 jar 添加到我程序的类路径中。
我的问题:我从 getKey() 得到的值是 NULL。我不确定为什么会发生这种情况,因为此函数确实在每个 运行 处向我的 table 添加了新行,但它没有回复我键值而是 NULL(即使在日志中;但我这样做从 columnCount 得到 1)。
我在 Whosebug 上搜索了一下,没有看到任何类似或符合我的情况的答案。有解决办法请帮帮我
==============
更新:
这是table架构
CREATE TABLE [CountTab](
[id] [char](10) NOT NULL,
[t] [char](1) NOT NULL,
CONSTRAINT [PK_CountTab] PRIMARY KEY CLUSTERED
(
[id] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
我想我可能想通了为什么 he/she 会这样 table: 因为 ID 需要以这样的日期格式开头 yyMMddxxxx
.
例如:如果我今天有3条插入,那么我在table(1609060000, 1609060001, 1609060002)中可以看到3条记录;第二天,新记录将有新的开始日期(1609070000、1609070001、1609070002)。
这很棘手,但可能对某些地区有用(但我仍然无法从 RETURN_GENERATED_KEYS 获得密钥)。
没关系,我创建了另一个具有自动递增标识的 table,现在 RETURN_GENERATED_KEYS 可以使用了。看起来它不支持不是身份的密钥。