未使用 MS_SQL JDBC 为存储过程定义参数 @x

2023-12-05

我正在尝试在方法中使用 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. Now DatabaseMetaData返回列名@a但设置st.setInt("@a",0)返回以下错误:

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

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

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

Edit 1:

正如一个答案所指出的,我的问题是以下问题的重复:JDBC 中的命名参数,我想解释一下,这里的问题不是命名参数或位置参数,而是关于 JDBC 没有正确处理 SQL Server 参数本身或者我在调用它时犯了一些错误。


2017-10-07 更新:合并请求以解决此问题已经被接受,所以这应该不再是版本的问题6.3.4然后。


是的,不幸的是,对于 mssql-jdbc,返回的参数名称不一致DatabaseMetaData#getProcedureColumns与接受的名称不匹配CallableStatement#setInt et. al.。如果您认为这是一个错误,那么您应该创建一个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
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

未使用 MS_SQL JDBC 为存储过程定义参数 @x 的相关文章

  • 如何在 Android 应用程序中隐藏 Flutterwave API 密钥

    我正在构建一个 Android 应用程序 目前正在将 Flutterwave 集成到我的应用程序中以进行支付 建议我永远不要将 Flutterwave API 密钥放在我的应用程序上 那么我该如何隐藏这些键呢 我正在使用 Retrofit
  • 显示包含特定表的所有数据库名称

    我的 SQL Server 中有很多数据库 我必须只搜索包含特定表名的数据库名称Heartbitmaster 我有很多数据库 例如Gotgold DVD等 我只想从包含此表的查询中查找数据库名称Heartbitmaster 我搜索我尝试查询
  • 为什么用scala写的代码比用java写的慢6倍?

    我不确定我在编写 scala 代码时是否犯了一些错误 问题是 The four adjacent digits in the 1000 digit number that have the greatest product are 9 9
  • 使用 OkHttp 下载损坏的文件

    我编写的下载文件的方法总是会产生损坏的文件 public static String okDownloadToFileSync final String link final String fileName final boolean te
  • 如何使用 Java 引用释放 Java Unsafe 内存?

    Java Unsafe 类允许您按如下方式为对象分配内存 但是使用此方法在完成后如何释放分配的内存 因为它不提供内存地址 Field f Unsafe class getDeclaredField theUnsafe Internal re
  • T-SQL 中是否有 LIKE 语句的替代方案?

    我有一个场景我需要执行以下操作 SELECT FROM dbo MyTable WHERE Url LIKE
  • 为什么 jar 执行的通配符在 docker CMD 中不起作用?

    我有一个Dockerfile与以下CMD启动我的 Spring Boot 应用程序 FROM java 8 jre CMD java jar app file jar 当我尝试从创建的图像启动容器时 我得到 Error Unable to
  • Java AES 256 加密

    我有下面的 java 代码来加密使用 64 个字符密钥的字符串 我的问题是这会是 AES 256 加密吗 String keyString C0BAE23DF8B51807B3E17D21925FADF273A70181E1D81B8EDE
  • JAXB - 忽略元素

    有什么方法可以忽略 Jaxb 解析中的元素吗 我有一个很大的 XML 文件 如果我可以忽略其中一个大而复杂的元素 那么它的解析速度可能会快很多 如果它根本无法验证元素内容并解析文档的其余部分 即使该元素不正确 那就更好了 例如 这应该只生成
  • 在 Spring 中为 @Pathvariable 添加类级别验证

    在发布这个问题之前 我已经做了很多研究并尝试了很多可用的解决方案 这是我陷入的棘手情况 我有一个 Spring 控制器 它有多个请求映射 它们都有 PathVariables 控制器如下所示 Controller EnableWebMvc
  • 数据库中的持久日期不等于检索日期

    我有一个具有 Date 属性的简单实体类 此属性对应于 MySQL 日期时间列 Entity public class Entity Column name start date Temporal TemporalType TIMESTAM
  • 如何向页面添加 HTML 页眉和页脚?

    如何使用 itext 从 html 源添加标题到 pdf 目前 我们已经扩展了 PdfPageEventHelper 并重写了这些方法 工作正常 但当我到达 2 个以上页面时 它会抛出 RuntimeWorkerException Over
  • 如何使用 Jersey 将嵌套列表封送为 JSON?我得到一个空数组或一个包含数组的单元素字典数组

    我正在开发一个使用 Jersey 将对象转换为 JSON 的项目 我希望能够写出嵌套列表 如下所示 data one two three a b c 我想要转换的对象首先将数据表示为 gt gt 我认为 Jersey 会做正确的事情 以上输
  • Azure Java SDK:ServiceException:ForbiddenError:

    尝试了基本位置检索器代码 如下所示 String uri https management core windows net String subscriptionId XXXXXXXX 5fad XXXXXX 9dfa XXXXXX St
  • 用于请求带有临时缓存的远程 Observable 的 RxJava 模式

    用例是这样的 我想暂时缓存最新发出的昂贵的Observable响应 但在它过期后 返回到昂贵的源Observable并再次缓存它 等等 一个非常基本的网络缓存场景 但我真的很难让它工作 private Observable
  • Spring Data Rest 多对多 POST

    首先 让我解释一下我的用例 这非常简单 有一个用户实体和一个服务实体 我使用 UserService 作为连接实体 连接表 在用户和服务之间建立多对多关联最初 会有一些用户集和一些服务集 用户可以在任何时间点订阅任何服务 在这种情况下 将向
  • 如何在sql server中对行号进行内连接

    SQL Server 2008 两张表 表A有以下数据 RowA RowB RowC RowD 表B有以下数据 Row4 Row3 Row2 Row1 我想得到以下输出 RowA Row1 RowB Row2 RowC Row3 RowD
  • asp.net网格分页的SQL查询

    我在用iBatis and SQLServer 使用偏移量和限制进行分页查询的最佳方法是什么 也许我添加该列ROW NUMBER OVER ORDER BY Id AS RowNum 但这只会阻止简单查询的数据访问 在某些情况下 我使用选择
  • 字符串文字上的 SQL Server T-SQL N 前缀[重复]

    这个问题在这里已经有答案了 这可能是一个菜鸟问题 但我发现了一些 T SQL 查询示例来验证数据库大小SELECT and WHERE clause here http technet microsoft com en us library
  • 在会话即将到期之前调用方法

    我的网络应用程序有登录的用户 有一个超时 在会话过期之前 我想执行一个方法来清理一些锁 我已经实现了sessionListener但一旦我到达public void sessionDestroyed HttpSessionEvent eve

随机推荐

  • 在 swift 类中实现 AsyncSocket 回调

    我有一个自定义 ViewController 委托类 它处理 ui 操作 例如单击按钮和在文本视图中显示文本 现在我想在类中使用AsyncSocket 我已经能够创建一个套接字对象 var tcpSocket GCDAsyncSocket
  • 有没有办法在main.js中访问vue js Vue Session

    我在 main js 中进行了以下设置 import Vue from vue import App from App vue import VueRouter from vue router import Home from views
  • 读取android系统文件

    我尝试了很多读取文件的解决方案 但没有一个有效 我需要一种方法来读取系统文件并在 toast 或对话框中显示文本 当然我的应用程序有root权限 单击复选框后 我必须在 toast 中显示 eoc status 的内容 例如 Runtime
  • 添加一个从未调用过的函数可以改善行为吗?

    下面的代码会产生不良结果 20010101 20010102 当取消注释 String func 时 它会产生更好的结果 但不是我的实现 20010101 1 5 20010102 2 5 然而 该 String 函数从未被调用 我看到 D
  • Facebook 操作脚本 3 API 登录/注销问题

    我正在使用 Flash builder 4 5 AIR 2 6 制作适用于 Android 的移动 AIR 应用程序 Facebook动作脚本3 API最新版本 我遇到登录 注销问题 我只能登录一次 然后我的数据会以某种方式缓存 Faceb
  • Visual Studio 中的远指针声明

    我以这种方式有一个远指针声明 char far p 但 Visual Studio 2008 给了我 error C2146 missing before identifier p 任何帮助表示赞赏 far是 16 位 Microsoft
  • 如何在C#中创建和使用dll文件

    我目前正在尝试学习如何用 C 和 C 编写和使用适用于 Windows 的 dll 文件 我想一旦我理解了其中一种语言 我就能很容易地弄清楚另一种语言 我今天搜索了 5 个多小时 但没有找到有效的 dll 指南 它们要么已经过时并且拒绝与我
  • 格雷特函数定义

    我想定义一个更大的函数 它从比之前的列表项大的列表项中进行选择 例如 greaters 1 3 2 4 3 4 5 3 4 4 5 greaters 5 10 6 11 7 12 10 11 12 我想出的定义是这样的 greaters O
  • 使用 iPhone SDK 查找 SRV 记录

    在 Windows 或 Mac OS X 终端中 如果您键入 nslookup type SRV xmpp server tcp gmail com 例如 您将收到一堆与不同谷歌聊天服务器相关的 SRV 记录 有谁有这方面的经验并且可能知道
  • 在 Firefox 开发者工具中使用外部编辑器?

    如果我单击带有行号的文件名 script js 100 4 在 Firefox 开发者工具中 我会看到一个集成编辑器 有没有办法打开外部编辑器 在正确的行 例如 VS Code 有一个类似的问题Chrome从 2013 年开始 这还不可能
  • 使用 Scapy 解码基于 UDP 的 RTP

    如何使用 Scapy 2 3 2 解码 和操作 基于 UDP 的 RTP 我有一个名为 rtp pcap 的捕获文件 其中包含到 224 0 1 11 5016 的 RTP 音频流 当您启用 RTP over UDP 协议时 默认关闭 Wi
  • 动作脚本3睡眠?

    我有一个简单的动作脚本函数 var string String TEXT REMOVED var myArray Array string split addEventListener Event ENTER FRAME frameLoop
  • 使用 ASP.net Handler 动态创建 JS 文件

    我有很多客户 我想给他们脚本 所以我想根据他们的客户 ID 创建 JS 文件 这样我就可以返回并直接在客户端执行 客户端可以是任何人 PHP Html ASP net 问题是 当我浏览此链接时 它给了我 JS 字符串 但在客户端 此脚本没有
  • 使用 LINQ 选择数组中最小、最常见的数字

    如果我有一个未排序的数组 其中包含多对相同的数字 我如何找到最常见数字中的最小者 int arr new int 8 6 5 2 5 9 6 9 2 3 unsorted array Array Sort arr I could sort
  • Mobilock 应用程序在 BOOT_COMPLETED 广播之前启动...这怎么可能?

    有一个名为 Mobilock 的信息亭应用程序 这个应用程序的启动速度比我自己的以 BOOT COMPLETED 广播启动的应用程序要快得多 几乎提前了 5 秒 我自己的应用程序具有最高优先级 即整数的最大值 所以这不是优先级的问题 这些人
  • 在 C 中检查变量是字符串还是整数

    我正在编写一个C程序 我必须通过命令行读取参数 如何检查传递给程序的参数是字符串 即字符数组 还是整数 我可以在 C 中使用任何即时调用吗 命令行传递的参数总是字符串 如果你想检查这个字符串是否可以转换为整数 你可以使用strtol cha
  • JPEG 图像中的透明背景

    如何在 JPEG 图像上设置透明背景 这是很多同事的疑问 在 Windows 上使用画图的解决方案是什么 还有哪些其他简单的替代方案 您无法将 JPEG 图像设为透明 您应该使用允许透明的格式 例如 GIF 或 PNG 画图将打开这些文件
  • 无法更改 IOS 上的 .NET MAUI Blazor 启动屏幕

    我尝试遵循有关 NET MAUI 启动画面的所有可用教程 但我无法让我的应用程序显示自定义启动画面 重现问题的步骤 在 PC 上打开 Microsoft Visual Studio 2022 创建新的 NET MAUI Blazor 应用程
  • 有没有办法从 WordPress 的链接生成中排除域

    我有一个在 domain com 上响应的网站 即将x domain com or y domain com应该产生相同的网页 我不知道 是什么 但它是重要的信息 因为我们根据它来跟踪事物 当迁移到 WordPress 时 我们遇到了一个非
  • 未使用 MS_SQL JDBC 为存储过程定义参数 @x

    我正在尝试在方法中使用 SQL Server JDBC 执行存储过程 Connection connection String sp name Map