2015-12-23 25 views
0

以下是我正在嘗試執行的操作。我有一個Java程序,將遙測流分解成各個原始字段。我將這些原始字段值傳遞給MySQL表,其中每列是其中一個字段。在這個數據庫中,我也有一個觀點,它抓住所有的遙測數據,並根據原始數據計算一些新的派生列(例如原始計數到工程單位)。在我的Java程序中,插入後我想從VIEW中獲取相應的行(raw + derived)並將這些數據傳遞到別處。檢索由觸發器生成的主鍵(Java)

最初我以爲我可以簡單地將原始數據插入到VIEW中,並將行返回給我在Java程序中的ResultSet中。不幸的是,數據不會在ResultSet中返回。

我現在試圖做的是將原始數據插入表(這部分工作),獲取主鍵,然後從VIEW查找行。我正在努力的部分是從INSERT中檢索主鍵。我使用從Connection對象生成的PreparedStatement,併爲它提供Statement.RETURN_GENERATED_KEYS。但是,當我在調用executeUpdate()之後在我的語句上調用getGeneratedKeys()時,我的ResultSet始終爲空。我可以看到它在行中插入行時......我做錯了什麼?

如果主鍵是通過觸發器生成的,我能否以這種方式檢索生成的主鍵?

更新:我已經嘗試使用主鍵列的名稱換出Statement.RETURN_GENERATED_KEYS作爲String數組,但這似乎也不起作用。

對於不包括我的代碼,我很抱歉,但這樣做對我來說很難。我試圖用自己的能力來描述自己在做什麼。

回答

0

我在另一篇文章中看到了這一點。這聲稱工作。這是你的樣子嗎?

Statement stmt = db.prepareStatement(query, Statement.RETURN_GENERATED_KEYS); 
numero = stmt.executeUpdate(); 

ResultSet rs = stmt.getGeneratedKeys(); 
if (rs.next()){ 
    risultato=rs.getInt(1); 
} 

我已經使用SP的,這裏是我做的一個例子。我用一個輸入/輸出parm取回它...

CREATE DEFINER=`scaha`@`localhost` PROCEDURE `updateprofile`(
    IN in_idprofile INT(10), 
    IN in_usercode VARCHAR(50), 
    IN in_pwd VARCHAR(50), 
    IN in_nickname VARCHAR(50), 
    IN in_isactive tinyint, 
    IN in_updated timestamp, 
    OUT out_idprofile INT(10)) 
BEGIN 

/* If the idprofile is < 1 then we insert a new record.. */ 
/* otherwise its an update */ 

if (in_idprofile < 1) then 

    insert into scaha.profile (usercode, pwd, nickname, isactive,updated) values (in_usercode,in_pwd,in_nickname,in_isactive,in_updated); 
    SET out_idprofile = LAST_INSERT_ID(); 

else 
    update scaha.profile set usercode = in_usercode, pwd = in_pwd, nickname = in_nickname, isactive = in_isactive, updated = in_updated 
    where idprofile = in_idprofile; 
    SET out_idprofile = in_idprofile; 

end if; 

END 
+0

我想避免不得不訴諸存儲過程看似簡單的東西。儘管如此,SP始終是一種選擇。如果我要走這條路線,我應該從VIEW輸出行,而不僅僅是主鍵,因爲我使用的只是檢索所述行。 – celestialorb

+0

從頭開始我在上面說過。我不想使用存儲過程,因爲所討論的表有數百個列。我寧願不創建一個有很多參數的SP。 – celestialorb

+0

我聽到你說的那個。另一個解決方案可能是在代碼中創建一個uid。插入表格。作爲額外的列。然後通過uid退回 – DaveTheRave