resultset结果集中为空,但在控制台里查询有结果,该怎么解决?

wjqwei 2011-08-27 11:47:47
如题

public int getCourseid(String g_year, String c_name, int x_id){
int c_id = 0;
String sql = "select c_id from courses where year = '" + g_year + "'and c_name = '" + c_name + "'and x_id = '" + x_id + "';";
try {
stmt = (Statement) conn.createStatement();
rs = (ResultSet) stmt.executeQuery(sql);---------------------------结果集为空,为什么?
while(rs.next()){
c_id = Integer.parseInt(rs.getString("c_id"));
}
} catch (SQLException e) {
e.printStackTrace();
}
return c_id;
}

...全文
562 25 打赏 收藏 转发到动态 举报
写回复
用AI写文章
25 条回复
切换为时间正序
请发表友善的回复…
发表回复
xyl_ztj 2011-08-30
  • 打赏
  • 举报
回复
4
/*EMUA转发命令数据帧包括:长度2字节+命令(ucCMD2)1字节+数据信息+校验和1字节*/
if *pulDesLen < (ulSrcLen + CCU_485CMD_SEND_HEADLENGTH) return CCU_ERR_MPI_OUTOFSPACE;

/* 写入4个字节 根据485针帧结构 /2个字节长度/1个字节的cmd/最后跟一个校验和。 */
/* 这里加1是加上命令字的长度,减2是剔除握手字 */
pucDesData[0] = (UCHAR)((ulSrcLen + 1 - 2) >> 8);
1 (UCHAR)(ulSrcLen + 1 - 2);2 ucCmd2; /*由于EMUA命令不提供单板类型,所以直接赋值cmd2*/

/* 将数据域拷入,剔除两个字节的握手字节 */
CHECK_MESSAGE_LEN_THAN_RTN(2, ulSrcLen, CCU_485_ERR_LENGTH_OVERLOAD);
CCU_MemCpy(&pucDesData[3], pucSrcData + 2, (INT)(ulSrcLen - 2));

/* 最后需要添加校验和 */
for i = 0 ; i < (ulSrcLen + 1) ; i++ ucCheckSum += pucDesData[i];
pucDesData[1 + ulSrcLen] = ucCheckSum;
/* 将长度 赋给发送长度 */
*pulDesLen = ulSrcLen + 2;
return CCU_OK;
xyl_ztj 2011-08-29
  • 打赏
  • 举报
回复
2
ucChanNum = Get485ChanNo(ulResourceId);
if ( ucChanNum >= ALL_CCU_SERIAL_NUM)return CCU_ERR_MPI_INVALID_PARAMS;
/* 发之前清一下原先的数据 确保中间没有异常数据上来 */
CleanSynDataCtr(ucChanNum);
RS485Transmit(pucData, (UINT16)ulSendLen, ulResourceId, 0);

if (CCU_OK != ADA_SmPP((INT32)g_StBBUChan[ucChanNum].SynSemId, CCU_500MS_TICK))
DBG_COMM_PRINT(LP_ERR,"chan: %x time out",ucChanNum);return CCU_485_ERR_TIMEOUT;}

/* 获取到数据等待 */
if (CCU_OK != GetDataFrom485SynTab(ulResourceId, &ulLen, aucData))
DBG_COMM_PRINT(LP_ERR,"chan: %x",ucChanNum);return CCU_ERR;}

/* 正常情况下应该收到ACK 长度为1个字节*/
if ((1 == ulLen) && (CCU_ACK == aucData[0])) return CCU_OK;
return CCU_ERR;
3
if (*pulDesLen < (ulSrcLen + CCU_485CMD_RESPONSE_HEADLENGTH)) return CCU_ERR;
/* 写入4个字节 根据485针帧结构 /2个字节长度/2个字节的cmd/最后跟一个校验和。 */
/* 这里加2是加上命令字的长度 */
pucDesData[0] = (UCHAR)((ulSrcLen + 2) >> 8);
1 (UCHAR)(ulSrcLen + 2);2 ucCmd1;3 ucCmd2;
/* 将数据域拷入 */
CCU_MemCpy(&pucDesData[CCU_485CMD_SEND_HEADLENGTH], pucSrcData, (INT)ulSrcLen);
/* 最后需要添加校验和 */
for ( i = 0 ; i < (ulSrcLen + CCU_485CMD_SEND_HEADLENGTH) ; i++ ) ucCheckSum += pucDesData[i];
pucDesData[CCU_485CMD_SEND_HEADLENGTH + ulSrcLen] = ucCheckSum;
/* 将长度 赋给发送长度 */
*pulDesLen = ulSrcLen + CCU_485CMD_RESPONSE_HEADLENGTH;
return CCU_OK;
xyl_ztj 2011-08-29
  • 打赏
  • 举报
回复

1
ucAddr = Get485NodeAddr(ulResourceId);
ucChanNum = Get485ChanNo(ulResourceId);
if ucChanNum >= ALL_CCU_SERIAL_NUM return CCU_ERR_MPI_INVALID_PARAMS;
/* 转发之前 需要清一下数据域 防止有异常数据上来 */
CleanSynDataCtr(ucChanNum);
if ( TRANSMIT_PROC == ucTransOrQuery )
/* 如果是第一次发送,高3位为110 */
if SEND_FIRST_TIME == ucSendTimes ucAddr |= FIRST_TRANSMIT_QUERY_ADDR;
/* 如果是重复发送,高3位为111 */
else ucAddr |= RE_TRANSMIT_QUERY_ADDR;
} /* 如果是查询,高三位是001 */ else ucAddr |= QUERY_ADDR;
/* 下发数据同步等待 数据 */
if CCU_TRUE != RS485Transmit( &ucAddr, 1, ulResourceId, 1 )
DBG_COMM_PRINT(LP_ERR,"CCU_485comm.c Send error"); return CCU_ERR;}

/* 获取同步信号量 这个信号量用于主任务和485任务之间的通信 */
ulRet = (UINT32)(ADA_SmPP((INT32)g_StBBUChan[ucChanNum].SynSemId, uwDelayCnt));
CHECK_RET_OK_RN(ulRet, CCU_485_ERR_TIMEOUT);
ulLen = MAX_485_DATA_LEN;
ulRet = GetDataFrom485SynTab(ulResourceId, &ulLen, aucData);
CHECK_RET_OK_RN(ulRet, ulRet);
/* 检查查询上来的是不是 相对应的地址 如果是查询 将得到的数据返回给上层去*/
ulRet = CheckAddrDataOK(ulResourceId, aucData, ulLen, ucTransOrQuery, pulLen, pucData);
wjqwei 2011-08-27
  • 打赏
  • 举报
回复
mysql> select c_id from courses where year='2010-2011'and c_name='离散数学' and
x_id='1';
+------+
| c_id |
+------+
| 1 |
+------+
1 row in set (0.00 sec)

直接用这些参数 getCourseid()函数里得到的rs也是空
wjqwei 2011-08-27
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 xyl_ztj 的回复:]

1
/* 获得槽位号 */
ucChanNum = Get485ChanNo(ulResId);
if ucChanNum >= MAX_CCU_CHAN_NUM return CCU_485_ERR_RESOURCEID;
ulTempLen = g_StBBUChan[ucChanNum].SynDataTab.uwDataLen;
if ulTempLen > MAX_485_D……
[/Quote]
没看懂,解释下吧。。。。谢谢了
xyl_ztj 2011-08-27
  • 打赏
  • 举报
回复
或者长度不为一 则为非法数据 直接返回错误 */
if ((1 != ulLen) || (ucAddr != pucData[0]))return CCU_485_ERR_INVALID_PARAMETER;

/* 如果获取到的数据是地址 说明地址发送成功返回OK */
*pulOutputLen = ulLen;
CCU_MemCpy(pucOutPutData, pucData, (INT)ulLen);
return CCU_OK;
/* 如果是查询将数据返回上层 查询 */
else if (QUERY_PROC == TransOrQuery)
{
if *pulOutputLen < ulLen return CCU_485_ERR_LENGTH_OVERLOAD;
else{/* 除了广播命令 没有命令数据大于等于256 */
if (ulLen > MAX_485_DATA_LEN)
{
return CCU_485_ERR_CMD_LEN;
}
CCU_MemCpy(pucOutPutData, pucData, (INT)ulLen);
*pulOutputLen = ulLen;
return CCU_OK;
}
}
/* 非法命令 */
else return CCU_485_ERR_INVALID_PARAMETER;
xyl_ztj 2011-08-27
  • 打赏
  • 举报
回复
1
/* 获得槽位号 */
ucChanNum = Get485ChanNo(ulResId);
if ucChanNum >= MAX_CCU_CHAN_NUM return CCU_485_ERR_RESOURCEID;
ulTempLen = g_StBBUChan[ucChanNum].SynDataTab.uwDataLen;
if ulTempLen > MAX_485_DATA_LEN
CleanSynDataCtr(ucChanNum);
return CCU_485_ERR_CMD_LEN;}

/* 为了避免越界(实际上长度足够) */
ulTempLen = (ulTempLen > (*pulLen)) ? (*pulLen) : ulTempLen;

CCU_MemCpy(pucData, g_StBBUChan[ucChanNum].SynDataTab.aucData, (INT)ulTempLen);
*pulLen = ulTempLen;

(VOID)CleanSynDataCtr(ucChanNum);
return CCU_OK;

2
ucAddr = Get485NodeAddr(ulResourceId);
/* 如果转发命令则 查看会送的是不是地址 */
if TRANSMIT_PROC == TransOrQuery
/* 转发地址命令获取到的只能是地址 如果不是地址
风火轮 2011-08-27
  • 打赏
  • 举报
回复
把sql语句 控制台打印出来看下
wjqwei 2011-08-27
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 kiss601459202 的回复:]

把 sql 输出一下 到数据库上执行一下看看有结果不
[/Quote]

在mysql控制台里执行同样的sql语句能得出结果
wjqwei 2011-08-27
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 magong 的回复:]

引用楼主 wjqwei 的回复:
String sql = "select c_id from courses where year = '" + g_year + "'and c_name = '" + c_name + "'and x_id = '" + x_id + "';";


x_id是整型,不需要单括弧,应该这样写
String sql = "select……
[/Quote]

不行。。
magong 2011-08-27
  • 打赏
  • 举报
回复
[Quote=引用楼主 wjqwei 的回复:]
String sql = "select c_id from courses where year = '" + g_year + "'and c_name = '" + c_name + "'and x_id = '" + x_id + "';";

[/Quote]
x_id是整型,不需要单括弧,应该这样写
String sql = "select c_id from courses where year = '" + g_year + "'and c_name = '" + c_name + "'and x_id = " + x_id + ";";
kiss601459202 2011-08-27
  • 打赏
  • 举报
回复
把 sql 输出一下 到数据库上执行一下看看有结果不
wjqwei 2011-08-27
  • 打赏
  • 举报
回复
问题解决了。。
最主要是编码的问题,我的数据库的编码是utf8,mysql的是GBK
因为UTF8的中文和GBK的中文虽然看起来一样,但是无法匹配,导致查询结果为空
把jdbc的URL地址改为jdbc:mysql://localhost:3306/TEST?useUnicode=true&characterEncoding=UTF-8
其中TEST是连接的数据库,useUnicode=true&characterEncoding=UTF-8是说明用utf8字符集
另一方面代码有问题,改成:
public int getCourseid(String g_year, String c_name, int x_id){
int c_id = 0;
String sql = "select c_id from courses where year='" + g_year + "' and x_id=" + x_id + " and c_name='" + c_name + "';";
try {
pstmt=conn.prepareStatement(sql);
rs=pstmt.executeQuery();
while(rs.next()){
c_id=rs.getInt("c_id"); //把c_id = Integer.parseInt(rs.getString("c_id"));改下,虽然代码能跑,但int型的话,直接去int型比较好
}
} catch (SQLException e) {
e.printStackTrace();
}
return c_id;
}

感谢ioe_gaoyong的帮助,从而解决了问题,也谢谢大家的回复
风尘中国 2011-08-27
  • 打赏
  • 举报
回复
问题是jdbc的url地址没有指定utf8编码,在查询的时候,UTF8编码的字符无法匹配gbk的字符,导致ResultSet的查询结果一直为空。
刚刚做过实验,在SQL语句用占位符的时候,查询英文数据没有任何问题,就是中文ResultSet一直为空。
整个问题解决:
1.JDBC的URL地址指定了UTF8进行编码
2.将SQL查询语句优化,利用占位符的方法,同时c_id确实应该用getInt("c_id")而不是getString()
qichao88888 2011-08-27
  • 打赏
  • 举报
回复
等待结果。。。
24K純帥 2011-08-27
  • 打赏
  • 举报
回复
有没有报错,如果SQL语句没错那么是可以得到值的
风尘中国 2011-08-27
  • 打赏
  • 举报
回复
老大,不是Oracle数据库
[Quote=引用 17 楼 lifeng350715332 的回复:]

最好的办法,放到PL/SQL里面执行下
[/Quote]
lifeng350715332 2011-08-27
  • 打赏
  • 举报
回复
最好的办法,放到PL/SQL里面执行下
xiazdong 2011-08-27
  • 打赏
  • 举报
回复
建议楼主使用预备语句:PreparedStatement,这样可以不用管语句的引号过多看不清楚产生的问题。
magong 2011-08-27
  • 打赏
  • 举报
回复
连到了正确的数据库吗?
加载更多回复(5)

62,623

社区成员

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

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