2

我在声明可以在特定类的所有函数中使用的 DB 字段类型的枚举时遇到问题。使用以下代码,我得到“无法将 USERNAME 解析为变量类型”:

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;
            }
        }
    }
};
4

8 回答 8

6

你需要使用DBfields.USERNAME.

更新:

为了与该getString(String)方法一起使用,您需要使用枚举的名称,例如:Dbfields.USERNAME.name().

如果您仅将枚举用于 jdbc API 访问,则最好只使用 String 常量:

public static final String DBFIELD_USERNAME = "USERNAME";
于 2012-07-13T14:30:14.520 回答
3

您需要引用枚举类型:DBfields.USERNAME,或静态导入枚举,如:

import static mypackage.SQL_access.DBfields.*;

此外,就您而言,这还不够。您需要将列名 -- a String-- 或列位置 -- an int-- 传递给ResultSet

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

像这样使用,您失去了枚举的主要优势,即它的静态特性,但如果您将这些值称为“包”,它在代码中的其他地方仍然有用。

于 2012-07-13T14:38:47.590 回答
1

您应该使用DBfields.USERNAME.

有关更多信息,请参阅Oracle 文档

于 2012-07-13T14:30:34.807 回答
1

尝试使用 enum 类型限定枚举数:

   while(row.next()){
        DBuser = row.getString( DBfields.USERNAME);
        if(DBuser.equals(username)){
            DBpass = row.getString( DBfields.PASSWORD);
            break;
        }
    }
于 2012-07-13T14:30:39.517 回答
1

当你引用一个枚举时,它总是采用这种形式的 EnumName.Field。在您的示例中,您需要以下内容:

DBUser = row.getString(DBfields.USERNAME);  
DBpass=row.getString(DBfields.PASSWORD);
于 2012-07-13T14:30:45.413 回答
1

要访问您的枚举使用DBfields.USERNAME,但这对您没有帮助,因为 row.getString() 需要一个 int 作为参数。您的枚举属于类型 DBFields 而不是 int。更好地使用public static final int USERNAME = the int value here;和调用row.getString(USERNAME);

于 2012-07-13T14:33:24.370 回答
0

错误的方式。您需要调用enumusing DBfields.PASSWORD

于 2012-07-13T14:31:40.300 回答
0

你需要这样调用:DBfields.PASSWORD

于 2012-07-13T14:35:29.660 回答