0

这是我的设置。在虚拟机 (Fusion) 中运行 MSSQL Server Express 2012。虚拟机在 OS X Lion Server 上运行。在 OS X Lion 上,Tomcat 7 服务器正在运行。我从独立的 java 中尝试以下代码:

static {
    try {
        Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver");
    } catch (ClassNotFoundException e) {
        e.printStackTrace();
    }
}

private final static String host = "ip-address:1433";
private final static String database = "databasename";
private final static String user = "user";
private final static String passwd = "password";

public static void main(String[] args) {
    try {
        String connectionUrl = "jdbc:sqlserver://"+host+";database="+database+";integratedSecurity=true;";
        Connection con = DriverManager.getConnection(connectionUrl,user,passwd);
        PreparedStatement pstm = con.prepareStatement("select * from sektor");
        ResultSet res = pstm.executeQuery();
        while(res.next())
            System.out.println("Sektor: " +res.getString("sektornavn"));
    } catch (SQLException e) {
        System.out.println(e.getMessage());
    }
}

这很有效,可以按预期打印表格的内容。现在使用相同的代码(仅将输出更改为来自 system.out 的响应)

static {
    try {
        Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver");
    } catch (ClassNotFoundException e) {
        e.printStackTrace();
    }
}

private final static String host = "ip-address:1433";
private final static String database = "databasename";
private final static String user = "user";
private final static String passwd = "password";


@Override
public void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    resp.setContentType("text/plain");
    resp.setCharacterEncoding("UTF-8");
    // Write response
    PrintWriter writer = resp.getWriter();
    try {
        String connectionUrl = "jdbc:sqlserver://"+host+";database="+database+";";
        writer.println("Connecting<br/>");
        Connection con = DriverManager.getConnection(connectionUrl,user,passwd);
        writer.println("Preparing statement<br/>");
        PreparedStatement pstm = con.prepareStatement("select * from sektor");
        writer.println("Executing statement<br/>");
        ResultSet res = pstm.executeQuery();
        while(res.next())
            writer.println("Sektor: " +res.getString("sektornavn")+"<br/>");
    } catch (SQLException e) {
        writer.println(e.getMessage());
    }
    writer.flush();
    writer.close();

}

我遇到的问题是进入 pstm.executeQuery() 时 servlet 停止。我通过删除(注释掉)部分代码将其范围缩小到这一点,这表明它将创建一个连接(DriverManager.getConnection..)并准备语句。只有在添加 pstm.executeQuery() 时,servlet 才会响应。

我使用 Microsoft 的 JDBC 连接器,该 jar 可用于独立 java 和 servlet。我没有任何异常来帮助找到错误。

真正让我感到困惑的是,它会建立连接,但不会执行查询。非常欢迎所有建议。

4

1 回答 1

0

不知道它是否会有所帮助,但您是否考虑过使用JTDS jdbc 驱动程序?我已经使用他的 jtds 驱动程序有一段时间了,我发现它比 MS jdbc 驱动程序问题少。我曾经发生过使用 MS 驱动程序无法解释的奇怪事情。

于 2012-05-25T11:52:31.227 回答