Java 在存储过程中使用存储视图

Java 在存储过程中使用存储视图,java,sql-server-2008,stored-procedures,Java,Sql Server 2008,Stored Procedures,我有一个使用存储过程的java代码,它是: ALTER PROCEDURE [dbo].[Search_Rent] AS BEGIN -- SET NOCOUNT ON added to prevent extra result sets from select * from SearchRent END SearchRent是sql server中的一个视图 我的java代码是: public class frmRented extends javax.swing.J

我有一个使用存储过程的java代码,它是:

ALTER PROCEDURE [dbo].[Search_Rent]
AS
BEGIN
    -- SET NOCOUNT ON added to prevent extra result sets from
    select * from SearchRent    
END
SearchRent是sql server中的一个视图

我的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:列名Tbl_Sofware.ID无效

如何解决此错误?

替换

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

我想你需要这个因为这条线

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

如果不执行任何操作,则创建此语句,并将其分配给da.st,但不使用它。实际上,您使用CallableStatement执行查询

您的视图没有正确声明。尝试以唯一的方式从视图运行SELECT语句,成功后,用view包装生成的语句

通过读卡器读取值时无需指定表别名,以适当的方式将代码替换为该别名,并且必须从视图中引用真实的列名:

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

你能给我们堆栈跟踪吗,或者告诉我们哪一行抛出了错误?我假设这是对beforeFirst的调用,但更多信息会更好。将ResultSet.CONCUR\u READ\u更改为ResultSet.CONCUR\u updateable请学习java命名约定并坚持这些约定此代码也有相同的异常:com.microsoft.sqlserver.jdbc.SQLServerException:列名ID无效。抱歉,未提及视图中列的真实名称。更新的答案。ooohhh,com.microsoft.sqlserver.jdbc.SQLServerException:列名SoftwareID无效。请小心-如果是SotwareID,则为您的列名-不带f字母!
da.st = da.con.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_READ_ONLY);
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");