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