2012-02-21 62 views
0

我正在製作一個程序,該程序必須提醒用戶,如果某個閾值已經超過一定的金額。Java Resultset.getInt()沒有正確返回?

我已經做了一個方法來檢查用戶是否已經收到該閾值的提醒,所以我們不重複提醒,因爲我已經建立了一個MySQL表格,基於警報是否已經被1s和0填充已經發送或沒有發送。

這是表:

mysql> describe avisos; 
+----------------+------------+------+-----+---------+-------+ 
| Field   | Type  | Null | Key | Default | Extra | 
+----------------+------------+------+-----+---------+-------+ 
| CLI   | varchar(9) | NO | PRI | NULL |  | 
| mes   | int(2)  | YES |  | NULL |  | 
| AvisadoPrimero | int(11) | NO |  | NULL |  | 
| AvisadoSegundo | int(11) | NO |  | NULL |  | 
| AvisadoTercero | int(11) | NO |  | NULL |  | 
| AvisadoCuarto | int(11) | NO |  | NULL |  | 
+----------------+------------+------+-----+---------+-------+ 
6 rows in set (0.00 sec) 

然而,當在我的程序我做一個查詢,以檢查是否報警已經發出,不管是什麼,代碼將始終返回0(因此說明該報警沒有發送)。

在這裏你可以看到字段的值,我在尋找:

mysql> SELECT AvisadoPrimero from avisos where CLI=#########; //(hidden for security reasons) 
+----------------+ 
| AvisadoPrimero | 
+----------------+ 
|    1 | 
+----------------+ 
1 row in set (0.00 sec) 

這裏是我的代碼,我的計劃之內運行:

  try { 
     Statement sentencia = conexion.createStatement(); 
     PreparedStatement avisosQuery = conexion.prepareStatement(avisosString); 
     PreparedStatement subtotalesQuery = conexion.prepareStatement(subtotalesString); 
     //ResultSet sobrepasados = sentencia.executeQuery("SELECT cli FROM subtotales where Precio >=" + umbralInferior + " and Precio <" + umbralSuperior + ";"); 
     subtotalesQuery.setInt(1, umbralInferior); 
     subtotalesQuery.setInt(2, umbralSuperior); 
     sobrepasados = subtotalesQuery.executeQuery(); 
     while (sobrepasados.next()) { 
      clis.add(sobrepasados.getString("CLI")); 
     } 
     if (!clis.isEmpty()) { 
      for (int i = 0; i < clis.size(); i++) { 

       switch (umbralInferior) { 
        case UMBRAL1: 
         avisosQuery.setString(1, "AvisadoPrimero"); 
         avisosQuery.setString(2,clis.get(i)); 
         resultado = avisosQuery.executeQuery(); 

         resultado.first(); 

         //System.out.println("Entrando en prueba\n\nConsulta realizada:"); 
         //System.out.println(resultado.getInt("CLI")); 
         System.out.println(resultado.getInt(1)); 

所以,你可以看到如果表中的字段設置爲1,則最後一次打印將始終打印0.

任何提示?我究竟做錯了什麼?

==============

最後,使用PreparedStatement和固定的列名,摸索出。

(我也相信有一些錯誤在被初始化爲0表示始終MySQL表一些觸發器,但是這是未經證實)

下面是最終代碼:

try { 
     Statement sentencia = conexion.createStatement(); 
     PreparedStatement avisosQuery = conexion.prepareStatement(avisosString); 
     PreparedStatement subtotalesQuery = conexion.prepareStatement(subtotalesString); 
     //ResultSet sobrepasados = sentencia.executeQuery("SELECT cli FROM subtotales where Precio >=" + umbralInferior + " and Precio <" + umbralSuperior + ";"); 
     subtotalesQuery.setInt(1, umbralInferior); 
     subtotalesQuery.setInt(2, umbralSuperior); 
     sobrepasados = subtotalesQuery.executeQuery(); 
     while (sobrepasados.next()) { 
      clis.add(sobrepasados.getString("CLI")); 
     } 
     if (!clis.isEmpty()) { 
      for (int i = 0; i < clis.size(); i++) { 

       switch (umbralInferior) { 
        case UMBRAL1: 
         //avisosQuery.setString(1, "AvisadoPrimero"); 
         avisosQuery.setString(1,clis.get(i)); 
         resultado = avisosQuery.executeQuery(); 

         resultado.first(); 

         //System.out.println("Entrando en prueba\n\nConsulta realizada:"); 
         //System.out.println(resultado.getInt("CLI")); 
         System.out.println(resultado.getBoolean(1)); 

謝謝所有!!

+0

你用rsultado.getInt(1)試過了嗎? – Andreas 2012-02-21 12:35:10

+1

添加一個'System.out.println'語句來打印'clis.get(i)'的值,以確保您正在選擇您認爲正在選擇的內容。 – Jesper 2012-02-21 12:35:40

+0

是的,同樣的運氣,返回0. – Lowb 2012-02-21 12:36:26

回答

1

MySQL準備的語句不允許參數列或表名稱。現在,代碼選擇字符串"AvisadoPrimero"而不是列的值。也就是說,當你寫:

PreparedStatement avisosQuery = conexion.prepareStatement(
     "SELECT ? FROM avisos WHERE CLI=?"); 
avisosQuery.setString(1, "AvisadoPrimero"); 
avisosQuery.setString(2,clis.get(i)); 

數據庫接收:

SELECT "AvisadoPrimero" FROM avisos WHERE CLI=something 

然後調用getInt失敗,因爲文本"AvisadoPrimero"無法轉換爲數字。

+0

感謝您的信息,當然準確:) – Lowb 2012-02-21 17:16:03