2013-10-04 71 views
0

我在java類中有sql代碼。代碼就像下面這樣。SQL INSERT INTO無法正常工作(在Java中)

private void SummTEkspor(){ 
     try { 
     bln = (String) cmbBln.getSelectedItem(); 
     thn = (String) cmbThn.getSelectedItem(); 
     String sql1 ="DELETE FROM a.dbo.t_export"; 
     String sql2 ="INSERT INTO a.dbo.t_export\n" + 
        "SELECT * FROM b.dbo.export b WHERE b.sk_batch IN \n" + 
        "(SELECT sk_batch from batch_hdr WHERE bln_proses="+bln+ 
        "AND thn_proses="+thn; 


      Statement st = kon.conn.createStatement(); 
      int rs = st.executeUpdate(sql1); 
      int rsl = st.executeUpdate(sql2); 


     } catch (Exception x) { 
      System.out.println("FAILED");; 
     } 
    } 

當我運行SQL1,它的工作原理,但是當SQL2,它不能正常工作,只是顯示FAILED。我猜sql2中的查詢沒有從選擇的組合框中取得任何值。我該如何解決這個問題?謝謝任何回覆

+0

你爲什麼要在查詢中放入'\ n'? – Abubakkar

+0

難道你不認爲這些字符串值是否值得引用?另外我認爲在那個sql2字符串中沒有適當的空格,你能在這裏粘貼什麼值的sql2? –

+0

它的顯示失敗,因爲控制去捕獲block.Print stacktrace並更新您的代碼。 – SpringLearner

回答

0

問題是因爲您查詢是不妥當的:

INSERT INTO a.dbo.t_export\n" + 
"SELECT * FROM b.dbo.export b WHERE b.sk_batch IN \n" + 
    "(SELECT sk_batch from batch_hdr WHERE bln_proses="+bln+ 
    "AND thn_proses="+thn; 

當您創建一個第二選擇子查詢,您沒有關閉)支架。

試試這個:

INSERT INTO a.dbo.t_export" + 
"SELECT * FROM b.dbo.export b WHERE b.sk_batch IN " + 
    "(SELECT sk_batch from batch_hdr WHERE bln_proses='"+bln+ 
    "' AND thn_proses='"+thn + "')"; 
0

您在(SELECT sk_batch f中打開了一個支架,並且從不關閉它。
使用System.out.println(sql2);才能看到第二個查詢的樣子,這也可能是因爲參數thnbln之一是null例如。

0

修復查詢,報價字符串值,並把適當的空間。

String bln="testing"; 
    String thn="abc"; 
    String sql2 ="INSERT INTO a.dbo.t_export\n" + 
       "SELECT * FROM b.dbo.export b WHERE b.sk_batch IN \n" + 
       "(SELECT sk_batch from batch_hdr WHERE bln_proses='"+bln+ 
       "' AND thn_proses='"+thn+"')"; 
0

嘗試此查詢

String sql2 ="INSERT INTO a.dbo.t_export" + 
"SELECT * FROM b.dbo.export b WHERE b.sk_batch IN " + 
"(SELECT sk_batch from batch_hdr WHERE bln_proses="+bln+ 
"AND thn_proses="+thn+ ")"; 

bln_proses & thn_proses這些都是從同一個表batch_hdr ???

0

也許有索姆ereasons: - 在第二個SELECT語句 關閉託槽 - 如果bln_proses或thn_proses是字符串,那麼你必須使用「字符包括

0

首先,你已經把\n值的查詢是不必要的,則不需要對錶格a.dbo.t_export進行限定。

相反的:

String sql2 ="INSERT INTO a.dbo.t_export\n" + 
       "SELECT * FROM b.dbo.export b WHERE b.sk_batch IN \n" + 
       "(SELECT sk_batch from batch_hdr WHERE bln_proses="+bln+ 
       "AND thn_proses="+thn; 

嘗試:

String sql2 ="INSERT INTO dbo.t_export " + 
       "SELECT * FROM b.dbo.export b WHERE b.sk_batch IN " + 
       "(SELECT sk_batch from batch_hdr WHERE bln_proses="+bln+ 
       " AND thn_proses="+thn +")"; 

如果你的列是VARCHAR類型的,那麼你必須把裏面的值 ''(單引號)。

上面的查詢將工作。但是我建議你不要使用這種方法,因爲SQL注入是有機會的。使用預編譯語句來避免SQL注入。