Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/86.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
sqljdbc&;Java JUnit测试失败_Java_Sql - Fatal编程技术网

sqljdbc&;Java JUnit测试失败

sqljdbc&;Java JUnit测试失败,java,sql,Java,Sql,我正在尝试在我的类CreditCardDaoImpl上运行JUnit测试(CreditcardDAOTest)。我一直收到错误“java.sql.SQLException:没有为参数2指定值”,但我认为没有两个参数。 如蒙协助,将不胜感激。我认为错误来自于“ps.setLong(1,customerID);”我假设应该有一个“ps.setLong(x,x);“但我不知道应该是什么。我尝试过调试,它似乎应该是我语句的名称条目: final static String retrieveForCust

我正在尝试在我的类CreditCardDaoImpl上运行JUnit测试(CreditcardDAOTest)。我一直收到错误
“java.sql.SQLException:没有为参数2指定值”
,但我认为没有两个参数。 如蒙协助,将不胜感激。我认为错误来自于
“ps.setLong(1,customerID);”
我假设应该有一个
“ps.setLong(x,x);“
但我不知道应该是什么。我尝试过调试,它似乎应该是我语句的名称条目:

final static String retrieveForCustomerID = 
        "SELECT name = ?, cc_number = ?, exp_date = ?, security_code = ?,  WHERE customerID = ?;";
但我还是一点也不确定。请知道,我一直试图弄明白这一点有一段时间了,我只是在寻求指导

//Method in CreditCardDAOImpl
public CreditCard retrieveForCustomerID(Connection connection, Long customerID) throws SQLException, DAOException 
{
    if (customerID == null ) 
    {
        throw new DAOException("Trying to retrieve credit card with NULL customerID");
    }

    PreparedStatement ps = null;
    try 
    {
        ps = connection.prepareStatement(retrieveForCustomerID);
        ps.setLong(1, customerID);
        ResultSet rs = ps.executeQuery();
        CreditCard cc = new CreditCard();
        cc.setName(rs.getString("name"));
        cc.setCcNumber(rs.getString("cc_number"));
        cc.setExpDate(rs.getString("exp_date"));
        cc.setSecurityCode(rs.getString("security_code"));
        return cc;
    }
    finally 
    {
    }
}

//Method in CreditCardDAOTest
@Test
public void testRetrieveForCustomerID() throws Exception
{
    DataSource ds = DataSourceManager.getDataSource();
    Connection connection = ds.getConnection();
    CreditCardDAO dao = new CreditCardDaoImpl();

    CreditCard ccard = dao.retrieveForCustomerID(connection, customerID);
    assertNotNull(ccard);
    assertNotNull(ccard.getCcNumber());
    assertNotNull(ccard.getExpDate());
    assertNotNull(ccard.getName());
    assertNotNull(ccard.getSecurityCode());

    connection.close();
}
使用
rs.next()
,您的查询应该如下所示

final static String retrieveForCustomerID = 
        "SELECT name, cc_number, exp_date, security_code from TABLE_NAME WHERE customerID = ?" 
注意:将上述查询中的表名替换为实际表名

  • 我认为您应该在查询中指定表名,并删除select块中的问号

    SELECT name, cc_number , exp_date, security_code FROM your_table_name WHERE customerID = ?
    
  • 在执行查询之前,您应该发送查询的所有详细信息?在查询中使用

     ps.setInt(), ps.setLong(), ps.setString().... etc.
    
  • 在执行prepared语句并获得结果集之后,应该使用

      rs.next() 
    

  • 迭代您的resultSet。

    您的意思是如果(!rs.next()){return null;}第一个更改是按如下方式更新查询,然后在将resultSet用作rs之前。
    getXXX()
    调用rs.next()。这应该有帮助,太好了!谢谢