我正在使用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()
吗?也许它通过相同的getString()
函数获取VarChar
和NVarChar
两者?
编辑:
相关的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(索引)时,它正常工作。所以我猜jTDS对所有文本类型都使用getString。那么奇怪的是它没有为getNString函数抛出某种不支持的异常。
现在,我们面临一个问题,如何将Unicode数据插入到NVARCHAR列中。肯定有人在这方面有经验?
编辑3
我更改了代码,使用每个方法中的预处理语句而不是尝试使用批处理,并使用setInt、setString等方法。然而,我仍然遇到同样的问题...如果我使用setString()用于Unicode,则会将???插入我的数据库。如果我使用setNString(),那么当我执行getNString时收到与本帖顶部收到的相同错误。这太疯狂了...如果它实际上不支持Unicode,那么这个驱动程序怎么可能变得如此受欢迎?我在这里遗漏了什么?该网站确实说支持NVARCHAR等,那么我需要做的疯狂、不直观的事情是什么才能使其正常工作?