Java を使用して、localhost マシンで実行されている MySQL サーバーにセットアップしたデータベースと通信する Web サービスを作成しています。私のメソッド ListColumns() は、指定されたテーブル内の列の名前を検索し、それらを ResultSet から配列に変換してから、その配列を返します。正しいサイズの配列を返していますが、それは完全な「null」値です。
import java.sql.*;
public class DBConnect {
private Connection con;
private Statement st;
private ResultSet rs;
public DBConnect(){
try{
Class.forName("com.mysql.jdbc.Driver");
String database = "jdbc:mysql://localhost:3306/binapartslist";
String userID = "root";
String userPW = "root";
//jdbc:mysql://localhost:3306/`database name` --> This is the database
//userID database user
//userPW user password
//Connecting to the database
con = DriverManager.getConnection(database, userID, userPW);
st = con.createStatement();
}
catch(Exception ex){
System.out.println("Error: "+ex);
}
}
public String getUser(){
try{
DatabaseMetaData dmd = con.getMetaData();
String username = dmd.getUserName();
//System.out.println("Current User: "+username);
return username;
}catch(Exception ex){
System.out.println(ex);
return null;
}
}
public void getData(String table){
int i=1;
try{
String query = "select * from "+table;
rs = st.executeQuery(query);
System.out.println("Records from Database");
String[] columnNames = ListColumns(table);
int count = columnNames.length;
System.out.println(ListColumns(table));
System.out.println("number of columns "+count);
for(i=0; i<count; i++){
System.out.println(columnNames[i]);
}
}catch(Exception ex){
System.out.println(ex);
}
}
public int countTables (String database){
try{
DatabaseMetaData dmd = con.getMetaData();
rs= dmd.getTables(null, database, "%", null);
int count=0;
while(rs.next()){
count++;
}
return count;
}catch(Exception ex){
System.out.println(ex);
return 0;
}
}
public int countColumns (String table){
try{
DatabaseMetaData dmd = con.getMetaData();
rs = dmd.getColumns(null, null, table, "%");
int count=0;
while(rs.next()){
count++;
}
return count;
}catch(Exception ex){
System.out.println(ex);
return 0;
}
}
public String[] ListColumns(String table){
String[] columnsList = new String[countColumns(table)];
try{
DatabaseMetaData dmd = con.getMetaData();
rs = dmd.getColumns(null, null, table, "%");
int i=0;
while(rs.next()){
columnsList[i]=rs.getString("COLUMN_NAME");
i++;
}
System.out.println("columnsList[] has "+columnsList.length+" values");
for(i=0;i<columnsList.length;i++){
System.out.println("Column Name: "+columnsList[i]);
}
return columnsList;
}catch(Exception ex){
System.out.println("i screwed up");
System.out.println(ex);
return columnsList;
}
}
public String[] ListTables(String database){
try{
DatabaseMetaData dmd = con.getMetaData();
rs = dmd.getTables(null, database, "%", null);
System.out.println(database);
String[] tablesList = new String[countTables(database)];
int i=0;
while (rs.next()) {
tablesList[i]=rs.getString("TABLE_NAME");
System.out.println("table name: "+rs.getString(3));
i++;
}
return tablesList;
}catch(Exception ex){
System.out.println(ex);
return null;
}
}
public void createUser(String username, String password, String rank) throws SQLException{
try{
con.setAutoCommit(false);
st.executeUpdate("INSERT INTO `users` VALUES ('"+username+"', '"+password+"', '"+rank+"');");
con.commit();
con.setAutoCommit(true);
}catch (Exception ex ) {
System.out.println(ex);
if (con != null) {
try {
System.err.print("Transaction is being rolled back");
con.rollback();
}catch(Exception excep) {
if (con != null) {
con.rollback();
con.setAutoCommit(true);
}
System.out.println(excep);
}
}
}
}
public void deleteUser(String username) throws SQLException{
try{
con.setAutoCommit(false);
st.executeUpdate("DELETE FROM `users` WHERE username = '"+username+"'");
con.commit();
con.setAutoCommit(true);
}catch (Exception ex ) {
System.out.println(ex);
if (con != null) {
try {
System.err.print("Transaction is being rolled back");
con.rollback();
}catch(Exception excep) {
if (con != null) {
con.rollback();
con.setAutoCommit(true);
}
System.out.println(excep);
}
}
}
}
}
これらのメソッドが含まれるクラスを次のコードで呼び出しています。
import java.sql.SQLException;
public class Main
{
public static void main(String[] args) throws SQLException {
DBConnect connect = new DBConnect();
System.out.println(connect.getUser());
System.out.println(connect.ListColumns("parts list"));
connect.ListColumns("parts list");
}
}
列名の文字列を含む配列を返すために、columnsList() が必要です。編集:配列columnList[]が実際にforループとprintlnを使用して列名を受け取っていることを確認しました。なぜリターンがまだヌルでいっぱいなのか理解できません
また、使用しているすべてのコードを追加しました。ListTables() メソッドは非常に似ており、同じ問題がありますが、一方を修正すると、もう一方も修正されると思います
事前に助けてくれてありがとう