从 H2DB 读取结果

Posted

技术标签:

【中文标题】从 H2DB 读取结果【英文标题】:Read results from H2DB 【发布时间】:2018-01-14 11:35:09 【问题描述】:

我在读取数据库中的行内容时遇到问题。 我想显示有关具有给定职位和姓名的员工的信息(暂时在控制台中)。我已经建立了路径,在 H2 中启动了数据库,但我不确定我是否正确使用了 PreparedStatement。

找不到表“MyTable”

为了更具可读性,我删除了 try/catch。

static public void  Search (JButton a , JFormattedTextField name, JComboBox<String> b ) 
    a.addActionListener(new ActionListener() 
        public void actionPerformed(ActionEvent e ) 
            Connection con = null;

            con = DriverManager.getConnection("jdbc:h2:tcp://localhost/~/test" + "sa" + "");

            Statement stm = null;
            String ime = name.getText();// reads the name 
            String poz = (String) b.getSelectedItem();// reads the position

            Class.forName("org.h2.Driver");

            String sql1 = String.format("SELECT * FROM  RABOTNICI  WHERE IME = '%s' OR POZICIA = '%s'", ime, poz);
            PreparedStatement prstm = null;

            prstm = con.prepareStatement(sql1);

            ResultSet rs = null;

            rs = prstm.executeQuery(sql1);
        
    );

【问题讨论】:

【参考方案1】:

jdbc:h2:tcp:...

您正在使用 TCP 连接,但没有像这样启动 H2 TCP 服务器: http://www.h2database.com/html/tutorial.html#using_server

通常 H2 数据库在没有 TCP 服务器的情况下作为嵌入式使用,如下所示: http://www.h2database.com/html/tutorial.html#connecting_using_jdbc

jdbc:h2:/path/to/dbfile

【讨论】:

【参考方案2】:

我认为您有一些信息来源,但后来出了点问题。

您创建preparedStatement 的方式,即使它被正确解析,也容易发生SQL 注入。 您应该首先创建语句,然后才注入值。

String sql1 = "SELECT * FROM  RABOTNICI  WHERE IME = ? OR POZICIA = ?"
PreparedStatement prstm = con.prepareStatement(sql1);
prstm.setString(1, ime);
prstm.setString(2, poz);

请参阅doc page 以正确使用 PreparedStatements

另外,getConnection 的参数看起来有点乱。

con = DriverManager.getConnection("jdbc:h2:tcp://localhost/~/test" + "sa" + "");

以下行应出现在连接创建之前。

Class.forName("org.h2.Driver");

我建议使用此tutorial 来获取有关连接 H2 DB 的说明

最后,我不知道你是如何得到关于“MyTable”的错误,它从未在你的代码 sn-p 中提及。

我的代码引用没有经过测试,但我相信它足够清晰,可以理解。

【讨论】:

谢谢!我会看看你给的链接。我以“我的桌子”为例:)。我知道我只需要一些指导方针 另外,正如@haba713 在另一个答案中提到的那样:您应该在您的应用程序之外启动一个 H2 DB,或者从您的应用程序中启动它。但无论是来自 TCP 还是 in-mem,它都应该是活跃的且可访问的 是的,我从终端启动它,然后将应用程序连接到它。在我将数据写入数据库的其他应用程序中,我没有问题,一切正常。

以上是关于从 H2DB 读取结果的主要内容,如果未能解决你的问题,请参考以下文章

从 Laravel 4 中的 MSSQL 存储过程读取多个结果集

如何从 SqlDataReader 读取多个结果集? [复制]

Jmeter19 保存测试结果(或从文件读取结果)

即使有数据,JPQL 也不返回任何结果

QProcess没有从命令中读取结果

从注册表读取字符串值,但结果包含一些奇怪的字符