2012-09-25 68 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/