Java 未定义JDBC SQLServerException参数

Java 未定义JDBC SQLServerException参数,java,sql-server,jdbc,playframework,Java,Sql Server,Jdbc,Playframework,我有一个Play2.4.3应用程序,使用JDBC连接到SQLServerDB。我刚刚编写了一个数据库类来处理调用存储过程。然而,我碰到了一堵墙: 我的进程的开始: ALTER PROCEDURE [WebApp].[Content_GetByAppID] ( @inAppID int, @inContentGroupID int = null, @inContentTypeID int = null, @inContentStatu

我有一个Play2.4.3应用程序,使用JDBC连接到SQLServerDB。我刚刚编写了一个数据库类来处理调用存储过程。然而,我碰到了一堵墙:

我的进程的开始:

ALTER PROCEDURE [WebApp].[Content_GetByAppID]
(
    @inAppID            int,
    @inContentGroupID   int = null,
    @inContentTypeID    int = null,
    @inContentStatus    char(1) = 'A'
)
AS
下面是我编写的用于准备语句的类方法:

private CallableStatement createStatement(Connection inConnection, String inProc, DataMap inParams) throws SQLException{
    CallableStatement statement = inConnection.prepareCall("{call" + inProc + "}");

    if( inParams != null ) {
        for(Map.Entry<String,Object> e : inParams.entrySet()){
            String name = e.getKey();
            Object value = e.getValue();

            if( value != null ){
                if (value instanceof Timestamp){
                    // Sql does its own time conversion.  Let's avoid that
                    statement.setTimestamp(name, (Timestamp)value, Calendar.getInstance(TimeZone.getTimeZone("GMT")) );
                } else {
                    statement.setObject(name, value);
                }
            } else {
                // Pass in Special SQL NUll type if parameter is null
                statement.setNull(name, Types.NULL);
            }
        }
    }
    return statement;
}
private CallableStatement createStatement(连接中的连接、字符串inProc、数据映射inParams)抛出SQLException{
CallableStatement语句=inConnection.prepareCall(“{call”+inProc+“}”);
if(inParams!=null){
对于(Map.Entry e:inParams.entrySet()){
字符串名称=e.getKey();
对象值=e.getValue();
if(值!=null){
if(值instanceof Timestamp){
//Sql有自己的时间转换。让我们避免这种情况
语句.setTimestamp(名称,(时间戳)值,Calendar.getInstance(TimeZone.getTimeZone(“GMT”));
}否则{
语句.setObject(名称、值);
}
}否则{
//如果参数为NUll,则传入特殊的SQL NUll类型
语句.setNull(名称,类型.NULL);
}
}
}
返回语句;
}
我用这个打电话: DataMap params=新的DataMap()

params.put(“inAppID”,Play.application().configuration().getInt(“richfoods.app.id”);
参数put(“inContentTypeID”,typeID);
参数put(“inContentGroupID”,groupID);
参数put(“不可接受状态”,状态);
List content=mgContentDB.getList(
“WebApp.Content_GetByAppID(?,,,,?)”,
参数);
每当
createStatement
中的语句变量试图设置参数时,我都会遇到以下错误:

com.microsoft.sqlserver.jdbc.SQLServerException:com.microsoft.sqlserver.jdbc.SQLServerException:未为存储过程定义InconttypeId参数

你知道这是什么原因吗


编辑:我认为需要注意的一件有趣的事情是,错误不包括proc名称。应该是吧?这说明它找不到进程?

您缺少空格字符:

// Your code
inConnection.prepareCall("{call" + inProc + "}");

// Fix
inConnection.prepareCall("{call " + inProc + " }");

您的项目中是否有SQL连接器?我正在使用JDBC。您是否将SQL Server连接器放置在
项目/bin
中?连接器或JDBC驱动程序用于与数据库交互java。您必须拥有它。@markrotVeel:这适用于SQL Server中的
CallableStatement
。JDBC驱动程序查找参数位置,然后委托给位置版本…谢谢!我真不敢相信我错过了。现在进入下一个问题。嗯,在我从v6.0.7728.100开始使用sqljdbc42.jar进行测试时,
{CALL mySP}
{CALL mySP}
都失败了,但是
{CALL mySP(?)}
可以工作(并识别参数名)。如图所示。@GordThompson问题中的代码确实使用了(位置)参数。
// Your code
inConnection.prepareCall("{call" + inProc + "}");

// Fix
inConnection.prepareCall("{call " + inProc + " }");