jTDS JDBC驱动程序:getNString()引发错误

6

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

我希望这里已经有人尝试过与您的问题相关的内容。 - thar45
@陌生人...不是我的问题..也不是真正相关的。在那个主题中,楼主对NVARCHAR列等一切都没什么了解。我很熟悉它,实际上正在使用一个NVARCHAR列。我非常熟练地掌握SQL,并且已经写了多年基于SQL的应用程序.. 我遇到的问题是jTDS驱动程序.. 它似乎不起作用,至少不是人们期望的方式。 - Matt
2个回答

6

getNString是在Java 1.6/JDBC 4.0中添加的。看起来你的驱动程序太旧了。


不要这样假设。事实上,我在这里得到了最新版本(1.2.6):http://sourceforge.net/projects/jtds/files/jtds/ - Matt
此外,你显然没有读完整篇文章。getString() 函数似乎对 Unicode 工作正常,而我现在真正遇到的问题是通过这个驱动程序插入 Unicode 数据。 - Matt
1
如果您阅读版本1.2.6的发布说明(或主页),您会看到“这是JDBC 3.0的完整实现,它通过了J2EE 1.3认证”。然后,如果您查看net.sourceforge.jtds.jdbc.JtdsResultSet的源代码,您会发现虽然getNString已经实现,但代码只包含// TODO Auto-generated method stubthrow new AbstractMethodError();。我确实阅读了整篇文章,但之后进行了三次编辑。 - Philippe Marschall

1
你的主键类型是什么? 我遇到了和你描述的完全相同的问题,即:我可以使用经典的getString()方法检索存储为NVARCAHR的数据,但更新无法工作,即使将sendStringParametersAsUnicode选项设置为true…直到我将主键从NVARCAHR更改回VARCHAR。现在对我来说可以工作了。 更新实际上没有产生任何错误,只是似乎找不到主键,因此什么也没有发生... 尽管如此,我仍希望能够在不将sendStringParametersAsUnicode选项设置为true的情况下使用unicode存储某些字段,但我有一种印象,除非将相关列键入为byte[]并使用setBytes()方法进行设置(如建议here/),否则不可能。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接