尝试使用SQL Server Native Client 10.0通过ODBC系统DSN从Java 6控制台应用程序连接到Microsoft Windows Server 2008 R2 64位系统上的Microsoft SQL Server 2008 R2。下面的源代码:
try
{
Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
String srcURL = "jdbc:odbc:FOO";
if (dbc == null)
{
dbc = DriverManager.getConnection(srcURL);
dbc.setTransactionIsolation(Connection.TRANSACTION_READ_UNCOMMITTED);
}
else
{
dbc.close();
dbc = DriverManager.getConnection(srcURL);
dbc.setTransactionIsolation(Connection.TRANSACTION_READ_UNCOMMITTED);
}
}
catch (ClassNotFoundException cx)
{
System.out.println("class not found");
}
catch (SQLException sx)
{
System.out.println("SQL Exception: " + sx);
log.info("SQL Exception: " + sx);
}
抛出错误
java.sql.exception [Microsoft] [ODBC驱动程序管理器]无效的字符串缓冲区长度
令人惊讶的是,使用与ODBC System DSN完全相同的方式配置了相同的代码,使用MS Server 2008 32位(非R2)和MS SQL Server 2008 R2的WORKS。两个系统之间的Microsoft ODBC驱动程序dll是不同的版本,即6.0.xxxx与6.1.xxxx,我怀疑是罪魁祸首。
最佳答案
是的,应该是ODBC管理器版本。以下是我遇到的问题和我想到的解决方案,希望它也可能对其他人有所帮助。
当尝试从部署到Jboss 4.x的应用程序对系统ODBC DSN(MS Access .mdb文件)运行查询时,出现相同的错误:“ SQL状态[S1090];错误代码[0]; [Microsoft] [ODBC驱动程序管理器]“无效的字符串或缓冲区长度”在Windows Server R2中。
我在2台不同的Windows Server R2计算机上重现了相同的错误。在Windows Server Standard(我猜为R1)和Windows 7 Professional x64上,该问题无法重现。
此外,在同一Windows Server R2上尝试直接连接(从独立应用程序)时,我没有遇到这个问题。如果应用程序无法连接/检测数据源,则会出现一条错误消息,提示没有这样的DSN名称或找不到它。尝试向ODBC数据源(注册的数据源名称-DSN)发送空查询时,将引发相同的错误消息。因此,我猜想ODBC会得到一个空查询,该查询尝试对DS执行,结果是:无效的字符串或缓冲区长度。
由于我可以读取使用给定DSN注册为ODBC DS的.mdb文件,并且从独立应用程序查询时不会出现此错误,因此我将制作一个独立应用程序,该应用程序将通过以下方式读取.mdb文件ODBC,并将其内容写入.csv文件,Jboss应用程序将读取该文件。
如果有人找到更好的解决方案,请告诉我。