#java
#java
Вопрос:
У меня есть это прямо сейчас:
public java.util.Vector getList() {
java.util.Vector myuserList = new java.util.Vector();
DbUtil db = null;
java.sql.CallableStatement cstmt = null;
ResultSet rset = null;
db = new DbUtil();
cstmt = db.prepareCall("{ call sample.user.get_user_list(?, ?, ?) }");
cstmt.registerOutParameter(1,OracleTypes.CHAR);
cstmt.registerOutParameter(2,OracleTypes.VARCHAR);
cstmt.registerOutParameter(3,OracleTypes.CURSOR);
cstmt.execute();
}
rset = (ResultSet) cstmt.getObject(3);
if (rset != null) {
while(rset.next()) {
userBean myuser = new userBean();
myuser.setuserid(rset.getString(1).trim());
myuser.setuserName(rset.getString(2));
myuserList.addElement(myuser);
}
}
return myuserList;
}
Я хочу получить еще одну строку ssn в моем while(rset.next()) .. когда я просто добавляю это myuser.setuserSSN(rset.getString(3));
в myuser.setuserName(rset.getString(2));
, это выдает ошибку.. я уже обновил свою процедуру для получения SSN пользователя, так как я могу получить этот номер ssn здесь.. что мне нужно изменить .. еще одна вещь, которую я получаю все три идентификатора пользователя, имя пользователя и userSSN с помощью курсора cstmt.registerOutParameter(3,OracleTypes.CURSOR);
первые два вызываемых состояния предназначены для исключений в процедуре.. пожалуйста, помогите
вот ошибка, которую я получаю..
compile:
[exec] comjavabeanuserBean.java:188: cannot resolve symbol
[exec] symbol : variable myuser
[exec] location: class com.javabean.userBean
[exec] myuser.setuserSSN(rset.getString(3));
[exec] ^
[exec] 1 error
Комментарии:
1. По-прежнему недостаточно информации об ошибке. Пожалуйста, покажите нам, что находится выше того, что вы опубликовали здесь.
2. Первая строка ошибки отсутствует.
Ответ №1:
Похоже, что у userBean
класса нет метода setuserSSN
. Используя обычный регистр, это было бы записано как ‘setUserSSN’ (в верхнем регистре U
). Если существует setuserSSN
метод, убедитесь, что он принимает один String
аргумент.
Если у вас нет какого-либо установленного соглашения, userBean
вероятно, лучше переименовать в UserBean
, поскольку классы обычно начинаются с верхнего регистра.
Комментарии:
1. у меня уже есть все это:
public userBean() { userid = new String(); userName = new String(); userSSN = new String(); } public String getuserid() { return userid; } public void setuserid(String s) { userid = s; } public String getuserName() { return userName; } public void setuserName(String s) { userName = s; } public String getuserSSN() { return userSSN; } public void setuserSSN(String s) { userSSN = s; }
2. А, понятно. Перепроверяя OP, появляется сообщение об ошибке
myuser
. Добавляете ли вы вызов setuserSSN непосредственно под другими вызовами? Убедитесь, что между ними нет закрывающих фигурных скобок. Похоже, чтоmyuser
это выходит за рамки.3. да, я ничего там не меняю .. если я удалю userSSN .. это работает отлично
Ответ №2:
Вы не выбираете SSN из хранимой процедуры. У вас есть три параметра out: 1 = идентификатор пользователя, 2 = имя пользователя, 3 = курсор. При попытке добавить (rset.getString(3));
он пытается установить курсор на строку и передать ее в метод set SSN. Попробуйте это:
public java.util.Vector getList() {
java.util.Vector myuserList = new java.util.Vector();
DbUtil db = null;
java.sql.CallableStatement cstmt = null;
ResultSet rset = null;
db = new DbUtil();
cstmt = db.prepareCall("{ call sample.user.get_user_list(?, ?, ?, ?) }");
cstmt.registerOutParameter(1,OracleTypes.CHAR);
cstmt.registerOutParameter(2,OracleTypes.VARCHAR);
cstmt.registerOutParameter(3,OracleTypes.VARCHAR);
cstmt.registerOutParameter(4,OracleTypes.CURSOR);
cstmt.execute();
}
rset = (ResultSet) cstmt.getObject(4);
if (rset != null) {
while(rset.next()) {
userBean myuser = new userBean();
myuser.setuserid(rset.getString(1).trim());
myuser.setuserName(rset.getString(2));
myuser.setuserSSN(rset.getString(3));
myuserList.addElement(myuser);
}
}
return myuserList;
}
и убедитесь, что хранимая процедура выбирает SSN.
Я только учусь самостоятельно использовать хранимые процедуры, но при использовании строки запроса вы ссылаетесь на возвращаемые поля по имени. Я еще не освоил это, но я думаю, вы можете просто вернуть курсор, а затем установить свои пользовательские переменные следующим образом: myuser.setuserid(rset.getString("userID").trim()); myuser.setuserName(rset.getString("username"));
и т.д.