用java连接sql server 2008的异常,哪位大神来看一看

时间:2022-05-19 16:24:00
最近我用java连接数据库的时候,出现了一个很奇怪的现象。如果我加断点调试程序则没问题,但直接点运行就不行,要报(java.sql.SQLException: [Microsoft][ODBC 驱动程序管理器] 无效的字符串或缓冲区长度)的错误,
错误行是   ct=DriverManager.getConnection("jdbc:odbc:mytest"); 
这个到底是什么情况??百度和谷歌都没找到解决办法??


求助各位大大



代码如下:
package test;
import java.sql.*;
public class Database {
 /**
  * @param args
  */
 public static void main(String[] args) {
  
  Connection ct=null;
  Statement sm=null;
  try{
   //加载驱动
   Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
   //得到连接
   ct=DriverManager.getConnection("jdbc:odbc:mytest");
   //Statement 主要用于发送SQL语句到数据库
   sm=ct.createStatement();
   //执行crud
   
   //1.添加数据到Hero excuteUpdate 执行添加,删除,更改
   sm.executeUpdate("insert into Hero values(11,'Mike','Super','男',10000)");
   System.out.print("ok");
  }catch(Exception e)
  {
   e.printStackTrace();
  }  
  finally
  {
   //关闭资源
   try {
    if(sm!=null)
     sm.close();
    if(ct!=null)
     ct.close();
   } catch (Exception e) {
    e.printStackTrace();
   }
  }
 }
}

15 个解决方案

#1


"加断点调试程序则没问题,但直接点运行就不行"这样的问题似乎我也遇到过,把你的 项目重新编译再试试。

#2


这个java怎么重新编译呀,又不是C++?????

#3


引用 1 楼 qqcrazyboy 的回复:
"加断点调试程序则没问题,但直接点运行就不行"这样的问题似乎我也遇到过,把你的 项目重新编译再试试。


这个java怎么重新编译呀,又不是C++?????

#4


   有可能是你的数据库表设计的有问题,检查下表字段。代码没问题。

#5


Eclipse有一个自动编译的选项,在该选项打钩,同时删除以存在的class文件。

#6


ODBC的配置是不是正常

#7


驱动正确吗?

#8


为什么不可以从新编译?

#9


别用odbc了,性能那么差,还有很多不兼容,直接用jdbc。

#10


发现好多都不推荐使用 odbc链接数据库

#11


引用 3 楼 mikejay0520 的回复:
引用 1 楼 qqcrazyboy 的回复:

"加断点调试程序则没问题,但直接点运行就不行"这样的问题似乎我也遇到过,把你的 项目重新编译再试试。


这个java怎么重新编译呀,又不是C++?????


这种态度,真的不想给他讲

#12


那么NB,自己看doc去吧

#13


没看到你数据库的路径和用户名之类的啊

#14


我的程序和你差不多,也是这结果,有没有人解决一下啦,求助!!!

//演示使用
package com.test1;
import java.sql.*;
public class Test1 {

public static void main(String[] args) {
// TODO Auto-generated method stub
Connection ct=null;
Statement sm=null;
        try{
         //加载驱动
         Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
         //2、得到链接
         ct=DriverManager.getConnection("jdbc:odbc:test1");
         //3、创建statement或preparedstatement【区别】
         //Statement用于发送sql语句到数据库
         sm=ct.createStatement();
         //4、执行crud语句
         //1.添加一条数据
         int i=sm.executeUpdate("insert into dept values('002','销售部','济南')");
        
         if(i==1){
         System.out.print("添加ok!");
         }
         else
         System.out.print("添加error!");
        }catch(Exception e){
         e.printStackTrace();
        }finally{
         //关闭资源!!!!!!顺序是后建先关
         try{
         //保证程序健壮
if(sm!=null){
         sm.close();
         }
if(ct!=null){
          ct.close();
         }
         }catch(Exception e){
         e.printStackTrace();
            
            }
        }
}

}
结果是:java.sql.SQLException: [Microsoft][ODBC 驱动程序管理器] 无效的字符串或缓冲区长度
at sun.jdbc.odbc.JdbcOdbc.createSQLException(JdbcOdbc.java:6957)
at sun.jdbc.odbc.JdbcOdbc.standardError(JdbcOdbc.java:7114)
at sun.jdbc.odbc.JdbcOdbc.SQLGetDataString(JdbcOdbc.java:3907)
at sun.jdbc.odbc.JdbcOdbcResultSet.getDataString(JdbcOdbcResultSet.java:5698)
at sun.jdbc.odbc.JdbcOdbcResultSet.getString(JdbcOdbcResultSet.java:354)
at sun.jdbc.odbc.JdbcOdbcConnection.buildTypeInfo(JdbcOdbcConnection.java:1503)
at sun.jdbc.odbc.JdbcOdbcConnection.initialize(JdbcOdbcConnection.java:381)
at sun.jdbc.odbc.JdbcOdbcDriver.connect(JdbcOdbcDriver.java:174)
at java.sql.DriverManager.getConnection(DriverManager.java:582)
at java.sql.DriverManager.getConnection(DriverManager.java:207)
at com.test1.Test1.main(Test1.java:14)

#15


清除缓存 重新编译一下

#1


"加断点调试程序则没问题,但直接点运行就不行"这样的问题似乎我也遇到过,把你的 项目重新编译再试试。

#2


这个java怎么重新编译呀,又不是C++?????

#3


引用 1 楼 qqcrazyboy 的回复:
"加断点调试程序则没问题,但直接点运行就不行"这样的问题似乎我也遇到过,把你的 项目重新编译再试试。


这个java怎么重新编译呀,又不是C++?????

#4


   有可能是你的数据库表设计的有问题,检查下表字段。代码没问题。

#5


Eclipse有一个自动编译的选项,在该选项打钩,同时删除以存在的class文件。

#6


ODBC的配置是不是正常

#7


驱动正确吗?

#8


为什么不可以从新编译?

#9


别用odbc了,性能那么差,还有很多不兼容,直接用jdbc。

#10


发现好多都不推荐使用 odbc链接数据库

#11


引用 3 楼 mikejay0520 的回复:
引用 1 楼 qqcrazyboy 的回复:

"加断点调试程序则没问题,但直接点运行就不行"这样的问题似乎我也遇到过,把你的 项目重新编译再试试。


这个java怎么重新编译呀,又不是C++?????


这种态度,真的不想给他讲

#12


那么NB,自己看doc去吧

#13


没看到你数据库的路径和用户名之类的啊

#14


我的程序和你差不多,也是这结果,有没有人解决一下啦,求助!!!

//演示使用
package com.test1;
import java.sql.*;
public class Test1 {

public static void main(String[] args) {
// TODO Auto-generated method stub
Connection ct=null;
Statement sm=null;
        try{
         //加载驱动
         Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
         //2、得到链接
         ct=DriverManager.getConnection("jdbc:odbc:test1");
         //3、创建statement或preparedstatement【区别】
         //Statement用于发送sql语句到数据库
         sm=ct.createStatement();
         //4、执行crud语句
         //1.添加一条数据
         int i=sm.executeUpdate("insert into dept values('002','销售部','济南')");
        
         if(i==1){
         System.out.print("添加ok!");
         }
         else
         System.out.print("添加error!");
        }catch(Exception e){
         e.printStackTrace();
        }finally{
         //关闭资源!!!!!!顺序是后建先关
         try{
         //保证程序健壮
if(sm!=null){
         sm.close();
         }
if(ct!=null){
          ct.close();
         }
         }catch(Exception e){
         e.printStackTrace();
            
            }
        }
}

}
结果是:java.sql.SQLException: [Microsoft][ODBC 驱动程序管理器] 无效的字符串或缓冲区长度
at sun.jdbc.odbc.JdbcOdbc.createSQLException(JdbcOdbc.java:6957)
at sun.jdbc.odbc.JdbcOdbc.standardError(JdbcOdbc.java:7114)
at sun.jdbc.odbc.JdbcOdbc.SQLGetDataString(JdbcOdbc.java:3907)
at sun.jdbc.odbc.JdbcOdbcResultSet.getDataString(JdbcOdbcResultSet.java:5698)
at sun.jdbc.odbc.JdbcOdbcResultSet.getString(JdbcOdbcResultSet.java:354)
at sun.jdbc.odbc.JdbcOdbcConnection.buildTypeInfo(JdbcOdbcConnection.java:1503)
at sun.jdbc.odbc.JdbcOdbcConnection.initialize(JdbcOdbcConnection.java:381)
at sun.jdbc.odbc.JdbcOdbcDriver.connect(JdbcOdbcDriver.java:174)
at java.sql.DriverManager.getConnection(DriverManager.java:582)
at java.sql.DriverManager.getConnection(DriverManager.java:207)
at com.test1.Test1.main(Test1.java:14)

#15


清除缓存 重新编译一下