もともとコーディングは、Delphiで、もちろん、読み取りを選択し、書き込み中国人が正常であるされていないときにデータベースを構築し、Firebirdのデータベースを使用してデルファイによって開発されたシステムがあります。それはリモート同期であるため、元のシステムは、現在、他のデータベースからのデータを同期する機能を追加する必要があり、データ同期量が大きくない、1日4回の頻度は、埋め込まれた桟橋を使用する簡単なハンドラは、この機能を実現書きますクライアントは、データのアップロードのためにHTTPClientを使用しています。クライアントとサーバの間の双方向の認証とHTTPSモード。
破片の食事の走り書きは、最終的には、ベース・コード、実行、データオーバーめまい、同期を終えFirebirdのを書いて、実際に文字化けします。マニュアルによるFirebirdのJDBCドライバjaybirdは、追加するJDBC接続文字列?LC_CTYPE = GBK役に立たない、まだ文字化けを言います。
データベースに書き込むための正しい文字、私は知らない別の方法が、緊急の次の方法を実証するためのテストを繰り返した後、何かのために良いです、主なアイデアは、のprepareStatementを使用することで、フィールドの内容は、方法パラメータですべての文字列を書かれていますフィールド、メソッドをsetStringを、代わりにsetBytes様式、GBKとの変換パラメータを使用しません。
コードスニペット:
class.forName("org.firebirdsql.jdbc.FBDriver");
Connection conn = DriverManager.getConnection(
"jdbc:firebirdsql://localhost:3050/D:/db/card.fdb",
"sysdba", "masterkey");
conn.setAutoCommit(false);
PreparedStatement pstmt = conn.prepareStatement("insert into CARDLOGCOPY values(?, ?, ?, ?, ?)");
try {
//循环插入新记录
for(int i = 0, n = records.size(); i < n; ++i) {
JSONArray record = records.getJSONArray(i);
for(int j = 0, m = record.size(); j < m; ++j) {
Object val = record.get(j);
if(val instanceof String)
pstmt.setBytes(j + 1, ((String)val).getBytes("GBK"));
else if(val instanceof Date)
pstmt.setString(j + 1, String.format("%tF %<tT", val));
else
pstmt.setObject(j + 1, val);
}
pstmt.execute();
pstmt.clearParameters();
}
conn.commit();
}
catch (Exception e) {
rollback(conn); //回滚事务
logger.error("数据库操作出错,事务回滚.", e);
throw e;
}
finally {
pstmt.close;
conn.close;
}
ます。https://my.oschina.net/kivensoft/blog/549365で再現