2013-12-12 60 views
0

我試圖做一個動態的刪除查詢。動態刪除查詢

什麼即時通訊基本上試圖做的是首先抓住任何表(主鍵)的第一列的名稱。然後,我用另一個查詢從該表中刪除,雖然我得到一個nullpointerexception?

哦,主鍵不是像1,2,3,4,5等INT。它形成了S1,S2,S3,S4,S5等,並且類型是TEXT。

Connection c = null; 
Statement stmt = null; 
try { 
    Class.forName("org.sqlite.JDBC"); 
    c = DriverManager.getConnection("jdbc:sqlite:test.db"); 
    c.setAutoCommit(true); 
    System.out.println("Opened database successfully"); 

    ResultSet rs = stmt.executeQuery("SELECT * FROM "+tablename); 
    ResultSetMetaData rsmd = rs.getMetaData(); 
    FirstColumn = rsmd.getColumnName(1); 
    String query = "DELETE FROM "+tablename+" WHERE " +FirstColumn+ " = " +row; 
    stmt = c.createStatement(); 

    stmt.executeUpdate(query); 

    stmt.close(); 
    c.close(); 
+0

字符串'query'中'row'的撇號? –

+0

你究竟在做什麼? –

+0

一般來說,堆棧跟蹤會顯示引起NullPointerException的行,可能確切的變量爲空。 –

回答

1

我打算假設你正在使用的所有變量都已經初始化了。

我在FirstColumn名稱周圍添加了單引號。

Connection c = null; 
    Statement stmt = null; 
    try { 
     Class.forName("org.sqlite.JDBC"); 
     c = DriverManager.getConnection("jdbc:sqlite:test.db"); 
     c.setAutoCommit(true); 
     System.out.println("Opened database successfully"); 

     ResultSet rs = stmt.executeQuery("SELECT * FROM "+tablename); 
     ResultSetMetaData rsmd = rs.getMetaData(); 
     FirstColumn = rsmd.getColumnName(1); 
     String query = "DELETE FROM "+ tablename +" WHERE " + FirstColumn + " = '" + row + "'"; 
     stmt = c.createStatement(); 

     stmt.executeUpdate(query); 

     stmt.close(); 
     c.close(); 

如果您仍然收到錯誤,您應該嘗試打印出您的行名並查看它打印出來的內容。

編輯:由於你是新的風格,當使用運算符來提高代碼可讀性時,最好添加一個空格。例如,1 + 3 + x + 34比1 + 3 + x + 34更難讀取。當然,沒有「錯誤」的代碼風格,但改善代碼可讀性始終是一個優點。

+0

謝謝你現在的作品,感謝你和飛餃子! :) – Looptech

1

初始化您stmt對象...

stmt = c.createStatement(); 

前執行查詢。

+0

那麼我做對了嗎? – Looptech

+0

不,你不知道。在執行第一個查詢之後,您可以創建語句**。在執行第一個查詢之前,您必須執行此操作**。 –

+0

是的,我現在看到謝謝! :) – Looptech