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()か? 多分それは同じ関数を介して両方VarCharを取得しますか?NVarChargetString()

編集:

関連する 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 などのメソッドを使用しました。しかし、私はまだ同じ問題を抱えています... Unicode に setString() を使用すると、??? が挿入されます。私のデータベースに。setNString() を使用すると、この投稿の上部で getNString を実行していたときに受け取ったのと同じエラーが表示されます... これは正気ではありません... 実際に Unicode をサポートしていない場合、このドライバーがどうしてそんなに人気になるのでしょうか? ?? ここで何が欠けていますか?このサイトでは、NVARCHAR などをサポートしていると言っています。

4

2 に答える 2

6

getNStringJava 1.6/JDBC 4.0 で追加されました。ドライバーが古すぎるようです。

于 2012-09-25T05:32:04.987 に答える
1

あなたの主キーはどのタイプですか?説明されているのとまったく同じ問題がありました。つまり、従来の getString() メソッドを使用してNVARCHARとして保存されたデータを取得できましたが、 sendStringParametersAsUnicodeオプションをtrueに設定しても更新は機能しませんでした... 変更するまでNVARCHAR から VARCHAR への主キー。今ではうまくいきます。更新は実際にはエラーを生成しませんでした。主キーが見つからなかったため、何も起こらなかったようです...それでも、sendStringParametersAsUnicodeオプションをtrueに設定せずに、一部のフィールドにUnicodeストレージを使用できることを望んでいました、しかし、関連する列を NVARCHAR の代わりに byte[] として入力し、setBytes() メソッドを使用して設定しない限り、それは不可能であるという印象を受けています (ここで提案されているように/ )

于 2013-06-10T08:31:11.157 に答える