如题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;
}

解决方案 »

  1.   

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

  2.   

    x_id是整型,不需要单括弧,应该这样写
            String sql = "select c_id from courses where year = '" + g_year + "'and c_name = '" + c_name + "'and x_id = " + x_id + ";";
      

  3.   


    在mysql控制台里执行同样的sql语句能得出结果
      

  4.   

    把sql语句 控制台打印出来看下
      

  5.   

    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
    /* 转发地址命令获取到的只能是地址 如果不是地址 
      

  6.   

    或者长度不为一 则为非法数据 直接返回错误 */
    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;
      

  7.   

    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也是空
      

  8.   

    在 String sql = "...";
    后面打印一下System.out.println(sql);
    看看传进来的三个参数是不是符合你想要的,也许参数传进来是null呢
      

  9.   

    你代码里面有个疑点,stmt = (Statement) conn.createStatement();干嘛进行强制类型转换?
    我没怎么看懂你的标题,是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
      

  10.   

    是这个问题。
    java后台写的SQL语句跟select c_id from courses where year='2010-2011'and c_name='离散数学' and x_id='1'是一样的
    在第二点中,怎么排查乱码的问题?
    第三点中使用占位符来执行SQL是什么意思
    不吝赐教,谢谢
      

  11.   

    补充一点,这也可能是这个问题的关键,你数据表里面定义的c_id这个字段是不是String类型,我想可能不是String类型而是bigint或者int,那么问题就是JDBC的API调用
    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;
        }
      

  12.   

    建议楼主使用预备语句:PreparedStatement,这样可以不用管语句的引号过多看不清楚产生的问题。
      

  13.   

    最好的办法,放到PL/SQL里面执行下
      

  14.   

    有没有报错,如果SQL语句没错那么是可以得到值的
      

  15.   

    问题是jdbc的url地址没有指定utf8编码,在查询的时候,UTF8编码的字符无法匹配gbk的字符,导致ResultSet的查询结果一直为空。
    刚刚做过实验,在SQL语句用占位符的时候,查询英文数据没有任何问题,就是中文ResultSet一直为空。
    整个问题解决:
    1.JDBC的URL地址指定了UTF8进行编码
    2.将SQL查询语句优化,利用占位符的方法,同时c_id确实应该用getInt("c_id")而不是getString()
      

  16.   

    问题解决了。。
    最主要是编码的问题,我的数据库的编码是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的帮助,从而解决了问题,也谢谢大家的回复
      

  17.   


    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);
      
      

  18.   

    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;
      

  19.   

    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;