Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

DatabaseMetaData#getProcedureColumns do not match the names accepted by CallableStatement#setInt #496

Closed
krishnakant-sarda-abzooba opened this issue Sep 20, 2017 · 2 comments

Comments

@krishnakant-sarda-abzooba

Driver version or jar name

mssql-jdbc verion 6.2.1.jre8

SQL Server version

Microsoft SQL Server 2016 (RTM-GDR) (KB4019088) - 13.0.1742.0 (X64) Jul 5 2017 23:41:17 Copyright (c) Microsoft Corporation Developer Edition (64-bit) on Windows 8.1 Pro 6.3 (Build 9600: )

Client operating system

Windows 8.1

Java/JVM version

1.8

Table schema

Please tell us the table schema

Problem description

For mssql-jdbc the parameter names returned by DatabaseMetaData#getProcedureColumns do not match the names accepted by CallableStatement#setInt et. al..
Link to the problem on stackoverflow put up by me:

Expected behavior and actual behavior

I am trying to execute a stored procedure using SQL Server JDBC in a method using CallableStatement:
CallableStatement st = connection.prepareCall ("{ call ABC ( ? ) }");
Let say the stored procedure name is ABC and parameter is @a. Now DatabaseMetaData returns column name @a but setting st.setInt("@a",0) returns following error:
com.microsoft.sqlserver.jdbc.SQLServerException: Parameter @a was not defined for stored procedure ABC
Instead, I tried this: st.setInt("a",0) and it executed perfectly.

Repro code

//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
}
@gordthompson
Copy link
Contributor

Issue resolved by #495

@cheenamalhotra
Copy link
Member

Closing the issue since PR #495 merged to Dev.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

3 participants