prepareStatement的问题,只能取得单个字段的值

gullvip 2009-07-30 03:30:02
昨天做的一个东西,只能取到log表中的balance字段,其他的取不到,
注释的部分会报错,找不到数据。调试的时候balance的数据可以取到的。

表字段:
id int,
accountNumber varchar(20),
balance money,
currencyType varchar(20),
date datetime,
transactionType varchar(20),
sum money,
isDelete int,

取消注释的部分后,错误的提示是data not found,

注释成现在这样,只可以获得balance的值。

代码如下:

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.Vector;
import util.ConnectDB;
import dom.DOMLog;

public class DAOLog {

/**
* 查询和写入交易日志
*/

public static Connection conn = null;
public static PreparedStatement pstmt = null;
public static ResultSet rs = null;


public static Vector<DOMLog> readLog(DOMLog domLog) {
// 读取交易记录
Vector<DOMLog> domLogV = new Vector<DOMLog>();

try {
conn = ConnectDB.getConnection();
String accountNumber = domLog.getAccountNumber();
String currencyType = domLog.getCurrencyType();
// String sql = "select * from log where accountNumber =
// '2222222222'";
String sql = "select * from log where accountnumber= '"
+ accountNumber + "' and " + "currencyType='"
+ currencyType + "'";
System.out.println(sql);
pstmt = conn.prepareStatement(sql);
rs = pstmt.executeQuery();

while (rs.next()) {
DOMLog dom=new DOMLog();
// dom.setAccountNumber(rs.getString("accountNumber"));
dom.setBalance(rs.getDouble("balance"));
// System.out.println(rs.getDouble("balance"));
//为什么只能查询到balance的结果?其他的无法获得?
// dom.setCurrencyType(rs.getString("currencyType"));
// dom.setDate(rs.getString("date"));
// dom.setId(rs.getInt("id"));
// dom.setIsDelete(rs.getInt("isDelete"));
// dom.setSum(rs.getDouble("sum"));
// dom.setTransactionType(rs.getString("transactionType"));
domLogV.add(dom);
}
} catch (SQLException e) {
e.printStackTrace();

} finally {
ConnectDB.close(rs, pstmt, conn);
}
return domLogV;

}

public static void main(String[] args) {
// TEST CODE
DOMLog domLog = new DOMLog();
domLog.setAccountNumber("2222222222");
domLog.setCurrencyType("JPY");
// domLog.setSum(12222);
// domLog.setTransactionType(Constant.DO_CASH.trim());
// domLog.setBalance(22322);
DAOLog.readLog(domLog);

}

}
...全文
211 6 打赏 收藏 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
lulu0126 2009-07-31
  • 打赏
  • 举报
回复
mark
YinTaiBing 2009-07-31
  • 打赏
  • 举报
回复
1:字符串拼凑Sql语句是最变态的,出了问题不好找,而且效率低。prepareStatement就是增强预处理功能
2:select accountNumber,balance,date,id,sum, isDelete , transactionType from log where accountnumber = ? and currencyType = ?
sangshusen_1988 2009-07-31
  • 打赏
  • 举报
回复
既然能取到一个,肯定能查到别的呀,数据是一行一行的呀。
这问题比较怪
xiaozejun 2009-07-31
  • 打赏
  • 举报
回复
上面说的没有错 楼主你的sql写错了
Clarity-Black 2009-07-31
  • 打赏
  • 举报
回复
String sql = "select * from log where accountnumber= '" + accountNumber + "'
and " + "currencyType='" + currencyType + "'";

SQL写错了,
String sql = "select * from log where accountnumber= '" + accountNumber + "'
and currencyType= '" + currencyType + "' ";

还有就是你这个地方是写交易日志,那sql应该采用数据注入的方式来做啊,更何况你这个地方用的就是PreparedStatement,为什么还要这样写sql呢?

建议楼主试试这样写

String sql = "select * from log where accountnumber = ? and currencyType = ?";
pstmt = conn.prepareStatement(sql);
pstmt.setString(1,accountNumber);
pstmt.setString(2,currencyType);
rs = pstmt.executeQuery();
这样写有两个好处,第一是安全,就算accountNumber和currencyType变量是很“变态”的输入也不会有问题;第二个就是可以防止你写错sql语句,这种写法不需要你写很多的单引号、双引号的东西。简洁明了。
keyboardsun 2009-07-31
  • 打赏
  • 举报
回复
你这问题比较神奇,说不通。

62,620

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧