6

MSAccessデータベースと通信する必要があるデスクトップアプリを構築しています。ここで、デスクトップアプリを使用するすべてのコンピューターでデータベースのDSNを登録する場合を除いて、DSNなしでデータベースに接続する方法が必要です。

私はたくさん検索し、接続文字列を作成する方法に関するいくつかの有用なリンクを見つけました。それに基づいて、それに基づいてプログラムを変更しようとしましたが、成功しませんでした。以下のコードは失敗します。getConnectionの文字列を「jdbc:odbc:sampleDB」に切り替えると機能しますが、DSNを使用しており、達成したいことではありません。

Javaで接続文字列を記述して使用し、MS AccessデータベースへのDSNレス接続を確立するにはどうすればよいですか?

private Connection setupConnection() throws ClassNotFoundException,
        SQLException {
    Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
    Connection con = DriverManager.getConnection("Driver={Microsoft Access Driver (*.mdb)} &_ Dbq=c:\\as\\sampleDB.mdb");
    return con;
}

追加:DSN接続を使用して私が求めていたものを達成する方法を誰かが考えている場合は、喜んでそれを聞いてくれることも指摘したいと思います。

4

2 に答える 2

6

JDBC接続文字列は次のjdbc:ように始まります。

jdbc:odbc:Driver={Microsoft Access Driver (*.mdb)};DBQ=c:\\Nwind.mdb

だから試してみてください:

   Connection con = DriverManager.getConnection("jdbc:odbc:Driver={Microsoft Access Driver (*.mdb)};Dbq=c:\\as\\sampleDB.mdb");

DSNを構成すると、より単純な接続文字列を使用してDSNに接続できます。jdbc:odbc:[alias]例:

jdbc:odbc:northwind
于 2011-02-16T13:24:27.633 に答える
1

私もこの問題を抱えていて、ここやさまざまなフォーラムで多くの提案を試しました。最後に、ある場所から接続に成功したスニペットを発見し、これらの投稿の多くが機能しない理由も説明しています. http://www.coderanch.com/t/295299/JDBC/databases/jdbc-odbc-DSN-connection-MSを参照してください。

問題は、 jdbc:odbc:;Driver= のように、odbc の最後にあるコロンの後にセミコロンが必要なことです。これは、構文が jdbc:odbc:dsn; であると述べられている JdbcOdbc ブリッジに関する Oracle ドキュメントを読んだ後、意味がありました。attributes....... DSN を提供していないため、; で終了する必要があります。属性を追加する前に。

Windows 7 Ultimate 32 ビット マシンでさまざまな接続文字列を使用して実行したテストを以下に示します。

        driver= (Driver)Class.forName("sun.jdbc.odbc.JdbcOdbcDriver").newInstance();
        //jdbc:odbc:Driver={Microsoft Access Driver (*.mdb, *.accdb)};DBQ=  does lookup to ODBC.ini to find matching driver


            try {
            connstr= "jdbc:odbc:;Driver={Microsoft Access Driver (*.mdb, *.accdb)};DBQ=" + fileURI;  //64 bit ?? (*.mdb,*.accdb)  
            conn= DriverManager.getConnection(connstr, "", ""); 
            stmt= conn.createStatement();
        }
        catch (Exception e){}
        try {
            connstr= "jdbc:odbc:;Driver={Microsoft Access Driver (*.mdb)};DBQ=" + fileURI;  //64 bit ?? (*.mdb,*.accdb)  
            conn1= DriverManager.getConnection(connstr, "", ""); 
            stmt1= conn1.createStatement();
            dbmeta1=conn1.getMetaData();
        }
        catch (Exception e){}
        try {
            connstr= "jdbc:odbc:MS Access Database;DBQ=" + fileURI;  //64 bit ?? (*.mdb,*.accdb)  
            conn2= DriverManager.getConnection(connstr, "", ""); 
            stmt2= conn2.createStatement();
            dbmeta2=conn2.getMetaData();
        }
        catch (Exception e){}
        try {
            connstr= "jdbc:odbc:Driver={Microsoft Access Driver (*.mdb)};DBQ=" + fileURI;  //64 bit ?? (*.mdb,*.accdb)  
            conn3= DriverManager.getConnection(connstr, "", ""); 
            stmt3= conn3.createStatement();
            dbmeta3=conn3.getMetaData();
        }
        catch (Exception e){}

接続がヌルであるため、stmt1 と stmt3 はヌルです。stmt と stmt2 が機能します。stmt2 は、IBM Tivoli のドキュメントで見つけた接続文字列を使用します。「MS Access データベース」は、私のコンピュータのユーザー DSN として ODBC レジストリで有効なタイトルであるため、機能します。

于 2013-07-05T14:02:30.130 に答える