在JavaFX表视图中显示SQL Server数据

在JavaFX表视图中显示SQL Server数据,java,sql,javafx,Java,Sql,Javafx,我需要显示数据库中的一些数据库值。我有连接,一切正常,只要我将查询设置为实际包含数据的内容,它就会中断。它在main.java的第63行和第65行抛出多个NPE,但我不知道如何调试它,因为它所在的行是多么复杂。如果有人能提供一些帮助,我们将不胜感激 第63行:col.setCellValueFactory(新回调(){ 第65行:返回新的SimpleStringProperty(param.getValue().get(j.toString()) Main.java import java.sq

我需要显示数据库中的一些数据库值。我有连接,一切正常,只要我将查询设置为实际包含数据的内容,它就会中断。它在main.java的第63行和第65行抛出多个NPE,但我不知道如何调试它,因为它所在的行是多么复杂。如果有人能提供一些帮助,我们将不胜感激

第63行:col.setCellValueFactory(新回调(){ 第65行:返回新的SimpleStringProperty(param.getValue().get(j.toString())

Main.java

import java.sql.Connection;
import java.sql.ResultSet;
import javafx.application.Application;
import javafx.application.Platform;
import javafx.beans.property.SimpleStringProperty;
import javafx.beans.value.ObservableValue;
import javafx.collections.FXCollections;
import javafx.collections.ObservableList;
import javafx.event.EventHandler;
import javafx.scene.Scene;
import javafx.scene.control.TableColumn;
import javafx.scene.control.TableColumn.CellDataFeatures;
import javafx.scene.control.TableView;
import javafx.stage.Stage;
import javafx.stage.WindowEvent;
import javafx.util.Callback;
public class main extends Application {


    private ObservableList<ObservableList> data;

    private TableView tableview;


    public static void main(String[] args) {
        launch(args);
    }


    public void buildData() {
        Connection c;
        data = FXCollections.observableArrayList();
        try {
            c = dbConnector.connect();

            String SQL = "SELECT        dbo.tbHardwareSite.SerialNo, dbo.tbHardwareSite.Hostname, dbo.tbHardwareSite.WinDomain, dbo.tbHardwareSite.Memory, dbo.tbHardwareSite.SwitchRouterConfig, dbo.tbHardwareSite.PurchaseDate, \n" +
                    "                         dbo.tbHardwareSite.InstallDate, dbo.tbHardwareSite.Notes, dbo.tbHardwareSite.IDTag AS Expr1, dbo.tbHardwareSite.ExpDate, dbo.tbHardware.HardwareName, dbo.tbHardware.HardwareDesc, dbo.tbHardware.ModelNo, \n" +
                    "                         dbo.tbManufacturers.MftrName, dbo.tbCustomers.CustomerID, dbo.tbSites.SiteName\n" +
                    "FROM            dbo.tbHardwareSite INNER JOIN\n" +
                    "                         dbo.tbHardware ON dbo.tbHardwareSite.HardwareID_FK = dbo.tbHardware.HardwareID INNER JOIN\n" +
                    "                         dbo.tbSites ON dbo.tbHardwareSite.SiteID_FK = dbo.tbSites.SiteID INNER JOIN\n" +
                    "                         dbo.tbCustomers ON dbo.tbSites.CustomerID_FK = dbo.tbCustomers.CustomerID INNER JOIN\n" +
                    "                         dbo.tbManufacturers ON dbo.tbHardware.ManufacturerID_FK = dbo.tbManufacturers.MftrID INNER JOIN\n" +
                    "                         dbo.tbContacts ON dbo.tbSites.LocationContactID_FK = dbo.tbContacts.ContactID\n" +
                    "WHERE        (dbo.tbCustomers.CustomerID = 247)";

            ResultSet rs = c.createStatement().executeQuery(SQL);

            /**
             * ********************************
             * TABLE COLUMN ADDED DYNAMICALLY *
             *********************************
             */
            for (int i = 0; i < rs.getMetaData().getColumnCount(); i++) {

                final int j = i;
                TableColumn col = new TableColumn(rs.getMetaData().getColumnName(i + 1));
                col.setCellValueFactory(new Callback<CellDataFeatures<ObservableList, String>, ObservableValue<String>>() {
                    public ObservableValue<String> call(CellDataFeatures<ObservableList, String> param) {
                        return new SimpleStringProperty(param.getValue().get(j).toString());
                    }
                });

                tableview.getColumns().addAll(col);
                System.out.println("Column [" + i + "] ");
            }


            while (rs.next()) {
                //Iterate Row
                ObservableList<String> row = FXCollections.observableArrayList();
                for (int i = 1; i <= rs.getMetaData().getColumnCount(); i++) {
                    //Iterate Column
                    row.add(rs.getString(i));
                }

                data.add(row);

            }

            //FINALLY ADDED TO TableView
            tableview.setItems(data);
            System.out.println(data);
        } catch (Exception e) {
            e.printStackTrace();

        }
    }

    @Override
    public void start(Stage stage) throws Exception {
        //TableView
        tableview = new TableView();
        buildData();

        //Main Scene
        Scene scene = new Scene(tableview);

        stage.setScene(scene);
        stage.setOnCloseRequest(new EventHandler<WindowEvent>() {
            @Override
            public void handle(WindowEvent event) {
                Platform.exit();
                System.exit(0);
            }
        });
        stage.show();
    }
}

我无法输入错误日志,因为它超过了字符限制。正如我所说,第63行和第65行有一堆NullPointerException。

将第65行分成多行。例如,
observeListData=param.getValue();
对象cellValue=data.get(j);
字符串值=cellValue.toString();
返回新的SimpleStringProperty(值);
。然后NPE抛出的行将标识实际为null的内容。另外,我强烈建议不要使用原始类型。此外,由于这是显示特定数据库中的数据,因此您确实应该定义一个表示每行数据的模型类,从中创建对象,并以正常方式设置表视图,而不是d拥有这样一个
表格视图
。看看这些想法是否有用。请使用java命名约定

public class dbConnector {
    private static Connection conn;
    private static String url = "jdbc:sqlserver://10.9.32.46:1433;database=TechTracker;integratedSecurity=true";

    String driver = "com.microsoft.sqlserver.jdbc.SQLServerDriver";

    public static Connection connect() throws SQLException {
        try{
            Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver").newInstance();
        }catch(ClassNotFoundException cnfe){
            System.err.println("Error: "+cnfe.getMessage());
        }catch(InstantiationException ie){
            System.err.println("Error: "+ie.getMessage());
        }catch(IllegalAccessException iae){
            System.err.println("Error: "+iae.getMessage());
        }

        conn = DriverManager.getConnection(url);
        return conn;
    }
    public static Connection getConnection() throws SQLException, ClassNotFoundException{
        if(conn !=null && !conn.isClosed())
            return conn;
        connect();
        return conn;

    }
}