Java 未定义JDBC SQLServerException参数
我有一个Play2.4.3应用程序,使用JDBC连接到SQLServerDB。我刚刚编写了一个数据库类来处理调用存储过程。然而,我碰到了一堵墙: 我的进程的开始: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
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 + " }");