2

Java アプリケーションから dbf テーブルをクエリしようとしています。このスレを参考にしました

ODBC データ ソース アドミニストレータを使用してシステム データ ソースを作成し、データ ソース名を VFPDS に設定し、データベース タイプを .DBC に設定し、.dbc ファイルへのパスを設定しました。

以下は私のJavaコードです:

import javax.swing.* ;
import java.awt.* ;
import java.awt.event.* ;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.SQLWarning;
import java.sql.Statement;
// Import custom library containing myRadioListener
import java.sql.DriverManager;

public class testodbc {

public static void main( String args[] )
{
    try
    {
        // Load the database driver
        Class.forName( "sun.jdbc.odbc.JdbcOdbcDriver" ) ;

        // Get a connection to the database
        Connection conn = DriverManager.getConnection( "jdbc:odbc:VFPDS" ) ;

        // Print all warnings
        for( SQLWarning warn = conn.getWarnings(); warn != null; warn = warn.getNextWarning() )
        {
            System.out.println( "SQL Warning:" ) ;
            System.out.println( "State  : " + warn.getSQLState()  ) ;
            System.out.println( "Message: " + warn.getMessage()   ) ;
            System.out.println( "Error  : " + warn.getErrorCode() ) ;
        }

        // Get a statement from the connection
        Statement stmt = conn.createStatement() ;

        // Execute the query
        ResultSet rs = stmt.executeQuery( "SELECT * FROM pmsquoteh" ) ;//code crashes here

        // Loop through the result set
        while( rs.next() )
            System.out.println( rs.getString(1) ) ;

        // Close the result set, statement and the connection
        rs.close() ;
        stmt.close() ;
        conn.close() ;
    }
    catch( SQLException se )
    {   se.printStackTrace();
        System.out.println( "SQL Exception:" ) ;

        // Loop through the SQL Exceptions
        while( se != null )
        {   se.printStackTrace();
            System.out.println( "State  : " + se.getSQLState()  ) ;
            System.out.println( "Message: " + se.getMessage()   ) ;
            System.out.println( "Error  : " + se.getErrorCode() ) ;

            se = se.getNextException() ;
        }
    }
    catch( Exception e )
    {
        System.out.println( e ) ;
    }
}
}

私はこの例外を得ました:

java.sql.SQLException: [Microsoft][ODBC Visual FoxPro Driver]Not a table.
at sun.jdbc.odbc.JdbcOdbc.createSQLException(Unknown Source)
at sun.jdbc.odbc.JdbcOdbc.standardError(Unknown Source)
at sun.jdbc.odbc.JdbcOdbc.SQLExecDirect(Unknown Source)
at sun.jdbc.odbc.JdbcOdbcStatement.execute(Unknown Source)
at sun.jdbc.odbc.JdbcOdbcStatement.executeQuery(Unknown Source)
at UsingButtons.main(testodbc.java:38)

SQL Exception:
State  : S0002
Message: [Microsoft][ODBC Visual FoxPro Driver]Not a table.
Error  : 123

テーブル pmsquoteh がデータベースに存在し、私のマシンは 64 ビット マシンであると確信しています。私は何を間違っていますか?具体的な回答をいただければ幸いです。

4

3 に答える 3

0

Windows 7 で jdbc-odbc ブリッジを使用して FoxPro テーブルにアクセスできましたが、いくつかの手順が必要でした。VFP ドライバーは既にインストールされていますが、どこからダウンロードしたか覚えていないため、そのリンクがありません。

jbdc:odbc の例からコードをコピーしました: http://www.java2s.com/Code/Java/Database-SQL-JDBC/SimpleexampleofJDBCODBCfunctionality.htm

DriverManager.getConnection メソッドはデータベース URL を取ります。URL を作成するには、ODBC マネージャーを使用する必要があります。残念なことに、コントロール パネルからアクセスできる ODBC マネージャーは、64 ビット データ ソースに対してしか機能しませんでした。私は 64 ビットの foxpro ドライバーを認識していません。

32 ビット DSN を生成するには、32 ビット ODBC マネージャー (odbcad32.exe) を実行する必要があります。私のマシンにはいくつかのコピーがありました。C:\Windows\SysWOW64 から実行しました。[システム DSN] タブに移動し、Microsoft Visual Foxpro ドライバーを選択します。[完了] をクリックすると、データ ソース名、説明、および FoxPro データベースまたはテーブルへのパスを求めるダイアログが表示されます。.dbc または空きテーブル ディレクトリに接続するかどうかも指定する必要があります。あなたのエラー メッセージを見ると、DSN で選択したオプションが間違っていたのではないかと思います。

getConnection メソッドに渡したデータベース URL は「jdbc:odbc:mydsnname」でした。

これを実行した後、エラーを受け取りました:

[Microsoft][ODBC Driver Manager] 指定された DSN には、ドライバーとアプリケーションの間のアーキテクチャの不一致が含まれています

これは、32 ビット DSN で 64 ビット JVM を使用していたためです。32 ビット JVM をダウンロードし、それを使用してサンプル クラスを実行することができました。

64 ビット JVM で 32 ビットとして実行するように設定できるスイッチがあるかどうかはわかりません。

于 2013-12-20T15:52:49.580 に答える
0

ここからJDBCドライバーを使用しました:

http://www.csv-jdbc.com/relational-junction/jdbc-database-drivers-products/new-relational-junction-dbf-jdbc-driver/

私にとってはうまくいきます。これまでのテスト (約 1 時間) では、MEMO ファイルを読み取り、DBC を含むテーブルまたは空き DBF のいずれにも問題がないようです。

このドライバーの価格は不明です。VFP は時代遅れではないため、クライアントはおそらく最大 $100 しか支払うことはありません。

于 2016-02-13T14:16:00.253 に答える
0

過去 6 か月間、問題なく javadbf-0.4.0.jar を使用しています。Java クラスとメイン プログラムを投稿します。

package foxtablereader.src;

import java.sql.Connection;
import java.sql.SQLException;
import sun.jdbc.rowset.CachedRowSet;

/**
 *
 * @author kalimk
 */
public class DbfMain {

    static CachedRowSet crs;

    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) throws SQLException {

       
        DbfConnection foxconn = new DbfConnection();
        Connection connection = null;
                
        String inputTablePath = "c:\\vfp_table\\";
        connection = foxconn.connection(inputTablePath);

        String query = "SELECT * FROM TrigExport2.dbf ";

        crs = foxconn.select(query, connection);
        //crs = ft.query(query, inputTablePath);
        System.out.println(" Size " + crs.size());
        while (crs.next()) {
            System.out.println("DESC " + crs.getString("Serialnum") + " " + crs.getString("cmailcode"));
        }

        inputTablePath = "C:\\sourcecode\\FoxTableReader\\";
        connection = foxconn.connection(inputTablePath);
        query = "SELECT * FROM TrigExports.dbf ";
        crs = foxconn.select(query, connection);

        System.out.println(" Size " + crs.size());

        int z = 1;
        while (crs.next()) {
            System.out.println(z++ + "  " + crs.getString("Serialnum") + " " + crs.getString("cmailcode"));
        }

        inputTablePath = "C:\\sourcecode\\FoxTableReader\\";
        connection = foxconn.connection(inputTablePath);
        String queryinsert = "insert into Mcdesc (Desc,Mailcode,Del_type,Column1) values ('Kalim','KHAN', 'ERUM','KHAN')";
        foxconn.insertUpdate(queryinsert, connection);

        inputTablePath = "C:\\sourcecode\\FoxTableReader\\";
        connection = foxconn.connection(inputTablePath);
        String queryupdate = "update  Mcdesc set  Column1= 'Sadiqquie'  where Desc = 'Kalim'";
        foxconn.insertUpdate(queryupdate, connection);
    }

}


package foxtablereader.src;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.Properties;
import java.util.logging.Level;
import java.util.logging.Logger;
import sun.jdbc.rowset.CachedRowSet;

/**
 *
 * @author kalimk
 */
public class DbfConnection {

    public Connection connection(String inputTablePath) throws SQLException {

        Connection con = null;
        //String jdbURL = "jdbc:DBF:/C:\\vfp_table\\";
        String jdbURL = "jdbc:DBF:/" + inputTablePath;
        Properties props = new Properties();
        props.setProperty("delayedClose", "0");

        try {

            Class.forName("com.caigen.sql.dbf.DBFDriver");

            try {

                con = DriverManager.getConnection(jdbURL, props);

            } catch (SQLException ex) {
                Logger.getLogger(DbfConnection.class.getName()).log(Level.SEVERE, null, ex);
            }

        } catch (ClassNotFoundException ex) {
            Logger.getLogger(DbfConnection.class.getName()).log(Level.SEVERE, null, ex);
        }

        return con;
    }

    public CachedRowSet select(String cQuery, Connection con) {
        CachedRowSet crs = null;
        try {

            Statement stmt = con.createStatement();
            ResultSet rs = stmt.executeQuery(cQuery);
            crs = new CachedRowSet();
            crs.populate(rs);
            stmt.close();
        } catch (Exception e) {
            System.out.println(e.getMessage());
            e.printStackTrace();
        }
        return crs;
    }

    public boolean insertUpdate(String cQuery, Connection con) {
        boolean crs = false;
        try {

            PreparedStatement pStmnt = con.prepareStatement(cQuery);
            crs = pStmnt.execute();
            pStmnt.close();
        } catch (Exception e) {
            System.out.println(e.getMessage());
            e.printStackTrace();
        }
        return crs;
    }

    public int insertUpdateCount(String cQuery, Connection con) {

        int count = 0;
        try {

            Statement stmt = con.createStatement();
            count = stmt.executeUpdate(cQuery);
            System.out.println("Number of rows updated in database =  " + count);
            stmt.close();
        } catch (Exception e) {
            System.out.println(e.getMessage());
            e.printStackTrace();
        }
        return count;
    }

    public int insertUpdateCount2(String cQuery, Connection con) {

        int count = 0;
        boolean crs = false;
        try {

            PreparedStatement pStmnt = con.prepareStatement(cQuery);
            count = pStmnt.executeUpdate(cQuery);
            pStmnt.close();
        } catch (Exception e) {
            System.out.println(e.getMessage());
            e.printStackTrace();
        }
        return count;
    }

    public static void DBDisconnect(Connection DBCon) {
        try {

            if (DBCon != null) {
                DBCon.close();
            }
        } catch (SQLException e) {
            System.out.println(e.toString());
        } finally {
            try {

                DBCon.close();
                //System.err.println("Fimally is always executed");
            } catch (SQLException ex) {
                Logger.getLogger(DbfConnection.class.getName()).log(Level.SEVERE, null, ex);
            }
        }
    }

}
于 2020-09-04T15:40:21.597 に答える