请使用支持 JDBC 4.0 的 sqljdbc4.jar 类库

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了请使用支持 JDBC 4.0 的 sqljdbc4.jar 类库相关的知识,希望对你有一定的参考价值。

我用的sql数据库是2000的 jre版本是1.7 的,驱动是sqljdbc4.jar,为什么通过jsp访问数据库老提示这个错误,在main函数里访问数据库则不会提示这个错误?????
删了,再重建一次project,又可以了,,谢谢!

参考技术A 楼主貌似没添出具体的错误信息呢?
那应该是项目当中的缓存了。。
以后你可以试着清除掉tomcat的 work 文件夹。

或者 你 可以 换一个tomcat5.0 或者 5.5 的 ,应该就能避免这种问题出现
参考技术B 说明这个JAR包只能在局域网中使用,不要光看版本,老版本也许能行,我就是用的老版本的

没有为存储过程定义参数 @x... 使用 MS_SQL JDBC

【中文标题】没有为存储过程定义参数 @x... 使用 MS_SQL JDBC【英文标题】:Parameter @x was not defined for stored procedure... with MS_SQL JDBC 【发布时间】:2018-02-27 20:52:42 【问题描述】:

我正在尝试在方法中使用 SQL Server JDBC 执行存储过程:

//Connection connection, String sp_name, Map<String, Object>params input to the method
DatabaseMetaData dbMetaData = connection.getMetaData();
HashMap<String, Integer> paramInfo = new HashMap<String, Integer>();
if (dbMetaData != null)

        ResultSet rs = dbMetaData.getProcedureColumns (null, null, sp_name.toUpperCase(), "%");
        while (rs.next())
            paramInfo.put(rs.getString(4), rs.getInt(6));
        rs.close();

String call = " call " + sp_name + " ( ";
for (int i = 0; i < paramInfo.size(); i ++)
    call += "?,";
if (paramInfo.size() > 0)
    call = call.substring(0, call.length() - 1);
call += " ) ";
CallableStatement st = connection.prepareCall (call);
for (String paramName: paramInfo.keySet())
    int paramType = paramInfo.get(paramName);
    System.out.println("paramName="+paramName);
    System.out.println("paramTYpe="+paramType);
    Object paramVal = params.get(paramName);
    st.setInt(paramName, Integer.parseInt(((String)paramVal))); //All stored proc parameters are of type int

假设存储过程名称为ABC,参数为@a。 现在 DatabaseMetaData 返回列名 @a 但设置 st.setInt("@a",0) 返回以下错误:

com.microsoft.sqlserver.jdbc.SQLServerException:未为存储过程 ABC 定义参数 @a。

相反,我尝试了这个:st.setInt("a",0),它完美地执行了。

现在的问题是我必须动态设置参数,因为我有太多的存储过程和太多的参数,但是 jdbc 给出了错误。

编辑 1:

正如在一个答案中指出的那样,我的问题与:Named parameters in JDBC 重复,我想解释一下,这里的问题不是命名参数或位置参数,而是关于 JDBC 不处理 SQL 服务器参数本身正确或我在调用它时犯了一些错误。

【问题讨论】:

不确定我是否理解正确,但为什么不能(你不能动态剥离 @ Named parameters in JDBC的可能重复 @ScaryWombat 我需要一些可以同时用于 mysql 和 sql server 以及其他一些的东西,而无需进行特定更改,因为我希望 JDBC 能够处理它。 @Bejasc CallableStatement 是该规则的例外:它确实支持命名参数。 对我来说听起来像是一个错误,您可能想在 github.com/Microsoft/mssql-jdbc 上报告它或者元数据应该报告没有 @ 的名称,或者 setXXX 应该用 @ 接受它(并且没有向后兼容性)。 【参考方案1】:

2017 年 10 月 7 日更新:merge request to fix this issue 已被接受,因此 6.3.4 及更高版本应该不再是问题。


是的,不幸的是,对于 mssql-jdbc,DatabaseMetaData#getProcedureColumns 返回的参数名称与CallableStatement#setInt 接受的名称不匹配。等。。如果您认为这是一个错误,那么您应该创建一个issue on GitHub,也许它会在未来的版本中得到修复。

不过,与此同时,您只需要解决它。所以,不要像这样的代码......

ResultSet rs = connection.getMetaData().getProcedureColumns(null, "dbo", "MenuPlanner", null);
while (rs.next()) 
    if (rs.getShort("COLUMN_TYPE") == DatabaseMetaData.procedureColumnIn) 
        String inParamName = rs.getString("COLUMN_NAME");
        System.out.println(inParamName);
    

...产生...

@person
@food

...您需要使用这样的代码...

boolean isMssqlJdbc = connection.getClass().getName().equals(
        "com.microsoft.sqlserver.jdbc.SQLServerConnection");
ResultSet rs = connection.getMetaData().getProcedureColumns(null, "dbo", "MenuPlanner", null);
while (rs.next()) 
    if (rs.getShort("COLUMN_TYPE") == DatabaseMetaData.procedureColumnIn) 
        String inParamName = rs.getString("COLUMN_NAME");
        if (isMssqlJdbc && inParamName.startsWith("@")) 
            inParamName = inParamName.substring(1, inParamName.length());
        
        System.out.println(inParamName);
    

...产生...

person
food

【讨论】:

GitHub问题here. 什么时候可以将其合并到 sql 驱动程序中? @HBK - 我不是微软员工,所以我不能说。您可以尝试在 GitHub 上询问。 @HBK - 版本 6.3.4 于 10 月 19 日发布。

以上是关于请使用支持 JDBC 4.0 的 sqljdbc4.jar 类库的主要内容,如果未能解决你的问题,请参考以下文章

sqljdbc4.jar 用啥驱动

缺少工件 com.microsoft.sqlserver:sqljdbc4:jar:4.0

maven 报错 Missing artifact com.microsoft.sqlserver:sqljdbc4:jar:jdk15:4.0:4.0

sqljdbc.jar 和 sqljdbc4.jar

解决Missing artifact com.microsoft.sqlserver:sqljdbc4:jar:4.0问题

微软不允许以maven的方式直接下载该文件 (com.microsoft.sqlserver:sqljdbc4:jar:4.0),记录一下解决方案