我正在使用jtDS JDBC驱动程序,当我调用ResultSet.getNString(index);
时,我得到以下异常:
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()
吗?也许它通过相同的VarChar
函数得到NVarChar
和getString()
?
修改
相关的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等。但目前我只看到问题。我做错了什么?
编辑2
问题1已解决..我通过SSMS将一些中文字符直接插入到数据库中,当我使用getString(index)
时,它工作正常。所以似乎jTDS对我猜的所有文本类型使用getString。奇怪的是它并没有为getNString(index)
函数抛出某种不支持的异常。
所以,现在我们留下了如何将unicode数据插入 NVARCHAR 列的问题。当然有人有过这方面的经验吗?
编辑3
我更改了我的代码,在每个方法中使用预准备语句,而不是尝试使用批处理并使用setInt,setString等方法。但是,我仍然遇到同样的问题...如果我使用setString()作为unicode,它会插入???进入我的数据库。如果我使用setNString()然后我得到了同样的错误,当我在做getNString时,我在这篇文章的顶部收到了...这是疯了......如果它实际上不支持unicode,那么这个驱动程序怎么会变得如此受欢迎??我在这里错过了什么?该网站确实说它支持NVARCHAR等。所以,为了使这项工作我需要做的是什么疯狂不直观的事情?
答案 0 :(得分:6)
getNString
。看起来你的司机太老了。
答案 1 :(得分:1)
您的主键是什么类型的? 我遇到了与你描述的完全相同的问题,那就是:我可以使用经典的getString()方法检索存储为 NVARCHAR 的数据但是更新不起作用,即使设置了 sendStringParametersAsUnicode 选项 true ...直到我将主键从NVARCHAR更改回VARCHAR。现在它对我有用。 更新实际上没有产生任何错误,只是看起来无法找到主键,因此没有发生任何事情...... 尽管如此,我希望能够在某些字段中使用unicode存储而无需将 sendStringParametersAsUnicode 选项设置为 true ,但我认为这是不可能的,除非也许通过键入相关列作为byte []而不是NVARCHAR并使用setBytes()方法设置它们(如建议的here/)