数据库 - [Microsoft] [ODBC驱动程序管理器]未找到数据源名称且未指定默认驱动程序

时间:2013-11-26 03:51:53

标签: java sql odbc

当我尝试运行数据库程序时,我收到以下错误消息。这是我从我理解的内容中获得问题的文件之一。

提前感谢您的帮助!

java.sql.SQLException: [Microsoft][ODBC Driver Manager] Data source name not found and no default driver specified
    at sun.jdbc.odbc.JdbcOdbc.createSQLException(JdbcOdbc.java:6964)
    at sun.jdbc.odbc.JdbcOdbc.standardError(JdbcOdbc.java:7121)
    at sun.jdbc.odbc.JdbcOdbc.SQLDriverConnect(JdbcOdbc.java:3080)
    at sun.jdbc.odbc.JdbcOdbcConnection.initialize(JdbcOdbcConnection.java:323)
    at sun.jdbc.odbc.JdbcOdbcDriver.connect(JdbcOdbcDriver.java:174)
    at java.sql.DriverManager.getConnection(DriverManager.java:571)
    at java.sql.DriverManager.getConnection(DriverManager.java:233)
    at data.DbManager.getAccessDbConnection(DbManager.java:201)
    at data.DbManager.<init>(DbManager.java:26)
    at user.Frame.<init>(Frame.java:10)
    at user.MainP8.main(MainP8.java:16)

DbManager.java

package data;

import java.sql.*;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.swing.JFileChooser;
import javax.swing.JOptionPane;

public class DbManager {

//Add to beginning of MS Access DB URL
private  String ACCESS_DB_URL_PREFIX =
    "jdbc:odbc:Driver={Microsoft Access Driver (*.mdb)};DBQ=";
//Add to end of MS Access DB URL
private final String ACCESS_DB_URL_SUFFIX = ";DriverID=22;READONLY=false;}";
//File name of database
private final String MY_DB_NAME = "WebsiteDatabase.mdb";

private String fileName;
private Connection myConnection;

//constructor
public DbManager() {
    try {
        myConnection = getAccessDbConnection(MY_DB_NAME);
        myConnection.setAutoCommit(true);
        DatabaseMetaData md = myConnection.getMetaData();
    } catch (SQLException ex) {
        Logger.getLogger
                    (DbManager.class.getName()).log(Level.SEVERE, null, ex);
        JOptionPane.showMessageDialog(null,
            "The database could not be located. Please select the database"
            + " file you wish to connect to.",
            "Database Error", JOptionPane.ERROR_MESSAGE);
        JFileChooser chooser = new JFileChooser();
        chooser.showOpenDialog(chooser);
        fileName = chooser.getSelectedFile().toString();
        try {
            myConnection = getAccessDbConnection(fileName);
            myConnection.setAutoCommit(true);
            DatabaseMetaData md = myConnection.getMetaData();
        } catch (SQLException ex1) {
            Logger.getLogger
                   (DbManager.class.getName()).log(Level.SEVERE, null, ex1);
            JOptionPane.showMessageDialog(null,
                "The database could not be opened", "Fatal Error",
                JOptionPane.ERROR_MESSAGE);
        }
    }
}

//"destructor" method to release the database connection
public void close() {
    try {
        myConnection.close();
    } catch (SQLException ex) {
        Logger.getLogger
                    (DbManager.class.getName()).log(Level.SEVERE, null, ex);
    }
}

//public methods to access the database
public void insert(Website w) throws SQLException {
    String sql;
    //build SQL statement
    sql = "INSERT INTO Websites";
    sql += " (COMPANY_NAME, COMP_ASSETS, YR_FOUNDED, URL_ADD, ALEXA_RANK)";
    sql += " VALUES (";
    sql += "'" + w.getCompName() + "',";
    sql += w.getAssets() + ",";
    sql += " #" +w.getFounded() + "#,";
    sql += " '" + w.getUrl() + "',";
    sql += w.getAlexaRank() + ");";
            insertRecord(sql);
}
public void update(Website w) throws SQLException {
    String sql;
            //SimpleDateFormat date = new SimpleDateFormat("yyyy-MM-dd");
            //date.parse(w.getFounded());
//                "#"
    //build SQL statement
    sql = "UPDATE WebsiteS SET";
    sql += " COMPANY_NAME = '" + w.getCompName() + "',";
    sql += " COMP_ASSETS = " + w.getAssets() + ",";
    sql += " YR_FOUNDED = #" + w.getFounded() + "#,";
    sql += " URL_ADD = '" + w.getUrl() + "',";
            sql += " ALEXA_RANK = " + w.getAlexaRank() ;

    sql += " WHERE ID = " + w.getId() + ";";
    updateRecord(sql);
}
public void delete(Website w) throws SQLException {
    String sql;
    sql = "DELETE * FROM Websites WHERE ID = " + w.getId() + ";";
    deleteRecord(sql);
}
public String[] getWebsiteList() throws SQLException {
    String strSql = "SELECT COMPANY_NAME FROM Websites;";
    PreparedStatement ps = myConnection.prepareStatement(strSql,
        ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_READ_ONLY);

    ResultSet rs = ps.executeQuery();

    rs.last();
    int rowCount = rs.getRow();
    String[] items = new String[rowCount];

    try {
        rs.beforeFirst();
        int i = 0;
        while(rs.next()) {
            items[i] = rs.getString("COMPANY_NAME");
            i++;
        }
    } catch (Exception ex){
        JOptionPane.showMessageDialog(null,
            "getWebsiteList: Unable to read website names: " + ex.getMessage());
        System.out.println(ex.getStackTrace());
        System.out.println(ex.getLocalizedMessage());
    }

    return items;
}
public int[] getWebsiteIds() throws SQLException {
    int[] id;
    String strSql = "SELECT ID FROM Websites;";
    PreparedStatement ps = myConnection.prepareStatement(strSql,
        ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_READ_ONLY);

    ResultSet rs = ps.executeQuery();

    rs.last();
    int rowCount = rs.getRow();
    id = new int[rowCount];

    try {
        rs.beforeFirst();
        int i = 0;
        while(rs.next()) {
            id[i] = rs.getInt("ID");
            i++;
        }
    } catch (Exception ex) {
        JOptionPane.showMessageDialog(null,
            "getWebsiteIDs: Unable to read Website IDs: " + ex.getMessage());
        System.out.println(ex.getStackTrace());
        System.out.println(ex.getLocalizedMessage());
    }

    return id;
}
public Website getWebsite(int wId) throws SQLException {
    String[] rec;
    String strSql = "SELECT * FROM Websites WHERE ID = " + wId + ";";
    Website website = null;
    PreparedStatement ps = myConnection.prepareStatement(strSql,
        ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_READ_ONLY);
    ResultSet rs = ps.executeQuery();
    ResultSetMetaData rsMeta = rs.getMetaData();
    int columns = rsMeta.getColumnCount();
    rec = new String[columns];
    try {
        rs.beforeFirst();
        while(rs.next()) {
            for (int i = 0; i < columns; i++) {
                rec[i] = rs.getString(i + 1);
            }
        }

        //use the data to build the Website object
        website = new Website(
            //Integer.parseInt(rec[0]),
            rec[0],
            rec[1],
            rec[2],
            rec[3],
                            rec[4],
                            rec[5]
        );
    } catch (SQLException ex) {
        System.out.println(ex.getStackTrace());
        System.out.println(ex.getLocalizedMessage());
    }
    return website;
}

//private method to establish database connection
private Connection getAccessDbConnection(String fileName)
                                                       throws SQLException {
    try {
        Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
    } catch (ClassNotFoundException ex) {
        System.err.println("JdbcOdbc Bridge Driver not Found");
        JOptionPane.showMessageDialog(null, ex.getMessage(), "Driver Error",
            JOptionPane.ERROR_MESSAGE);
        System.exit(0);
    }

    String databaseURL = ACCESS_DB_URL_PREFIX + fileName
                                                     + ACCESS_DB_URL_SUFFIX;
    return DriverManager.getConnection(databaseURL);
}

//private methods to access the database
private void insertRecord(String strSql) throws SQLException {
    Statement st = myConnection.createStatement();
    try {
        st.execute(strSql);
    } catch (SQLException ex) {
        System.err.println(ex.getStackTrace());
        System.err.println(ex.getMessage());
        System.err.println(ex.getLocalizedMessage());
    }
    st.close();
}
private void updateRecord(String strSql) throws SQLException {
    //use prepared statement to ensure that the result set is editable
    PreparedStatement ps = myConnection.prepareStatement(strSql,
        ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_UPDATABLE);
    try {
        ps.execute();
    } catch (SQLException ex) {
        System.err.println(ex.getStackTrace());
        System.err.println(ex.getMessage());
        System.err.println(ex.getLocalizedMessage());
    }
}
private void deleteRecord(String strSql) throws SQLException {
    PreparedStatement ps = myConnection.prepareStatement(strSql,
        ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_UPDATABLE);
    try {
        ps.execute();
    } catch (SQLException ex) {
        System.err.println(ex.getStackTrace());
        System.err.println(ex.getMessage());
        System.err.println(ex.getLocalizedMessage());
    }
}
}

4 个答案:

答案 0 :(得分:6)

检查

  1. 您已安装MS Access驱动程序

  2. 您使用的描述性字符串是正确的,“Microsoft Access驱动程序( .mdb)”必须准确,请检查ODBC控制面板应用程序中的“驱动程序”选项卡,例如我的(< /em>.mdb,* .accdb)

  3. 检查您是不是将64位JVM与32位驱动程序混合使用,反之亦然。

答案 1 :(得分:3)

如果您使用的是32位操作系统,那么我认为不存在此类问题,但如果您使用的是64位操作系统,请按照以下步骤操作:

  1. here下载64位访问驱动程序。
  2. 运行安装程序,然后重新启动计算机。
  3. 转到开始 - &gt;控制面板 - &gt;管理工具 - &gt; (数据源)ODBC - &gt;系统DSN。
  4. 点击“添加”按钮。
  5. 选择“Microsoft Access Driver(* .mdb)”
  6. 提供任何数据源名称,然后单击“创建”。
  7. 选择您希望数据库所在的目录(注意:该目录应与Java程序的源目录目录相​​同)
  8. 启动命令提示符以执行64位数据库连接。
  9. 在计算机的运行对话框中复制C:\ WINDOWS \ SYSWOW64.exe,然后开始编译和执行数据库程序。

答案 2 :(得分:1)

当我将笔记本电脑从32位Windows XP升级到64位Windows 7时,我在我的某个网站上遇到此问题。我通过创建32位应用程序池克服了这个问题(应用程序池&gt;高级设置&gt ;启用32位应用程序= True)并以这种方式运行我的网站。即使安装了Microsoft Office,也不会安装驱动程序以进行64位站点访问。希望这有助于某人

答案 3 :(得分:0)

如果您使用的是64位操作系统,请按照以下步骤操作:

Download 64-bit access driver from http://www.microsoft.com/en-in/download/details.aspx?id=13255.

Run setup, then restart your computer.

If you are an application developer using ODBC to connect to Microsoft Office Access data, set the Connection String to “Driver={Microsoft Access Driver (*.mdb, *.accdb)};DBQ=path to mdb/accdb file”

If you are an application developer using ODBC to connect to Microsoft Office Excel data, set the Connection String to “Driver={Microsoft Excel Driver (*.xls, *.xlsx, *.xlsm, *.xlsb)};DBQ=path to xls/xlsx/xlsm/xlsb file”