如题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;
}
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;
}
String sql = "select c_id from courses where year = '" + g_year + "'and c_name = '" + c_name + "'and x_id = " + x_id + ";";
在mysql控制台里执行同样的sql语句能得出结果
/* 获得槽位号 */
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
/* 转发地址命令获取到的只能是地址 如果不是地址
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;
x_id='1';
+------+
| c_id |
+------+
| 1 |
+------+
1 row in set (0.00 sec)直接用这些参数 getCourseid()函数里得到的rs也是空
后面打印一下System.out.println(sql);
看看传进来的三个参数是不是符合你想要的,也许参数传进来是null呢
我没怎么看懂你的标题,是mysql> select c_id from courses where year='2010-2011'and c_name='离散数学' and x_id='1';被执行后,mysql的控制台有输出结果,但是在java后台写的函数没有输出结果么?
如果确认是这样,建议
1.在java后台写的SQL语句执行之前打出来,看看跟select c_id from courses where year='2010-2011'and c_name='离散数学' and x_id='1'有差别么
2.检查你数据表 courses的编码,是否存在乱码问题,据我的经验mysql控制台是gbk的编码,而java后台是utf8编码,可能因为这个
3.如果上面两者都没问题,使用占位符来执行SQL
java后台写的SQL语句跟select c_id from courses where year='2010-2011'and c_name='离散数学' and x_id='1'是一样的
在第二点中,怎么排查乱码的问题?
第三点中使用占位符来执行SQL是什么意思
不吝赐教,谢谢
while(rs.next()){
c_id = Integer.parseInt(rs.getString("c_id"));
}
c_id被当做String来读取,如果c_id是数值型,估计是int,应该用下面的方法 while(rs.next()){
c_id=rs.getInt("c_id");
// c_id = Integer.parseInt(rs.getString("c_id"));
}以下是给你一个用占位符的完整代码,你试试能不能起作用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 = ?,c_name=? and x_id=?";
try {
PreparedStatement ps=con.prepareStatement(sql);
// stmt = (Statement) conn.createStatement();
ps.setString(1, g_year);
ps.setString(2, c_name);
ps.setInt(3, x_id);
rs = ps.executeQuery(sql);
while(rs.next()){
c_id=rs.getInt("c_id");
// c_id = Integer.parseInt(rs.getString("c_id"));
}
} catch (SQLException e) {
e.printStackTrace();
}
return c_id;
}
刚刚做过实验,在SQL语句用占位符的时候,查询英文数据没有任何问题,就是中文ResultSet一直为空。
整个问题解决:
1.JDBC的URL地址指定了UTF8进行编码
2.将SQL查询语句优化,利用占位符的方法,同时c_id确实应该用getInt("c_id")而不是getString()
最主要是编码的问题,我的数据库的编码是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的帮助,从而解决了问题,也谢谢大家的回复
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);
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;
/*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;