2012-02-02 143 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