2011-06-01 63 views
2

你好我試圖執行查詢的Java SQL空字段

Statement stmt = conn.createStatement(); 
stmt.executeUpdate(location_query); 

location_query是

insert into table(col, col2) value("2", ""); 

兩個關口和COL2是雙(12,2)型,我得到錯誤 Data truncated for column 'col2' at row 1,但如果我打印我的查詢並複製,並將其粘貼到PMA(PhpMyAdmin)其正確。

我發現它的col2的colouse值是空的,但有沒有機會以其他方式解決這個問題,而不是檢查所有的變量,我試圖把我的查詢?

+0

被COL2定義爲可空? – DaveH 2011-06-01 09:46:10

+0

不是它的默認空,但我可以改變它 – 2011-06-01 09:56:53

回答

5

那麼,一個空字符串不是一個有效的數字,因此不同的數據庫系統可能會有不同的處理方式。如果你只是想該列NULL或填充默認情況下,你應該把它弄成這樣:

insert into table(col) value(2); 

或將其設爲NULL明確:

insert into table(col, col2) value(2, NULL); 

此外,數字沒有在SQL引號寫。此外,你應該只使用PreparedStatements。 PreparedStatements爲你提供了類型安全並防止SQL注入的問題,重用時可能會更快。

看看google "statement vs. preparedstatement"

編輯

您例如使用預處理語句時,會是這個樣子,:

String yourFirstString = "2.34"; 
String yourSecondString = ""; 

double yourFirstDouble = 0; 
double yourSecondDouble = 0; 

if(yourFirstString != null && yourFirstString.trim().length() > 0){ 
    try { 
    yourFirstDouble = Double.parseDouble(yourFirstString); 
    }catch(NumberFormatException e){ 
    // handle Exception here 
    } 
} 

// same parsing for the second double 

PreparedStatement stmt = conn.prepareStatement("insert into table (col, col2) value(?, ?)"); 
stmt.setDouble(1, yourFirstDouble); 
stmt.setDouble(2, yourSecondDouble); 
stmt.executeUpdate(); 
+0

好吧,但會preparedStatements保護我免受空值並secound的事情是,我永遠不知道哪個值是空的這就是爲什麼我必須把它們全部 – 2011-06-01 09:58:25

+0

因爲'setDouble(int,double)'是類型保存你只能使用有效的雙打作爲參數。這意味着,您無法將空字符串應用於該語句。你應該測試該字符串是否爲空,如果是,則設置0或NULL。否則,你應該嘗試將String解析爲一個double並使用它。我會編輯我的答案並添加一個例子。 – 2011-06-01 11:41:10

+0

我添加了一些解析示例。但是,所有這些邏輯都不應該在同一個地方。在我猜測,用戶輸入值的解析應當在GUI邏輯附近輸入時進行驗證。但是,數據庫層應該只能獲得雙精度,而不能進行字符串解析,驗證等。 – 2011-06-01 11:47:25