2017-07-03 320 views
0
  • 我看了前面的問題,但他們都不符合我的問題,雖然他們可能乍看相似。 :/ _

所以,我正在研究Java(JDBC)上的本地數據庫。當我按下按鈕時,我應該會得到「SELECT」查詢的結果。到目前爲止這麼好,但由於某種原因,我的初學者大腦不瞭解,我一直從查詢中獲得只有一行行。我甚至在「DB Browser for SQLite」上運行同樣精確的查詢,並返回正確的結果(1+行)。 所以這是我使用來獲取查詢結果的方法:SQLite的查詢只返回一行JDBC Java數據庫

public ResultSet returnBill(int no) throws SQLException{ 
    String sql = "SELECT * FROM billList WHERE no = " + no + " ;"; 
    ResultSet thisSet = stmt.executeQuery(sql); // stmt is a 'Statement' type variable 
    return thisSet; 
} 

的方法不會崩潰,但它只返回應返回超過2(,而查詢的第一個行( thisSet.next()) RUNS ONCE)。我在程序中運行了其他的「SELECT」查詢,它們應該返回多於一行,並且它們都工作正常,所以它不是無法啓動/關閉連接等問題。

下面是正在使用:

int number = table.getModel().getValueAt(rows, 0);        
ResultSet thisSet = db.returnBill(number); 
while (thisSet.next()){ 
     String name = thisSet.getString("name"); 
     int quantity = thisSet.getInt("quantity"); 
     // do something with the returned data 
} 

所以我得到這個神奇的數字從一個表(當然我確信這不是0,-1等)和我運行使用該號碼查詢。你可以把由列的表的結構:

號|名稱|數量|

其中 '編號' 非零。 據我所知,可能使用這種方法在數據庫上運行查詢可能不安全或可能會發布安全威脅,但現在情況並非如此。我已經在這個項目上工作了很長時間了,我經歷了許多愚蠢的錯誤,我認爲這只是其中之一。任何幫助都是令人欣慰的! :d

+0

你調試代碼?你從表中給出了什麼值(數值)?數據庫中是否存在具有給定值的多行? –

+0

@hadi。曼斯里桌子給出了一個合適的數字,我試了一下。我也打印「sql」字符串,查詢是正確的。是的,因爲我在一些外部軟件「SQLite數據庫瀏覽器」上查看數據庫的數據庫,因此我甚至可以運行相同的查詢 –

+0

您是否在代碼中,也沒有拋出一些異常?嘗試通過調試器逐步完成 –

回答

0

所以,是的,這是一個愚蠢的錯誤,我的預期。 所以我先前發起的可變

Database db = new Database(); 

其打開數據庫2個查詢(SELECT查詢並且如圖所示在另一表中的UPDATE查詢),這將隨後在下面的代碼的結束時關閉。

當我刪除了此UPDATE查詢然而循環中執行的時間正確的金額。所以它看起來像SQLite的JDBC在某種程度上容易出現在同一聲明運行SELECT和UPDATE查詢(至於我的超大型*大腦感知它。)

因此,我創建在最開始2個連接,使用其中之一爲SELECT,另一個爲UPDATE查詢閉上了底:

Database db = new Database(); // open database 
Database db2 = new Database(); // open another creepy one :/ 

int number = table.getModel().getValueAt(rows, 0);        
ResultSet thisSet = db.returnBill(number); 
while (thisSet.next()){ 
     String name = thisSet.getString("name"); 
     int quantity = thisSet.getInt("quantity"); 
     // do something with the returned data 
     // --------> STUPIDO <---------- 
     //** Now executing an UPDATE query on db2 : 
     // ex.: UPDATE anotherTable SET amount = (current+ "+ quantity+") WHERE name= '" + name+ "' ;"; 
} 
db.closeConn(); // close db ++ 
db2.closeConn(); // closes db 2 

我不知道這是不是最好的辦法,但它解決了我的問題,所以我會離開它,所以它可能會有所幫助。任何建議雖然將受到歡迎:d

+0

您絕對應該使用單個連接,以便您可以在單個事務中同時擁有兩個語句。你使用了兩個不同的語句對象嗎? –

+0

如果處理結果集,然後 - 在遍歷結果集的同時 - 在同一個Statement對象上執行更新語句,則結果集將被關閉。您使用該數據庫對象有點違反直覺;你可能想要考慮不要像現在那樣隱藏對連接和聲明的管理。 –

+0

@MarkRotteveel我在有關ResultSet的文檔中找不到這些細節,所以非常感謝。徹底解釋我的數據庫連接的詳細視圖很難。由於缺乏經驗,我希望這會是一些可見的愚蠢的錯誤,這就是爲什麼我沒有發佈整個代碼。問候:D –