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

Posted

技术标签:

【中文标题】数据库 - [Microsoft][ODBC Driver Manager] 未找到数据源名称且未指定默认驱动程序【英文标题】:Database - [Microsoft][ODBC Driver Manager] Data source name not found and no default driver specified 【发布时间】:2013-11-26 03:51:53 【问题描述】:

我在尝试运行我的数据库程序时收到以下错误消息。这是我所了解的文件之一。

提前感谢您的帮助!

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());
    


【问题讨论】:

检查这是否有帮助:***.com/questions/19334723/… 此外,您必须提供 Db 的完整路径,而不是使用 Db 名称,例如C:\\test\\Db\\WebsiteDatabase.mdb 那行不通。仍然得到同样的错误。 【参考方案1】:

检查

    您已安装 MS Access 驱动程序

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

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

【讨论】:

看起来像是 64 位 JVM。我如何获得 32 位? 是的,看起来只有 *.mdb 的第一个字符串适用于 32 位 JVM,而带有 *.mdb 和 *.accdb 的后者适用于 64 位驱动程序。请注意,与上面的示例不同,我的代码前面都有 *。【参考方案2】:

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

    从here下载64位访问驱动。 运行安装程序,然后重新启动计算机。 转到开始 -> 控制面板 -> 管理工具 ->(数据源)ODBC -> 系统 DSN。 点击“添加”按钮。 选择“Microsoft Access 驱动程序 (*.mdb)” 提供任意数据源名称,然后点击“创建”。 选择你想要你的数据库的目录(注意:该目录应该和你的Java程序的源目录相同) 启动命令提示符以执行 64 位数据库连接。 复制C:\WINDOWS\SYSWOW64.exe到你电脑的运行对话框,然后他们开始编译和执行你的数据库程序。

【讨论】:

【参考方案3】:

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

【讨论】:

【参考方案4】:

如果您使用的是 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”

【讨论】:

以上是关于数据库 - [Microsoft][ODBC Driver Manager] 未找到数据源名称且未指定默认驱动程序的主要内容,如果未能解决你的问题,请参考以下文章

[Microsoft][ODBC 驱动程序管理器] 未发现数据源名称并且未指定默认驱动程序怎么解决?

使用 ODBC 将数据从 Microsoft SQL 迁移到 Elasticsearch

[Microsoft][ODBC 驱动程序管理器] 未发现数据源名称并且未指定默认驱动程序

[Microsoft][ODBC 驱动程序管理器] 未发现数据源名称并且未指定默认驱动程序

Postgresql odbc driver error c# [IM002] [Microsoft][ODBC Driver Manager] Data source name not found

将节点 odbc 与 Microsoft Access 一起使用