Используйте сохранить представление в хранимой процедуре - PullRequest
1 голос
/ 02 февраля 2012

У меня есть 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

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: имя столбца Tbl_Sofware.ID недопустимо.

Как я могу решить эту ошибку?

Ответы [ 2 ]

0 голосов
/ 02 февраля 2012

Ваш взгляд не объявлен должным образом. Попробуйте запустить оператор SELECT из представления единственным способом, и, когда вам это удастся, оберните полученный оператор представлением.

ИЛИ

вам не нужно указывать псевдоним таблицы при чтении значений через считыватель, замените ваш код следующим образом И вы должны ссылаться на реальные имена столбцов из вашего представления:

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 голосов
/ 02 февраля 2012

Заменить

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

на

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...