@@ -254,7 +254,7 @@ private void parseQueryMeta(ResultSet rsQueryMeta) throws SQLServerException {
254
254
SQLServerException .getErrString ("R_metaDataErrorForParameter" ));
255
255
Object [] msgArgs = {paramOrdinal };
256
256
SQLServerException .makeFromDriverError (con , stmtParent ,
257
- form .format (msgArgs ) + " " + e .toString (), null , false );
257
+ form .format (msgArgs ) + " " + e .getMessage (), null , false );
258
258
}
259
259
}
260
260
} else
@@ -547,8 +547,8 @@ private void checkClosed() throws SQLServerException {
547
547
* the procedure name
548
548
* @throws SQLServerException
549
549
*/
550
+ @ SuppressWarnings ("serial" )
550
551
SQLServerParameterMetaData (SQLServerPreparedStatement st , String sProcString ) throws SQLServerException {
551
-
552
552
assert null != st ;
553
553
stmtParent = st ;
554
554
con = st .connection ;
@@ -612,9 +612,8 @@ private void checkClosed() throws SQLServerException {
612
612
613
613
if (con .getServerMajorVersion () >= SQL_SERVER_2012_VERSION ) {
614
614
// new implementation for SQL verser 2012 and above
615
- String preparedSQL = con .replaceParameterMarkers ((stmtParent ).userSQL ,
616
- (stmtParent ).userSQLParamPositions , (stmtParent ).inOutParam ,
617
- (stmtParent ).bReturnValueSyntax );
615
+ String preparedSQL = con .replaceParameterMarkers (stmtParent .userSQL ,
616
+ stmtParent .userSQLParamPositions , stmtParent .inOutParam , stmtParent .bReturnValueSyntax );
618
617
619
618
try (SQLServerCallableStatement cstmt = (SQLServerCallableStatement ) con
620
619
.prepareCall ("exec sp_describe_undeclared_parameters ?" )) {
@@ -680,9 +679,9 @@ private void checkClosed() throws SQLServerException {
680
679
catch (SQLServerException e ) {
681
680
throw e ;
682
681
} catch (SQLException e ) {
683
- SQLServerException .makeFromDriverError (con , stmtParent , e .toString (), null , false );
682
+ SQLServerException .makeFromDriverError (con , stmtParent , e .getMessage (), null , false );
684
683
} catch (StringIndexOutOfBoundsException e ) {
685
- SQLServerException .makeFromDriverError (con , stmtParent , e .toString (), null , false );
684
+ SQLServerException .makeFromDriverError (con , stmtParent , e .getMessage (), null , false );
686
685
}
687
686
}
688
687
@@ -703,58 +702,66 @@ public <T> T unwrap(Class<T> iface) throws SQLException {
703
702
return t ;
704
703
}
705
704
706
- private Map <String , Object > getParameterInfo (int param ) throws SQLServerException {
707
- boolean paramFound = false ;
708
- if ((stmtParent ).bReturnValueSyntax && isTVP ) {
709
- paramFound = procMetadata .size () >= param ;
710
- if (paramFound ) {
711
- return procMetadata .get (param - 1 );
712
- }
705
+ private Map <String , Object > getParameterInfo (int param ) {
706
+ if (stmtParent .bReturnValueSyntax && isTVP ) {
707
+ return procMetadata .get (param - 1 );
713
708
} else {
714
709
// Note row 1 is the 'return value' meta data
715
- paramFound = procMetadata .size () > param ;
716
- if (paramFound ) {
717
- return procMetadata .get (param );
718
- }
710
+ return procMetadata .get (param );
719
711
}
720
- if (!paramFound ) {
712
+ }
713
+
714
+ private boolean isValidParamProc (int n ) {
715
+ // Note row 1 is the 'return value' meta data
716
+ return ((stmtParent .bReturnValueSyntax && isTVP && procMetadata .size () >= n ) || procMetadata .size () > n );
717
+ }
718
+
719
+ private boolean isValidParamQuery (int n ) {
720
+ return (null != queryMetaMap && queryMetaMap .containsKey (n ));
721
+ }
722
+
723
+ /**
724
+ * Checks if the @param passed is valid for either procedure metadata or query metadata.
725
+ *
726
+ * @param param
727
+ * @throws SQLServerException
728
+ */
729
+ private void checkParam (int param ) throws SQLServerException {
730
+ // Check if Procedure Metadata is not available
731
+ if (null == procMetadata ) {
732
+ // Check if Query Metadata is also not available
733
+ if (!isValidParamQuery (param )) {
734
+ SQLServerException .makeFromDriverError (con , stmtParent , SQLServerException .getErrString ("R_noMetadata" ),
735
+ null , false );
736
+ }
737
+ } else if (!isValidParamProc (param )) {
738
+ // Throw exception if @param index not found
721
739
MessageFormat form = new MessageFormat (SQLServerException .getErrString ("R_invalidParameterNumber" ));
722
740
Object [] msgArgs = {param };
723
741
SQLServerException .makeFromDriverError (con , stmtParent , form .format (msgArgs ), null , false );
724
742
}
725
- return null ;
726
- }
727
-
728
- private void checkParam (int n ) throws SQLServerException {
729
- if (!queryMetaMap .containsKey (n )) {
730
- SQLServerException .makeFromDriverError (con , stmtParent , SQLServerException .getErrString ("R_noMetadata" ),
731
- null , false );
732
- }
733
743
}
734
744
735
745
@ Override
736
746
public String getParameterClassName (int param ) throws SQLServerException {
737
747
checkClosed ();
748
+ checkParam (param );
738
749
try {
739
- if (procMetadata == null ) {
740
- // PreparedStatement.
741
- checkParam (param );
750
+ if (null == procMetadata ) {
742
751
return queryMetaMap .get (param ).parameterClassName ;
743
752
} else {
744
- JDBCType jdbcType = JDBCType .of ((short ) getParameterInfo (param ).get ("DATA_TYPE" ));
745
- return jdbcType .className ();
753
+ return JDBCType .of ((short ) getParameterInfo (param ).get ("DATA_TYPE" )).className ();
746
754
}
747
- } catch (SQLException e ) {
748
- SQLServerException .makeFromDriverError (con , stmtParent , e .toString (), null , false );
755
+ } catch (SQLServerException e ) {
756
+ SQLServerException .makeFromDriverError (con , stmtParent , e .getMessage (), null , false );
749
757
return null ;
750
758
}
751
759
}
752
760
753
761
@ Override
754
762
public int getParameterCount () throws SQLServerException {
755
763
checkClosed ();
756
- if (procMetadata == null ) {
757
- // PreparedStatement
764
+ if (null == procMetadata ) {
758
765
return queryMetaMap .size ();
759
766
} else {
760
767
// Row 1 is Return Type metadata
@@ -765,170 +772,123 @@ public int getParameterCount() throws SQLServerException {
765
772
@ Override
766
773
public int getParameterMode (int param ) throws SQLServerException {
767
774
checkClosed ();
768
- try {
769
- if (procMetadata == null ) {
770
- checkParam (param );
771
- // if it is not a stored proc, the param can only be input.
775
+ checkParam (param );
776
+ if (null == procMetadata ) {
777
+ // if it is not a stored procedure, the @param can only be input.
778
+ return parameterModeIn ;
779
+ } else {
780
+ int n = (int ) getParameterInfo (param ).get ("COLUMN_TYPE" );
781
+ if (n == 1 )
772
782
return parameterModeIn ;
773
- } else {
774
- int n = (int ) getParameterInfo (param ).get ("COLUMN_TYPE" );
775
- switch (n ) {
776
- case 1 :
777
- return parameterModeIn ;
778
- case 2 :
779
- return parameterModeOut ;
780
- default :
781
- return parameterModeUnknown ;
782
- }
783
- }
784
- } catch (SQLException e ) {
785
- SQLServerException .makeFromDriverError (con , stmtParent , e .toString (), null , false );
786
- return parameterModeUnknown ;
783
+ else if (n == 2 )
784
+ return parameterModeOut ;
785
+ else
786
+ return parameterModeUnknown ;
787
787
}
788
788
}
789
789
790
790
@ Override
791
791
public int getParameterType (int param ) throws SQLServerException {
792
792
checkClosed ();
793
+ checkParam (param );
793
794
int parameterType = 0 ;
794
- try {
795
- if (procMetadata == null ) {
796
- // PreparedStatement.
797
- checkParam (param );
798
- parameterType = queryMetaMap .get (param ).parameterType ;
799
- } else {
800
- Map <String , Object > info = getParameterInfo (param );
801
- if (null != info ) {
802
- parameterType = (short ) info .get ("DATA_TYPE" );
803
- }
804
- }
805
- if (0 != parameterType ) {
806
- switch (parameterType ) {
807
- case microsoft .sql .Types .DATETIME :
808
- case microsoft .sql .Types .SMALLDATETIME :
809
- parameterType = SSType .DATETIME2 .getJDBCType ().asJavaSqlType ();
810
- break ;
811
- case microsoft .sql .Types .MONEY :
812
- case microsoft .sql .Types .SMALLMONEY :
813
- parameterType = SSType .DECIMAL .getJDBCType ().asJavaSqlType ();
814
- break ;
815
- case microsoft .sql .Types .GUID :
816
- parameterType = SSType .CHAR .getJDBCType ().asJavaSqlType ();
817
- break ;
818
- default :
819
- break ;
820
- }
795
+ if (null == procMetadata ) {
796
+ parameterType = queryMetaMap .get (param ).parameterType ;
797
+ } else {
798
+ parameterType = (short ) getParameterInfo (param ).get ("DATA_TYPE" );
799
+ }
800
+ if (0 != parameterType ) {
801
+ switch (parameterType ) {
802
+ case microsoft .sql .Types .DATETIME :
803
+ case microsoft .sql .Types .SMALLDATETIME :
804
+ parameterType = SSType .DATETIME2 .getJDBCType ().asJavaSqlType ();
805
+ break ;
806
+ case microsoft .sql .Types .MONEY :
807
+ case microsoft .sql .Types .SMALLMONEY :
808
+ parameterType = SSType .DECIMAL .getJDBCType ().asJavaSqlType ();
809
+ break ;
810
+ case microsoft .sql .Types .GUID :
811
+ parameterType = SSType .CHAR .getJDBCType ().asJavaSqlType ();
812
+ break ;
813
+ default :
814
+ break ;
821
815
}
822
- return parameterType ;
823
- } catch (SQLException e ) {
824
- SQLServerException .makeFromDriverError (con , stmtParent , e .toString (), null , false );
825
- return 0 ;
826
816
}
817
+ return parameterType ;
827
818
}
828
819
829
820
@ Override
830
821
public String getParameterTypeName (int param ) throws SQLServerException {
831
822
checkClosed ();
832
- try {
833
- if (procMetadata == null ) {
834
- // PreparedStatement.
835
- checkParam (param );
836
- return queryMetaMap .get (param ).parameterTypeName ;
837
- } else {
838
- return getParameterInfo (param ).get ("TYPE_NAME" ).toString ();
839
- }
840
- } catch (SQLException e ) {
841
- SQLServerException .makeFromDriverError (con , stmtParent , e .toString (), null , false );
842
- return null ;
823
+ checkParam (param );
824
+ if (null == procMetadata ) {
825
+ return queryMetaMap .get (param ).parameterTypeName ;
826
+ } else {
827
+ return getParameterInfo (param ).get ("TYPE_NAME" ).toString ();
843
828
}
844
829
}
845
830
846
831
@ Override
847
832
public int getPrecision (int param ) throws SQLServerException {
848
833
checkClosed ();
849
- try {
850
- if (procMetadata == null ) {
851
- // PreparedStatement.
852
- checkParam (param );
853
- return queryMetaMap .get (param ).precision ;
854
- } else {
855
- int nPrec = (int ) getParameterInfo (param ).get ("PRECISION" );
856
- return nPrec ;
857
- }
858
- } catch (SQLException e ) {
859
- SQLServerException .makeFromDriverError (con , stmtParent , e .toString (), null , false );
860
- return 0 ;
834
+ checkParam (param );
835
+ if (null == procMetadata ) {
836
+ return queryMetaMap .get (param ).precision ;
837
+ } else {
838
+ return (int ) getParameterInfo (param ).get ("PRECISION" );
861
839
}
862
840
}
863
841
864
842
@ Override
865
843
public int getScale (int param ) throws SQLServerException {
866
844
checkClosed ();
867
- try {
868
- if (procMetadata == null ) {
869
- // PreparedStatement.
870
- checkParam (param );
871
- return queryMetaMap .get (param ).scale ;
872
- } else {
873
- int nScale = (int ) getParameterInfo (param ).get ("SCALE" );
874
- return nScale ;
875
- }
876
- } catch (SQLException e ) {
877
- SQLServerException .makeFromDriverError (con , stmtParent , e .toString (), null , false );
878
- return 0 ;
845
+ checkParam (param );
846
+ if (null == procMetadata ) {
847
+ return queryMetaMap .get (param ).scale ;
848
+ } else {
849
+ return (int ) getParameterInfo (param ).get ("SCALE" );
879
850
}
880
851
}
881
852
882
853
@ Override
883
854
public int isNullable (int param ) throws SQLServerException {
884
855
checkClosed ();
885
- try {
886
- if (procMetadata == null ) {
887
- // PreparedStatement.
888
- checkParam (param );
889
- return queryMetaMap .get (param ).isNullable ;
890
- } else {
891
- int nNull = (int ) getParameterInfo (param ).get ("NULLABLE" );
892
- if (nNull == 1 )
893
- return parameterNullable ;
894
- if (nNull == 0 )
895
- return parameterNoNulls ;
896
- return parameterNullableUnknown ;
897
- }
898
- } catch (SQLException e ) {
899
- SQLServerException .makeFromDriverError (con , stmtParent , e .toString (), null , false );
900
- return parameterNoNulls ;
856
+ checkParam (param );
857
+ if (procMetadata == null ) {
858
+ return queryMetaMap .get (param ).isNullable ;
859
+ } else {
860
+ return (int ) getParameterInfo (param ).get ("NULLABLE" );
901
861
}
902
862
}
903
863
904
864
/**
905
865
* Returns if a supplied parameter index is valid.
906
866
*
907
867
* @param param
908
- * the param index
868
+ * the @ param index
909
869
* @throws SQLServerException
910
870
* when an error occurs
911
871
* @return boolean
912
872
*/
913
873
@ Override
914
874
public boolean isSigned (int param ) throws SQLServerException {
915
875
checkClosed ();
876
+ checkParam (param );
916
877
try {
917
- if (procMetadata == null ) {
918
- // PreparedStatement.
919
- checkParam (param );
878
+ if (null == procMetadata ) {
920
879
return queryMetaMap .get (param ).isSigned ;
921
880
} else {
922
881
return JDBCType .of ((short ) getParameterInfo (param ).get ("DATA_TYPE" )).isSigned ();
923
882
}
924
883
} catch (SQLException e ) {
925
- SQLServerException .makeFromDriverError (con , stmtParent , e .toString (), null , false );
884
+ SQLServerException .makeFromDriverError (con , stmtParent , e .getMessage (), null , false );
926
885
return false ;
927
886
}
928
887
}
929
888
930
889
String getTVPSchemaFromStoredProcedure (int param ) throws SQLServerException {
931
890
checkClosed ();
891
+ checkParam (param );
932
892
return (String ) getParameterInfo (param ).get ("SS_TYPE_SCHEMA_NAME" );
933
893
}
934
894
}
0 commit comments