4

我是新会员。我想,我一直在用 sqlitejdbc 苦苦挣扎。我从一个java程序查询了sqlite数据库。我遇到了上述异常。我的查询是

select * 
from (  person as p 
        inner join company as c on p.p_id=c.p_id
     ) 
     inner join contact as ct on p.p_id=ct.p_id 
 where p.p_id=?;

当我通过放置 p.p_id='1' 而不是 p.p_id=? ,我很好。它向我展示了正确的价值观。

但是从我的java程序。我得到了这个例外。

线程“主”java.sql.SQLException 中的异常:没有这样的列:p.p_id
        在 org.sqlite.DB.throwex(DB.java:288)
        在 org.sqlite.NativeDB.prepare(本机方法)
        在 org.sqlite.DB.prepare(DB.java:114)
        在 org.sqlite.PrepStmt.(PrepStmt.java:37)
        在 org.sqlite.Conn.prepareStatement(Conn.java:231)
        在 org.sqlite.Conn.prepareStatement(Conn.java:224)
        在 org.sqlite.Conn.prepareStatement(Conn.java:213)
        在 programTest.test.main(test.java:19)
Java 结果:1

我确定存在 person 表和 p_id 字段。我已经在这个网站上搜索过这类问题,但我找到了与 ruby​​ on rails 相关的问题,而不是 java。我不知道出了什么问题。

我的java程序是

import java.sql.*;

/**
 *
 * @author Htet 101
 */
public class test {

    public static void main(String[] args) throws Exception {
        Class.forName("org.sqlite.JDBC");
        Connection conn =
                DriverManager.getConnection("jdbc:sqlite://C://Users//Htet 101//Documents//addressbook.s3db");
        PreparedStatement stat = conn.prepareStatement("select * from (person as p inner join company as c on p.p_id=c.p_id) inner join contact as ct on p.p_id=ct.p_id where p.p_id=?;");
        stat.setInt(1, 1);

        ResultSet rs = stat.executeQuery();
        while (rs.next()) {
            System.out.print("Name : " + rs.getString("p_name") + " ");
        }
        rs.close();
        conn.close();
    }
}

我正在使用 NetBeans 6.9.1、SQLite 3.7.8、SQLiteJDBC v056 开发它。

4

3 回答 3

3

我不确定,但我认为如果您从以下位置删除括号,它应该可以工作Fromselect * from person as p inner join company as c on p.p_id=c.p_id
inner join contact as ct on p.p_id=ct.p_id where p.p_id=?;

于 2011-11-13T16:47:29.173 回答
0

如果完全相同的查询在navicat 上运行良好,而在java 上出错,则意味着驱动程序有问题。但要确保它完全一样。

此外,这些括号是可疑的 - 摆脱它们。

于 2011-11-13T16:49:28.410 回答
0

括号可能被解释为好像您正在开始 Oracle 中所谓的内联视图 - 基本上是一个动态创建的视图。所以我认为这不是驱动程序中的错误。

于 2011-11-13T20:23:55.093 回答