El parámetro @x no se definió para el procedimiento almacenado ... con MS_SQL JDBC
Estoy tratando de ejecutar un procedimiento almacenado usando JDBC de SQL Server en un método:
//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
}
Digamos que el nombre del procedimiento almacenado esABC
y el parámetro es@a
. AhoraDatabaseMetaData
devuelve el nombre de la columna@a
pero ambientandost.setInt("@a",0)
devuelve el siguiente error:
com.microsoft.sqlserver.jdbc.SQLServerException: el parámetro @a no se definió para el procedimiento almacenado ABC.
En cambio, probé esto:st.setInt("a",0)
y se ejecutó perfectamente.
Ahora el problema es que tengo que establecer los parámetros dinámicamente ya que tengo demasiados procedimientos almacenados y demasiados parámetros, pero jdbc está dando error.
Editar 1:
Como se señaló en una respuesta, mi pregunta es un duplicado de:Parámetros con nombre en JDBC, Me gustaría explicar que el problema aquí no son los parámetros nombrados o los posicionales, sino que se trata de que JDBC no maneje los parámetros del servidor SQL en sí mismo o que cometa algún error al invocarlo.