Sql 查询未在 H2 数据库上执行
Sql queries not executed on H2 database
最近我从 HSQLDB 更改为 H2,更改了一些代码,我的查询停止执行。
我用 RazorSQL 测试我的 SQL 代码,我尝试从 访问我的数据库,令我惊讶的是没有创建 table,没有抛出错误没有空指针,有效 sql,已创建数据库文件 - 一切似乎都是 运行 好吧,数据库中没有任何内容。
这是我的数据库的重要部分 access/creation。
我使用连接器class创建数据库连接
public class H2DatabaseConnector {
private Connection connection;
private Statement statement;
private ResultSet resultSet;
public static final String[] PREP_STATEMENTS = new String[]{};
public static final String DB_FILE_NAME = File.separator + "dboc";
public static final String DB_DIR = Info.OC_DIR + "oc_database\";
static {
try {
Class.forName("org.h2.Driver");
} catch (ClassNotFoundException ex) {
ex.printStackTrace();
}
}
public H2DatabaseConnector(String username, String password) {
try {
openConnection(username, password);
} catch (SQLException ex) {
ex.printStackTrace();
}
}
.....
//data credentials are correct
private void openConnection(String username, String password) throws SQLException {
connection = DriverManager.getConnection("jdbc:h2:file:" + DB_DIR + DB_FILE_NAME+";DATABASE_TO_UPPER=false", username, password);
statement = connection.createStatement();
}
public void execute() {
}
}
和实用程序 class 我在其中执行 sql 命令
public class DbUtil {
public static final void createUsersTable(){
new H2DatabaseConnector(Info.Db.DB_MAIN_USERNAME,Info.Db.DB_MAIN_PASSWORD) {
@Override
public void execute() {
try {
getStatement().execute("CREATE TABLE users(name VARCHAR(255) NOT NULL,password VARCHAR(255) NOT NULL,email VARCHAR(255));");
System.out.println("Table Created users");
getStatement().executeUpdate("INSERT INTO users VALUES ('sa','sa',NULL);");
closeConnection();
} catch (SQLException ex) {
ex.printStackTrace();
}
}
}.execute();
}
}
执行正在按预期进行,没有创建 table。
为什么会这样?没有显示错误,并且 sql 语法是正确的,因为当我在 **RazorSQL 和 create/insert table 中打开数据库时,一切正常。* *
有什么想法吗?我真的坚持了一整天。
重新使用 Statement
可能会给您带来问题,但由于我没有完整的 运行nable 示例可以继续,所以很难确定。 .
所以,我做了这个非常快速的测试(使用 1.4.182)...
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.Statement;
public class Test {
public static void main(String[] args) {
try {
Class.forName("org.h2.Driver");
try (Connection con = DriverManager.getConnection("jdbc:h2:file:./Test;DATABASE_TO_UPPER=false", "sa", "sa")) {
try (Statement stmt = con.createStatement()) {
stmt.execute("CREATE TABLE if not exists users(name VARCHAR(255) NOT NULL,password VARCHAR(255) NOT NULL,email VARCHAR(255))");
con.commit();
}
try (PreparedStatement stmt = con.prepareStatement("INSERT INTO users (name, password, email) VALUES (?,?,?)")) {
stmt.setString(1, "sa");
stmt.setString(2, "sa");
stmt.setString(3, null);
int rows = stmt.executeUpdate();
System.out.println(rows + " where inserted");
con.commit();
}
try (PreparedStatement stmt = con.prepareStatement("select * from users")) {
try (ResultSet rs = stmt.executeQuery()) {
while (rs.next()) {
String name = rs.getString(1);
String password = rs.getString(2);
String email = rs.getString(3);
System.out.println(name + "; " + password + "; " + email);
}
}
}
}
} catch (Exception ex) {
ex.printStackTrace();
}
}
}
当运行第一次输出...
1 where inserted
sa; sa; null
当运行第二次输出...
1 where inserted
sa; sa; null
sa; sa; null
就我个人而言,我会将每个 Statement
隔离为一个任务,事实上,我也倾向于将每个 Connection
隔离,但那是因为我偏执狂 ;)
进一步检查我的代码后: 原始 post 中的代码可以正常工作,无需更改。
我面临的问题是我尝试从 RazorSQL 连接到我的数据库的方式,我使用的 JDBC URL 不完全匹配 URL 我在我的代码中使用了我省略的 ;DATABASE_TO_UPPER=false
这反过来让我连接到它 bud Schema 没有改变。使用正确的 JDBC URL 后,我能够在 RazorSQL 中看到 table 的数据。
如果您遇到与我相同的问题,请尝试使用您在代码中使用的 JDBC URL,以及之后的选项。
失败URL
jdbc:h2:file:C:\Users\tomas\.OpenChannel\oc_database\dboc
正确url
jdbc:h2:file:C:\Users\tomas\.OpenChannel\oc_database\dboc;DATABASE_TO_UPPER=false
没想到这会是个问题。 :D
最近我从 HSQLDB 更改为 H2,更改了一些代码,我的查询停止执行。
我用 RazorSQL 测试我的 SQL 代码,我尝试从 访问我的数据库,令我惊讶的是没有创建 table,没有抛出错误没有空指针,有效 sql,已创建数据库文件 - 一切似乎都是 运行 好吧,数据库中没有任何内容。
这是我的数据库的重要部分 access/creation。
我使用连接器class创建数据库连接
public class H2DatabaseConnector {
private Connection connection;
private Statement statement;
private ResultSet resultSet;
public static final String[] PREP_STATEMENTS = new String[]{};
public static final String DB_FILE_NAME = File.separator + "dboc";
public static final String DB_DIR = Info.OC_DIR + "oc_database\";
static {
try {
Class.forName("org.h2.Driver");
} catch (ClassNotFoundException ex) {
ex.printStackTrace();
}
}
public H2DatabaseConnector(String username, String password) {
try {
openConnection(username, password);
} catch (SQLException ex) {
ex.printStackTrace();
}
}
.....
//data credentials are correct
private void openConnection(String username, String password) throws SQLException {
connection = DriverManager.getConnection("jdbc:h2:file:" + DB_DIR + DB_FILE_NAME+";DATABASE_TO_UPPER=false", username, password);
statement = connection.createStatement();
}
public void execute() {
}
}
和实用程序 class 我在其中执行 sql 命令
public class DbUtil {
public static final void createUsersTable(){
new H2DatabaseConnector(Info.Db.DB_MAIN_USERNAME,Info.Db.DB_MAIN_PASSWORD) {
@Override
public void execute() {
try {
getStatement().execute("CREATE TABLE users(name VARCHAR(255) NOT NULL,password VARCHAR(255) NOT NULL,email VARCHAR(255));");
System.out.println("Table Created users");
getStatement().executeUpdate("INSERT INTO users VALUES ('sa','sa',NULL);");
closeConnection();
} catch (SQLException ex) {
ex.printStackTrace();
}
}
}.execute();
}
}
执行正在按预期进行,没有创建 table。 为什么会这样?没有显示错误,并且 sql 语法是正确的,因为当我在 **RazorSQL 和 create/insert table 中打开数据库时,一切正常。* *
有什么想法吗?我真的坚持了一整天。
重新使用 Statement
可能会给您带来问题,但由于我没有完整的 运行nable 示例可以继续,所以很难确定。 .
所以,我做了这个非常快速的测试(使用 1.4.182)...
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.Statement;
public class Test {
public static void main(String[] args) {
try {
Class.forName("org.h2.Driver");
try (Connection con = DriverManager.getConnection("jdbc:h2:file:./Test;DATABASE_TO_UPPER=false", "sa", "sa")) {
try (Statement stmt = con.createStatement()) {
stmt.execute("CREATE TABLE if not exists users(name VARCHAR(255) NOT NULL,password VARCHAR(255) NOT NULL,email VARCHAR(255))");
con.commit();
}
try (PreparedStatement stmt = con.prepareStatement("INSERT INTO users (name, password, email) VALUES (?,?,?)")) {
stmt.setString(1, "sa");
stmt.setString(2, "sa");
stmt.setString(3, null);
int rows = stmt.executeUpdate();
System.out.println(rows + " where inserted");
con.commit();
}
try (PreparedStatement stmt = con.prepareStatement("select * from users")) {
try (ResultSet rs = stmt.executeQuery()) {
while (rs.next()) {
String name = rs.getString(1);
String password = rs.getString(2);
String email = rs.getString(3);
System.out.println(name + "; " + password + "; " + email);
}
}
}
}
} catch (Exception ex) {
ex.printStackTrace();
}
}
}
当运行第一次输出...
1 where inserted
sa; sa; null
当运行第二次输出...
1 where inserted
sa; sa; null
sa; sa; null
就我个人而言,我会将每个 Statement
隔离为一个任务,事实上,我也倾向于将每个 Connection
隔离,但那是因为我偏执狂 ;)
进一步检查我的代码后: 原始 post 中的代码可以正常工作,无需更改。
我面临的问题是我尝试从 RazorSQL 连接到我的数据库的方式,我使用的 JDBC URL 不完全匹配 URL 我在我的代码中使用了我省略的 ;DATABASE_TO_UPPER=false
这反过来让我连接到它 bud Schema 没有改变。使用正确的 JDBC URL 后,我能够在 RazorSQL 中看到 table 的数据。
如果您遇到与我相同的问题,请尝试使用您在代码中使用的 JDBC URL,以及之后的选项。
失败URL
jdbc:h2:file:C:\Users\tomas\.OpenChannel\oc_database\dboc
正确url
jdbc:h2:file:C:\Users\tomas\.OpenChannel\oc_database\dboc;DATABASE_TO_UPPER=false
没想到这会是个问题。 :D