数据库 - [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