在工作中我们必须处理几个MS Access mdb文件,因此我们使用Sun JVM附带的默认JdbcOdbcBridge驱动程序,并且在大多数情况下,它运行良好.
问题是,当我们必须处理一些较大的文件时,我们会遇到几次异常,并显示"无法打开更多表"的消息.我们怎么能避免这种情况?
我们已经关闭了PreparedStatements和RecordSet的所有实例,甚至将它们的变量设置为null,但即便如此,这种异常仍会继续发生.我们应该做什么?我们怎样才能避免这些讨厌的例外?这里有人知道怎么样?
是否有任何其他配置到Windows上的ODBC驱动程序,我们可以更改以避免此问题?
在Java 8中,将删除JDBC-ODBC-Bridge.典型的错误是:
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver
你知道可能的替代品吗?我找到了Easysoft.但是这个桥需要一个不在Java VM内运行的附加服务器.它是类型3驱动程序而不是类型1驱动程序.还有其他选择吗?
我尝试创建与db(MS Access 2010)连接的项目我在CodeProject上使用本教程.
import java.sql.*;
public class DbAccess
{
public static void main(String[] args)
{
try
{
Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
String database =
"jdbc:odbc:Driver={Microsoft Access Driver (*.mdb)};DBQ=myDB.mdb;";
Connection conn = DriverManager.getConnection(database, "", "");
Statement s = conn.createStatement();
// create a table
String tableName = "myTable" + String.valueOf((int)(Math.random() * 1000.0));
String createTable = "CREATE TABLE " + tableName +
" (id Integer, name Text(32))";
s.execute(createTable);
// enter value into table
for(int i=0; i<25; i++)
{
String addRow = "INSERT INTO " …
Run Code Online (Sandbox Code Playgroud) 我无法使用MS Access(sun.jdbc.odbc.JdbcOdbcDriver)在PreparedStatement上调用setNull
preparedStatement.setNull(index, sqltype).
Run Code Online (Sandbox Code Playgroud)
这有解决方法吗?对于LONGBINARY
数据类型,我尝试了以下调用,但都没有工作.
setNull(index, java.sql.Types.VARBINARY)
setNull(index, java.sql.Types.BINARY)
Run Code Online (Sandbox Code Playgroud)
java.sql.SQLException: [Microsoft][ODBC Microsoft Access Driver]Invalid SQL data type at sun.jdbc.odbc.JdbcOdbc.createSQLException(JdbcOdbc.java:6957) at sun.jdbc.odbc.JdbcOdbc.standardError(JdbcOdbc.java:7114) at sun.jdbc.odbc.JdbcOdbc.SQLBindInParameterNull(JdbcOdbc.java:986) at sun.jdbc.odbc.JdbcOdbcPreparedStatement.setNull(JdbcOdbcPreparedStatement.java:363)
到目前为止,当我不得不连接到32位Access数据库时,我只是使用32位JVM执行应用程序.但是,我现在正在开发一个需要64位JVM的应用程序,但我仍然需要连接到32位Access数据库.当我尝试连接时,我得到以下异常:
java.sql.SQLException: [Microsoft][ODBC Driver Manager] Data source name not found and no default driver specified
at sun.jdbc.odbc.JdbcOdbc.createSQLException(Unknown Source)
at sun.jdbc.odbc.JdbcOdbc.standardError(Unknown Source)
at sun.jdbc.odbc.JdbcOdbc.SQLDriverConnect(Unknown Source)
at sun.jdbc.odbc.JdbcOdbcConnection.initialize(Unknown Source)
at sun.jdbc.odbc.JdbcOdbcDriver.connect(Unknown Source)
at java.sql.DriverManager.getConnection(Unknown Source)
at java.sql.DriverManager.getConnection(Unknown Source)
Run Code Online (Sandbox Code Playgroud)
这是我的代码:
String s = "jdbc:odbc:Driver={Microsoft Access Driver (*.mdb)};DBQ=" + path;
Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
conn = DriverManager.getConnection(s, user, password);
Run Code Online (Sandbox Code Playgroud) WrappedConnectionJDK6 wrapped = (WrappedConnectionJDK6) dbStrategy.getConnection();
Connection underlyingConn = wrapped.getUnderlyingConnection();
OracleConnection oracleConn = (OracleConnection)underlyingConn;
Run Code Online (Sandbox Code Playgroud)
最后一行给出错误 -
> ERROR
> [org.apache.catalina.core.ContainerBase.[jboss.web].[default-host].[/web].[resteasy-servlet]]
> (http-/0.0.0.0:8080-1) Servlet.service() for servlet resteasy-servlet
> threw exception: org.jboss.resteasy.spi.UnhandledException:
> java.lang.ClassCastException: oracle.jdbc.driver.T4CConnection cannot
> be cast to oracle.jdbc.OracleConnection
Run Code Online (Sandbox Code Playgroud) 我试图在我的glassfish上创建具有以下属性的jdbc连接池(如下图所示).它成功连接让我觉得它运作正常.然而,在我重新启动glassfish并尝试ping池之后,我的屏幕上的白色屏幕上出现RuntimeException.不仅在我ping它时,而且当我单击任何选项卡甚至是保存和取消按钮时,它最终都会运行RuntimeException.我已经尝试了所有可能的原因并一遍又一遍地搜索网络,但结果却出现了同样的异常.请帮忙.:(
遇到RuntimeException步骤
2015-04-29T15:19:29.144+0800|SEVERE: java.lang.RuntimeException: java.lang.reflect.InvocationTargetException while attempting to process a 'beforeCreate' event for 'event132'.
at com.sun.jsftemplating.layout.descriptors.LayoutElementBase.dispatchHandlers(LayoutElementBase.java:422)
at com.sun.jsftemplating.layout.descriptors.LayoutElementBase.dispatchHandlers(LayoutElementBase.java:394)
at com.sun.jsftemplating.layout.descriptors.LayoutComponent.beforeCreate(LayoutComponent.java:348)
at com.sun.jsftemplating.layout.descriptors.LayoutComponent.getChild(LayoutComponent.java:288)
at com.sun.jsftemplating.layout.LayoutViewHandler.buildUIComponentTree(LayoutViewHandler.java:556)
at com.sun.jsftemplating.layout.LayoutViewHandler.buildUIComponentTree(LayoutViewHandler.java:551)
at com.sun.jsftemplating.layout.LayoutViewHandler.buildUIComponentTree(LayoutViewHandler.java:507)
at com.sun.jsftemplating.layout.LayoutViewHandler.buildUIComponentTree(LayoutViewHandler.java:507)
at com.sun.jsftemplating.layout.LayoutViewHandler.createView(LayoutViewHandler.java:255)
at com.sun.faces.lifecycle.RestoreViewPhase.execute(RestoreViewPhase.java:205)
at com.sun.faces.lifecycle.Phase.doPhase(Phase.java:101)
at com.sun.faces.lifecycle.RestoreViewPhase.doPhase(RestoreViewPhase.java:121)
at com.sun.faces.lifecycle.LifecycleImpl.execute(LifecycleImpl.java:198)
at javax.faces.webapp.FacesServlet.service(FacesServlet.java:646)
at org.apache.catalina.core.StandardWrapper.service(StandardWrapper.java:1682)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:344)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:214)
at com.sun.webui.jsf.util.UploadFilter.doFilter(UploadFilter.java:233)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:256)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:214)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:316)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:160)
at org.apache.catalina.core.StandardPipeline.doInvoke(StandardPipeline.java:734)
at org.apache.catalina.core.StandardPipeline.doChainInvoke(StandardPipeline.java:678)
at com.sun.enterprise.web.WebPipeline.invoke(WebPipeline.java:97)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:174)
at org.apache.catalina.connector.CoyoteAdapter.doService(CoyoteAdapter.java:415)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:282)
at com.sun.enterprise.v3.services.impl.ContainerMapper$HttpHandlerCallable.call(ContainerMapper.java:459)
at com.sun.enterprise.v3.services.impl.ContainerMapper.service(ContainerMapper.java:167)
at org.glassfish.grizzly.http.server.HttpHandler.runService(HttpHandler.java:201)
at org.glassfish.grizzly.http.server.HttpHandler.doHandle(HttpHandler.java:175)
at org.glassfish.grizzly.http.server.HttpServerFilter.handleRead(HttpServerFilter.java:235) …
Run Code Online (Sandbox Code Playgroud) 我正在Eclipse EE IDE中的Java项目中工作,我必须查询.accdb
文件.问题是当我尝试加载驱动程序然后连接到数据库时,它给我一个异常错误.
我的代码:
try{
String filePath = "//myfilepathtomydb/BLABLA/example.accdb"
Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
String url = "jdbc:odbc:Driver={Microsoft Access Driver (*.mdb, *.accdb)};DBQ=" + filePath;
Connection database = DriverManager.getConnection(url);
System.out.println("Connection sucessful");
} catch (ClassNotFoundException e){
System.err.println("Got an exception");
System.err.println(e.getMessage());
e.printStackTrace();
} catch (SQLException sqle) {
sqle.printStackTrace();
// TODO: handle exception
}
Run Code Online (Sandbox Code Playgroud)
例外:
Got an exception
sun.jdbc.odbc.JdbcOdbcDriver
java.lang.ClassNotFoundException: sun.jdbc.odbc.JdbcOdbcDriver
at java.net.URLClassLoader$1.run(URLClassLoader.java:372)
at java.net.URLClassLoader$1.run(URLClassLoader.java:361)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(URLClassLoader.java:360)
at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:308)
at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
at java.lang.Class.forName0(Native Method)
at java.lang.Class.forName(Class.java:259)
at project.Main.main(Main.java:15)
Run Code Online (Sandbox Code Playgroud)
我在64位Windows中使用32位Eclipse,并且从我读过的这种连接到数据库的方式不支持64位JRE,所以我使用的是选择的32位JRE( jdk1.8.0_05)在我的运行配置中,我在VM中使用了'-d32'参数.
显然 …
我正在使用下面的代码来获取Connection
. 我已将该c3p0
库用于连接池。
package com.dataSource.c3p0;
import java.beans.PropertyVetoException;
import java.io.IOException;
import java.sql.Connection;
import java.sql.SQLException;
import com.mchange.v2.c3p0.ComboPooledDataSource;
public class DataSource {
private static DataSource datasource;
private ComboPooledDataSource cpds;
private DataSource() throws IOException, SQLException, PropertyVetoException {
cpds = new ComboPooledDataSource();
cpds.setDriverClass("com.mysql.jdbc.Driver"); //loads the jdbc driver
cpds.setJdbcUrl("jdbc:mysql://localhost/test");
cpds.setUser("root");
cpds.setPassword("root");
// the settings below are optional -- c3p0 can work with defaults
cpds.setMinPoolSize(5);
cpds.setAcquireIncrement(5);
cpds.setMaxPoolSize(20);
cpds.setMaxStatements(180);
}
public static DataSource getInstance() throws IOException, SQLException, PropertyVetoException {
if (datasource == null) {
datasource …
Run Code Online (Sandbox Code Playgroud) 我有数据库,其中一些名称是用立陶宛字母写的,但是当我尝试使用 java 获取它们时,它会忽略立陶宛字母
\n\n DbConnection();\n zadanie=connect.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_UPDATABLE);\n sql="SELECT * FROM Clients;"; \n dane=zadanie.executeQuery(sql);\n\n String kas="Imon\xc4\x97";\n while(dane.next())\n {\n String var=dane.getString("Pavadinimas"); \n if (var!= null) {var =var.trim();} \n String rus =dane.getString("Rusys"); \n System.out.println(kas+" "+rus);\n }\n\n void DbConnection() throws SQLException\n {\n String baza="jdbc:odbc:DatabaseDC"; \n try\n {\n Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");\n }catch(Exception e){System.out.println("Connection error");}\n connect=DriverManager.getConnection(baza);\n }\n
Run Code Online (Sandbox Code Playgroud)\n\n在 DB 中,字段类型为 TEXT,大小为 20,不要使用任何其他字母解码或类似的内容。
\n\n它给了我“ Imon\xc4\x97 Imone ”,尽管在数据库中写的是“Imon\xc4\x97”,它等于rus。
\n