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

标签 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)

数据库管理器.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());
    }
}
}

最佳答案

检查

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

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

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

关于java - 数据库 - [Microsoft][ODBC 驱动程序管理器] 未找到数据源名称且未指定默认驱动程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20208151/

相关文章:

vb.net - 如何在VB.net中连接OLEDB和ODBC而不使用多个对象

java - 我如何处理允许使用带有 Java 的 Selenium Webdriver 的 firefox 插件的弹出窗口

sql - 两个查询的完全连接

mysql - SQL 查询从 WordPress 数据库中删除重复的帖子元

odbc - 为什么 ODBC 很慢?

c++ - C/C++ API ODBC 进程 ID

java - 线程池中的代码运行速度比非线程慢得多

java - Groovy/Grails - Jollyday CalenderUtil - 无方法签名

java - Jsoup 尝试测试 javascript 链接

mysql - CASE 不工作并在运行查询时显示 NULL 值