2015-09-09 2 views
1

Я пытаюсь получить данные из базы данных Access и использовать эти значения в моем сценарии selenium, но почему-то я не могу этого сделать. Хотя мне удалось успешно подключиться к базы данных и распечатать значения в консоли. Я не могу использовать те же значения в скрипте. Это код, который я использовал. Пожалуйста, дайте мне знать, я ошибаюсь.Ошибка «Недопустимое состояние курсора» при чтении из базы данных

package AccessDB; 

import java.sql.Connection; 
import java.sql.Driver; 
import java.sql.DriverManager; 
import java.sql.ResultSet; 
import java.sql.Statement; 

import org.openqa.selenium.By; 
import org.openqa.selenium.WebDriver; 
import org.openqa.selenium.firefox.FirefoxDriver; 
import org.testng.annotations.Test; 
import org.testng.annotations.BeforeTest; 
import org.testng.annotations.AfterTest; 

public class Sample_Access_DB_Test { 
    public static WebDriver driver; 
    public static String dbLocation; 
    public static Connection con; 
    public static Statement smt; 
    public static ResultSet rs; 
    @Test 
    public void f() throws Exception { 
     //Database Location 
     dbLocation = "D:\\AccessDB's\\Userinfor1.accdb"; 

     //Connecting to the Database 
     con = DriverManager.getConnection("jdbc:odbc:ADB"); 
     System.out.println("Connection Establised Successfully"); 

     //Creating DB statement 
     smt = con.createStatement(); 
     System.out.println("Statement Successfully Created"); 

     //Executing Created Statement 
     rs = smt.executeQuery("Select * from Userinfor1"); 
     System.out.println("Query Executed"); 

     while(rs.next()){ 
     System.out.println(rs.getString(2)); 
     //System.out.println(rs.getString(3)); 
     //System.out.println(rs.getString(4)); 
     } 
     driver.findElement(By.id("login-username")).sendKeys(rs.getString(2)); 
     /* 
     driver.findElement(By.id("login-username")).sendKeys("gopi_krishna28"); 
     driver.findElement(By.id("login-passwd")).sendKeys("gopikrishna28"); 
     driver.findElement(By.id("login-signin")).click();*/ 
    } 
    @BeforeTest 
    public void beforeTest() { 
     driver = new FirefoxDriver(); 
     driver.get("http://www.yahoomail.com/"); 
    } 

    @AfterTest 
    public void afterTest() { 
    } 

} 

и это ошибка, которая выбрасывается

java.sql.SQLException: [Microsoft] [ODBC Driver Manager] Invalid состояние курсора

ответ

1

После выполнения запроса, которую ваши while(rs.next()){ итерацию цикла через строки в ResultSet и значения дампов на консоли. После этого цикла выход из текущей позиции ResultSet не указывает на действительную строку; он позиционируется после последней строки.

Так, на следующей строке

driver.findElement(By.id("login-username")).sendKeys(rs.getString(2)); 

при попытке использовать rs.getString(2) вы получите сообщение об ошибке, потому что ResultSet не находится на действительной строке.

Вы будете должны:

  1. избавиться от петли while(rs.next()){ и, возможно, просто сделать один rs.next() позиционировать ResultSet в первом ряду (при условии, что он существует), а затем продолжить с там, или

  2. если ваш SELECT, запрос возвращает несколько строк, и вы хотите, чтобы сделать некоторую обработку для каждой строки затем сохранить цикл while(rs.next()){, но переместить код Selenium внутри цикла, где вызовы как rs.getString(2) будет иметь возможность возвращать значения для текущей строки ResultSet.

+0

hmm okey ... Я попробовал другой способ ... ну, это вроде работа, но не полностью. Я заменяю оператор while оператором if if (rs.next()) {\t driver.findElement (By.id (rs.getString (2))). sendKeys (rs.getString (3)); \t \t driver.findElement (By.id (rs.getString (4))). SendKeys (rs.getString (5)); \t \t }, но дело здесь в его единственном доступе к столбцам, а не к строкам .. как я могу получить доступ к строкам? любая идея по этому поводу? – user1856470

+0

@ user1856470 - Я обновил свой ответ. –

Смежные вопросы