2012-07-13 48 views
2

我無法爲特定類的所有函數使用的DB字段類型聲明枚舉。用下面的代碼我得到「無法解析USERNAME給一個變量類型」:跨類使用的Java枚舉

public class SQL_access { 

    public enum DBfields { BLANK, USERNAME, ID, PASSWORD, FIRSTNAME, LASTNAME }; 

    public boolean loginValidate(String username, String password){ 

     String DBuser, DBpass; 
     PreparedStatement table = connectToTable("firstsql", "users"); 
     ResultSet row = table.executeQuery();; 

     while(row.next()){ 
      DBuser = row.getString(USERNAME); 
      if(DBuser.equals(username)){ 
       DBpass = row.getString(PASSWORD); 
       break; 
      } 
     } 
    } 
}; 

回答

3

您需要引用枚舉類型:DBfields.USERNAME,或靜態導入枚舉,如:

import static mypackage.SQL_access.DBfields.*; 

而且,你的情況,這是不夠的。您需要將列名傳 - 一個String - 或列的位置 - 一個int - 到ResultSet

row.getString(DBfields.USERNAME.name()); 

像這樣來使用,你失去枚舉的主要優點是它的靜態性質,但如果將這些值稱爲「包」,它在代碼中的其他位置仍可能有用。

+0

這工作完美,謝謝! – Austin 2012-07-13 14:53:33

6

您需要使用DBfields.USERNAME

UPDATE:

爲了與getString(String)方法來使用,你需要使用枚舉的名稱,如:Dbfields.USERNAME.name()

,如果你只使用了JDBC API訪問的枚舉,你會更好只使用一個字符串常量:

public static final String DBFIELD_USERNAME = "USERNAME"; 
+0

我試過了,得到這個錯誤:類型ResultSet中的方法getString(int)不適用於參數(SQL_access.DBfields) – Austin 2012-07-13 14:34:23

+0

'getString(xxx)'需要'int'作爲參數,而不是'String'。首先,它也是錯誤的。但現在更新我的帖子。 – Simulant 2012-07-13 14:51:55

+0

@Simulant - 同時存在'getString(int)'(按位置獲取)和'getString(String)'(按列名獲取)。 – jtahlborn 2012-07-13 15:15:52

1

你應該使用DBfields.USERNAME訪問枚舉。

查看Oracle Docs瞭解更多信息。

1

嘗試用枚舉類型出線枚舉:

while(row.next()){ 
     DBuser = row.getString(DBfields.USERNAME); 
     if(DBuser.equals(username)){ 
      DBpass = row.getString(DBfields.PASSWORD); 
      break; 
     } 
    } 
1

當你引用一個枚舉它總是以這種形式EnumName.Field。在您的例子中,你需要以下條件:

DBUser = row.getString(DBfields.USERNAME); 
DBpass=row.getString(DBfields.PASSWORD); 
0

錯誤 way.You需要使用DBfields.PASSWORDenum打電話。

1

要訪問你的使用DBfields.USERNAME,但這不會幫助你,bacuse row.getString()需要一個int作爲參數。你的Enumbs的Type DBFields不是int。 更好地使用public static final int USERNAME = the int value here;並致電row.getString(USERNAME);

+0

感謝您的答案,但這太亂了= /我將使用實際整數,我猜 – Austin 2012-07-13 14:36:34

+0

與'最終靜態詮釋USERNAME = 1;'你的accresscodes得到一個可讀的名稱聲明。 – Simulant 2012-07-13 14:49:34

0

都需要這樣的呼籲:DBfields.PASSWORD