【问题标题】:jTDS JDBC Driver: getNString() throws errorjTDS JDBC 驱动程序:getNString() 抛出错误
【发布时间】:2012-09-16 12:18:17
【问题描述】:

我正在使用 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(index)时,它工作正常。所以我猜jTDS似乎对所有文本类型都使用了getString。奇怪的是它不会为 getNString(index) 函数抛出某种不受支持的异常。

所以,现在我们剩下的问题是如何将 unicode 数据插入到 NVARCHAR 列中。这里肯定有人有过这方面的经验吗?

编辑 3

我将代码更改为在每个方法中使用准备好的语句,而不是尝试使用批处理并使用 setInt、setString 等方法。但是,我仍然遇到同样的问题......如果我将 setString() 用于 unicode,它会插入 ???进入我的数据库。如果我使用 setNString(),那么我会收到与我在执行 getNString 时在这篇文章顶部收到的相同的错误......这太疯狂了......如果这个驱动程序实际上不支持 unicode,它怎么会变得如此受欢迎??我在这里想念什么?该网站确实说它支持 NVARCHAR 等。所以为了使这项工作,我需要做什么疯狂的不直观的事情???

【问题讨论】:

  • 我希望here 已经有人尝试过与您的问题相关的尝试
  • @Stranger... 不是我的问题.. 也不是很相关。在那个线程中,OP 对 NVARCHAR 列等一无所知。我非常了解,实际上正在使用 NVARCHAR 列。我对 SQL 非常熟悉,并且多年来一直在编写基于 SQL 的应用程序。我遇到的问题是 jTDS 驱动程序。它似乎无法正常工作,至少不是人们期望的那样。

标签: java jdbc jtds


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    getNString 是随 Java 1.6/JDBC 4.0 添加的。看来你的司机太老了。

    【讨论】:

    • 不要假设。事实上,我在这里得到了最新版本(1.2.6):sourceforge.net/projects/jtds/files/jtds
    • 此外,您显然没有阅读整篇文章。似乎 getString() 对 Unicode 有效,而我现在遇到的主要问题实际上是通过此驱动程序插入 unicode 数据。
    • 如果您阅读 1.2.6 版本的发行说明(或主页),您会看到“它是 JDBC 3.0 的完整实现,它通过了 J2EE 1.3 认证”。如果您再查看net.sourceforge.jtds.jdbc.JtdsResultSet 的源代码,您会发现虽然实现了getNString,但代码仅由// TODO Auto-generated method stubthrow new AbstractMethodError(); 组成。我确实阅读了整篇文章,但随后进行了三处编辑。
    猜你喜欢
    • 2014-02-04
    • 2017-01-09
    • 2013-08-12
    • 2017-05-05
    • 2011-12-12
    • 2018-09-29
    • 2013-10-24
    • 2013-08-27
    • 2014-10-24
    相关资源
    最近更新 更多