2012-09-25 98 views
5

我使用JTDS JDBC驅動程序,當我打電話ResultSet.getNString(index);我得到以下異常:JTDS JDBC驅動程序:getNString()拋出錯誤

run: 
Exception in thread "main" java.lang.AbstractMethodError: net.sourceforge.jtds.jdbc.JtdsResultSet.getNString(I)Ljava/lang/String; 
    at javasql.ProductsController.PrePopulate(ProductsController.java:51) 
    at javasql.ProductsController.<init>(ProductsController.java:37) 
    at javasql.Program.main(Program.java:25) 
Java Result: 1 
BUILD SUCCESSFUL (total time: 6 seconds) 

當我使用getString(index)它工作正常..它是唯一與getNString()我有問題,MSSQL表中的列被定義爲NVarChar。那麼,是什麼給了? jtDS不支持getNString()嗎?也許它通過相同的getString()函數獲得VarCharNVarChar

編輯:

相關的unicode問題..我可以看到,嘗試使用Unicode插入要麼不起作用。我列定義爲nvarchar(255),但以下INSERT語句不起作用:

private final String INSERT_FORMAT = "INSERT INTO Products (Name, Price, QuantityInStock) VALUES (N'%s', %s, %s)"; 

    public void Insert(Product p) { 
      products.add(p); 
      try { 
       statement.addBatch(String.format(INSERT_FORMAT, p.getName(), p.getPrice(), p.getQuantityInStock())); 
      } catch (SQLException ex) { 
       System.out.println(ex.getMessage()); 
      } 
     } 

public void SaveChanges() { 
     try { 
      statement.executeBatch(); 
     } catch (SQLException ex) { 
      System.out.println(ex.getMessage()); 
     } 
     RefreshData(); 
    } 

中的Unicode字符,我輸入顯示爲數據庫中的問號。這通常發生在您忘記在插入語句中將N添加到上述參數中時。但是在這裏您可以看到我明確指定了它。 JtDS的功能列表確實說它支持NVARCHAR,NTEXT等。但目前我只看到問題。我究竟做錯了什麼?

EDIT 2

問題1解決了。我直接插入一些中國字符轉換成通過SSMS的數據庫,當我用getString(index),它工作得很好。所以看來jTDS對我猜的所有文本類型都使用getString。奇怪,那麼它不會爲getNString(index)函數拋出某種不受支持的異常。

因此,現在我們留下了如何將Unicode數據插入NVARCHAR列的問題。這裏肯定有人有過這方面的經驗?

編輯3

我改變了我的代碼以使用準備好的聲明中的每個方法,而不是試圖用一個批次和使用的SETINT,了setString等方法。但是,我仍然有同樣的問題...如果我使用unicode的setString(),它插入???進入我的分貝。如果我使用setNString(),那麼當我在執行getNString時,我收到了我在本文頂部收到的同樣的錯誤...這是瘋了...如果它實際上不支持unicode,該驅動程序如何變得如此受歡迎??我在這裏錯過了什麼?該網站確實說它支持NVARCHAR等。那麼,爲了使這項工作我需要做什麼瘋狂的不直觀的事情?

+0

我希望[這裏](http://stackoverflow.com/questions/10965589/unicode-data-type-in​​-sql)已經有人試圖與您的問題相關 – gks

+0

@Stranger ...不是我的問題..並沒有真正相關。在那個線程中,OP不知道關於NVARCHAR列的任何信息等。我非常瞭解它,實際上使用的是NVARCHAR列。我非常熟悉SQL,並且一直在編寫基於SQL的應用程序多年..我遇到的問題是與jTDS驅動程序..它似乎不起作用,至少不是人們所期望的方式。 – Matt

回答

5

getNString與Java 1.6/JDBC 4.0一起添加。看起來你的司機太老了。

+0

不要這樣。事實上,我在這裏得到了最新版本(1.2.6):http://sourceforge.net/projects/jtds/files/jtds/ – Matt

+0

此外,你顯然沒有閱讀整篇文章。看來getString()對於Unicode工作正常,而我現在所遇到的主要問題實際上是通過此驅動程序插入unicode數據。 – Matt

+0

如果您閱讀版本1.2.6(或主頁)的發行說明,您將看到「它是** JDBC 3.0 **的完整實現,它通過** J2EE 1.3 ** 認證」。如果你再看一下'net.sourceforge.jtds.jdbc.JtdsResultSet'的源代碼,你會發現'getNString'被實現時,代碼只包含'// TODO自動生成的方法存根'和'拋出新的AbstractMethodError ();'。我確實讀過整篇文章,但後來做了三次編輯。 –

1

你的主鍵是什麼類型? 我完全按照你描述了同樣的問題,那就是:我可以用經典的getString()方法檢索存儲爲NVARCHAR數據,但更新將無法正常工作,甚至具有sendStringParametersAsUnicode選項設置爲 ...直到我將主鍵從NVARCHAR更改回VARCHAR。現在它適用於我。 更新實際上並沒有產生任何錯誤,它只是顯示主鍵無法找到,因此什麼都沒有發生...... 不過,我希望能夠使用一些字段的unicode存儲沒有設置sendStringParametersAsUnicode選項true,但我的印象是,這是不可能的,除非可能通過鍵入有關列作爲byte []而不是NVARCHAR並使用setBytes()方法設置它們(建議here/

相關問題