2012-02-02 142 views
1

一個觀點我有使用一個存儲過程,這是一個Java代碼:使用儲存在存儲過程

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

SearchRentsql 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 

和我的Java代碼視圖是:

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

    } 

但是當我執行這個代碼,我有這樣的錯誤:

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

我該如何解決這個錯誤?

+0

你可以給我們堆棧跟蹤,或者告訴我們哪一行拋出錯誤?我認爲這是對beforeFirst的呼籲,但更多的信息會很好。 – 2012-02-02 10:19:12

+0

請學習java命名約定並堅持使用它們 – kleopatra 2012-02-02 11:38:40

+0

將'ResultSet.CONCUR_READ_ONLY'更改爲'ResultSet.CONCUR_UPDATABLE' – 2012-02-02 10:23:24

回答

0

執行您的查詢您的視圖未正確聲明。嘗試以唯一的方式從視圖運行SELECT語句,並且當您成功時,將結果語句換成視圖。

OR

,而讀值通閱讀器,你不需要指定表的別名,這個替換您的代碼以適當的方式你必須從你的觀點是指真正的列名:

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

此代碼也具有相同的異常:com.microsoft.sqlserver.jdbc.SQLServerException:列名ID無效。 – hamed 2012-02-02 11:53:25

+0

對不起,沒有提到列中的真實名稱。更新了答案。 – 2012-02-02 11:56:32

+0

ooohhhh,com.microsoft.sqlserver.jdbc.SQLServerException:列名稱SoftwareID無效。 – hamed 2012-02-02 12:06:05

0

更換

​​3210

隨着

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

我認爲你需要這個,因爲這條線

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

沒有做任何事情,你創建這個Statement,並將其分配給da.st但是不要使用它。您實際上使用CallableStatement