2012-02-02 1 views
1

J'ai un code java qui utilise une procédure stockée pour ce qu'elle est:Utiliser le magasin une vue en procédure stockée

ALTER PROCEDURE [dbo].[Search_Rent] 
AS 
BEGIN 
    -- SET NOCOUNT ON added to prevent extra result sets from 
    select * from SearchRent  
END 

et SearchRent est une vue en sql server

SELECT  dbo.Tbl_Software.ID AS SotwareID, dbo.Tbl_Software.UserID_Rent, dbo.Tbl_Software.Name AS SoftwareName, dbo.Tbl_User.Family, 
         dbo.Tbl_User.Name AS UserName, dbo.Tbl_User.Tel, dbo.Tbl_Software.DataStart, dbo.Tbl_Software.DataFinish, dbo.Tbl_Software.ID_Category 
FROM   dbo.Tbl_Software INNER JOIN 
         dbo.Tbl_User ON dbo.Tbl_Software.UserID_Rent = dbo.Tbl_User.ID 

et mon code java est:

public class frmRented extends javax.swing.JFrame { 

    /** Creates new form frmRented */ 
    public frmRented() { 
     initComponents(); 
     MyTools.SetCenterLocation(this); 
     DataAccess da = new DataAccess(); 
     try { 
      da.Connect(); 

      //da.rs = da.st.executeQuery("select * from SearchRent"); 
      //da.rs = da.st.executeQuery("{call Search_Rent()}"); 
      CallableStatement cal = da.con.prepareCall("{call Search_Rent()}",ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_READ_ONLY); 
      da.rs = cal.executeQuery(); 

      da.rs.last(); 
      int rc = da.rs.getRow(); 
      da.rs.beforeFirst(); 
      int cc = 9; 

      String[] header = {"id", "idc", "name", "preamble", "k ", "s", "d", "a","e"}; 
      String[][] data = new String[rc][cc]; 
      int i = 0; 

      while (da.rs.next()) { 
       data[i][0] = da.rs.getString("Tbl_Software.ID"); 
       data[i][1] = da.rs.getString("Tbl_Software.ID_Category"); 
       data[i][2] = da.rs.getString("Tbl_Software.Name"); 
       data[i][3] = da.rs.getString("Tbl_Software.UserID_Rent"); 
       data[i][4] = da.rs.getString("Tbl_User.Name"); 
       data[i][5] = da.rs.getString("Tbl_User.Family"); 
       data[i][6] = da.rs.getString("Tbl_User.Tel"); 
       data[i][7] = da.rs.getString("Tbl_Software.DataStart"); 
       data[i][8] = da.rs.getString("Tbl_Software.DataFinish"); 
       i++; 

      } 
      jTable1 = new JTable(data, header); 
      jScrollPane1.setViewportView(jTable1); 
      cal.close(); 
      da.Disconnect(); 
     } catch (Exception e) { 
      System.out.println(e); 
     } 

    } 

mais quand j'exécute ce code je cette erreur:

com.microsoft.sqlserver.jdbc.SQLServerException: The column name Tbl_Sofware.ID is not valid.

Comment puis-je résoudre cette erreur?

+0

Pouvez-vous nous donner la trace de la pile, ou nous dire quelle ligne jette l'erreur? Je suppose que c'est l'appel à beforeFirst, mais plus d'informations seraient bonnes. –

+0

Apprenez s'il vous plaît les conventions de nommage Java et respectez-les – kleopatra

+0

Modifier 'ResultSet.CONCUR_READ_ONLY' à' ResultSet.CONCUR_UPDATABLE' –

Répondre

0

Votre vue n'est pas correctement déclarée. Essayez d'exécuter l'instruction SELECT à partir de la vue de la manière unique, et lorsque vous réussissez, enveloppez l'instruction résultante avec vue.

OU

vous ne devez pas spécifier l'alias de table en lisant des valeurs à travers le lecteur, remplacez votre code de cette manière appropriée ET vous devez vous référer nom réel des colonnes de votre vue:

data[i][0] = da.rs.getString("SotwareID"); 
data[i][1] = da.rs.getString("ID_Category"); 
data[i][2] = da.rs.getString("SoftwareName"); 
data[i][3] = da.rs.getString("UserID_Rent"); 
data[i][4] = da.rs.getString("UserName"); 
data[i][5] = da.rs.getString("Family"); 
data[i][6] = da.rs.getString("Tel"); 
data[i][7] = da.rs.getString("DataStart"); 
data[i][8] = da.rs.getString("DataFinish"); 
+0

ce code a également la même exception: com.microsoft.sqlserver.jdbc.SQLServerException: L'ID de nom de colonne n'est pas valide. – hamed

+0

Désolé, pas mentionné les vrais noms des colonnes en vue. Réponse mise à jour –

+0

ooohhhh, com.microsoft.sqlserver.jdbc.SQLServerException: Le nom de la colonne SoftwareID n'est pas valide. – hamed

0

Remplacer

CallableStatement cal = da.con.prepareCall("{call Search_Rent()}",); 

Avec

CallableStatement cal = da.con.prepareCall("{call Search_Rent()}",ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_READ_ONLY); 

Je pense que vous avez besoin parce que cette ligne

da.st = da.con.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_READ_ONLY); 

ne fait rien, vous créez ce Statement, et l'affecter à da.st mais ne l'utilisez pas. Vous exécutez réellement votre requête en utilisant le CallableStatement

Questions connexes