@@ -115,6 +115,26 @@ enum CallableStatementGetterSetterMethod {
115115
116116 @ Override
117117 public void registerOutParameter (int index , int sqlType ) throws SQLServerException {
118+ // Register output parameter by index
119+ isSetByIndex = true ;
120+ if (!connection .getUseFlexibleCallableStatements () && isSetByName && isSetByIndex ) {
121+ SQLServerException .makeFromDriverError (connection , this ,
122+ SQLServerException .getErrString ("R_noNamedAndIndexedParameters" ), null , false );
123+ }
124+ registerOutputParameter (index , sqlType );
125+ }
126+
127+ private void registerOutParameterByName (int index , int sqlType ) throws SQLServerException {
128+ // Register output parameter by name -- findColumn() sets the 'setByName' flag
129+ registerOutputParameter (index , sqlType );
130+ }
131+
132+ void registerOutParameterNonPLP (int index , int sqlType ) throws SQLServerException {
133+ registerOutParameter (index , sqlType );
134+ inOutParam [index - 1 ].isNonPLP = true ;
135+ }
136+
137+ private void registerOutputParameter (int index , int sqlType ) throws SQLServerException {
118138 if (loggerExternal .isLoggable (java .util .logging .Level .FINER ))
119139 loggerExternal .entering (getClassNameLogging (), "registerOutParameter" , new Object [] {index , sqlType });
120140 checkClosed ();
@@ -171,11 +191,6 @@ public void registerOutParameter(int index, int sqlType) throws SQLServerExcepti
171191 loggerExternal .exiting (getClassNameLogging (), "registerOutParameter" );
172192 }
173193
174- void registerOutParameterNonPLP (int index , int sqlType ) throws SQLServerException {
175- registerOutParameter (index , sqlType );
176- inOutParam [index - 1 ].isNonPLP = true ;
177- }
178-
179194 /**
180195 * Locate any output parameter values returned from the procedure call
181196 */
@@ -542,6 +557,7 @@ private Object getSQLXMLInternal(int parameterIndex) throws SQLServerException {
542557
543558 @ Override
544559 public int getInt (int index ) throws SQLServerException {
560+ setByIndex ();
545561 loggerExternal .entering (getClassNameLogging (), "getInt" , index );
546562 checkClosed ();
547563 Integer value = (Integer ) getValue (index , JDBCType .INTEGER );
@@ -561,6 +577,7 @@ public int getInt(String parameterName) throws SQLServerException {
561577
562578 @ Override
563579 public String getString (int index ) throws SQLServerException {
580+ setByIndex ();
564581 loggerExternal .entering (getClassNameLogging (), "getString" , index );
565582 checkClosed ();
566583 String value = null ;
@@ -588,6 +605,7 @@ public String getString(String parameterName) throws SQLServerException {
588605
589606 @ Override
590607 public final String getNString (int parameterIndex ) throws SQLException {
608+ setByIndex ();
591609 loggerExternal .entering (getClassNameLogging (), "getNString" , parameterIndex );
592610 checkClosed ();
593611 String value = (String ) getValue (parameterIndex , JDBCType .NCHAR );
@@ -611,6 +629,7 @@ public final String getNString(String parameterName) throws SQLException {
611629 @ Deprecated (since = "6.5.4" )
612630 @ Override
613631 public BigDecimal getBigDecimal (int parameterIndex , int scale ) throws SQLException {
632+ setByIndex ();
614633 if (loggerExternal .isLoggable (java .util .logging .Level .FINER ))
615634 loggerExternal .entering (getClassNameLogging (), "getBigDecimal" , new Object [] {parameterIndex , scale });
616635 checkClosed ();
@@ -640,6 +659,7 @@ public BigDecimal getBigDecimal(String parameterName, int scale) throws SQLServe
640659
641660 @ Override
642661 public boolean getBoolean (int index ) throws SQLServerException {
662+ setByIndex ();
643663 loggerExternal .entering (getClassNameLogging (), "getBoolean" , index );
644664 checkClosed ();
645665 Boolean value = (Boolean ) getValue (index , JDBCType .BIT );
@@ -659,6 +679,7 @@ public boolean getBoolean(String parameterName) throws SQLServerException {
659679
660680 @ Override
661681 public byte getByte (int index ) throws SQLServerException {
682+ setByIndex ();
662683 loggerExternal .entering (getClassNameLogging (), "getByte" , index );
663684 checkClosed ();
664685 Short shortValue = (Short ) getValue (index , JDBCType .TINYINT );
@@ -680,6 +701,7 @@ public byte getByte(String parameterName) throws SQLServerException {
680701
681702 @ Override
682703 public byte [] getBytes (int index ) throws SQLServerException {
704+ setByIndex ();
683705 loggerExternal .entering (getClassNameLogging (), "getBytes" , index );
684706 checkClosed ();
685707 byte [] value = (byte []) getValue (index , JDBCType .BINARY );
@@ -699,6 +721,7 @@ public byte[] getBytes(String parameterName) throws SQLServerException {
699721
700722 @ Override
701723 public Date getDate (int index ) throws SQLServerException {
724+ setByIndex ();
702725 loggerExternal .entering (getClassNameLogging (), "getDate" , index );
703726 checkClosed ();
704727 java .sql .Date value = (java .sql .Date ) getValue (index , JDBCType .DATE );
@@ -718,6 +741,7 @@ public Date getDate(String parameterName) throws SQLServerException {
718741
719742 @ Override
720743 public Date getDate (int index , Calendar cal ) throws SQLServerException {
744+ setByIndex ();
721745 if (loggerExternal .isLoggable (java .util .logging .Level .FINER ))
722746 loggerExternal .entering (getClassNameLogging (), "getDate" , new Object [] {index , cal });
723747 checkClosed ();
@@ -739,6 +763,7 @@ public Date getDate(String parameterName, Calendar cal) throws SQLServerExceptio
739763
740764 @ Override
741765 public double getDouble (int index ) throws SQLServerException {
766+ setByIndex ();
742767 loggerExternal .entering (getClassNameLogging (), "getDouble" , index );
743768 checkClosed ();
744769 Double value = (Double ) getValue (index , JDBCType .DOUBLE );
@@ -758,6 +783,7 @@ public double getDouble(String parameterName) throws SQLServerException {
758783
759784 @ Override
760785 public float getFloat (int index ) throws SQLServerException {
786+ setByIndex ();
761787 loggerExternal .entering (getClassNameLogging (), "getFloat" , index );
762788 checkClosed ();
763789 Float value = (Float ) getValue (index , JDBCType .REAL );
@@ -777,7 +803,7 @@ public float getFloat(String parameterName) throws SQLServerException {
777803
778804 @ Override
779805 public long getLong (int index ) throws SQLServerException {
780-
806+ setByIndex ();
781807 loggerExternal .entering (getClassNameLogging (), "getLong" , index );
782808 checkClosed ();
783809 Long value = (Long ) getValue (index , JDBCType .BIGINT );
@@ -797,7 +823,7 @@ public long getLong(String parameterName) throws SQLServerException {
797823
798824 @ Override
799825 public Object getObject (int index ) throws SQLServerException {
800-
826+ setByIndex ();
801827 loggerExternal .entering (getClassNameLogging (), "getObject" , index );
802828 checkClosed ();
803829 Object value = getValue (index ,
@@ -809,6 +835,7 @@ public Object getObject(int index) throws SQLServerException {
809835
810836 @ Override
811837 public <T > T getObject (int index , Class <T > type ) throws SQLException {
838+ setByIndex ();
812839 loggerExternal .entering (getClassNameLogging (), "getObject" , index );
813840 checkClosed ();
814841 Object returnValue ;
@@ -923,6 +950,7 @@ public <T> T getObject(String parameterName, Class<T> type) throws SQLException
923950
924951 @ Override
925952 public short getShort (int index ) throws SQLServerException {
953+ setByIndex ();
926954 loggerExternal .entering (getClassNameLogging (), "getShort" , index );
927955 checkClosed ();
928956 Short value = (Short ) getValue (index , JDBCType .SMALLINT );
@@ -942,7 +970,7 @@ public short getShort(String parameterName) throws SQLServerException {
942970
943971 @ Override
944972 public Time getTime (int index ) throws SQLServerException {
945-
973+ setByIndex ();
946974 loggerExternal .entering (getClassNameLogging (), "getTime" , index );
947975 checkClosed ();
948976 java .sql .Time value = (java .sql .Time ) getValue (index , JDBCType .TIME );
@@ -962,6 +990,7 @@ public Time getTime(String parameterName) throws SQLServerException {
962990
963991 @ Override
964992 public Time getTime (int index , Calendar cal ) throws SQLServerException {
993+ setByIndex ();
965994 if (loggerExternal .isLoggable (java .util .logging .Level .FINER ))
966995 loggerExternal .entering (getClassNameLogging (), "getTime" , new Object [] {index , cal });
967996 checkClosed ();
@@ -983,6 +1012,7 @@ public Time getTime(String parameterName, Calendar cal) throws SQLServerExceptio
9831012
9841013 @ Override
9851014 public Timestamp getTimestamp (int index ) throws SQLServerException {
1015+ setByIndex ();
9861016 if (loggerExternal .isLoggable (java .util .logging .Level .FINER ))
9871017 loggerExternal .entering (getClassNameLogging (), GET_TIMESTAMP , index );
9881018 checkClosed ();
@@ -1003,6 +1033,7 @@ public Timestamp getTimestamp(String parameterName) throws SQLServerException {
10031033
10041034 @ Override
10051035 public Timestamp getTimestamp (int index , Calendar cal ) throws SQLServerException {
1036+ setByIndex ();
10061037 if (loggerExternal .isLoggable (java .util .logging .Level .FINER ))
10071038 loggerExternal .entering (getClassNameLogging (), GET_TIMESTAMP , new Object [] {index , cal });
10081039 checkClosed ();
@@ -1024,6 +1055,7 @@ public Timestamp getTimestamp(String parameterName, Calendar cal) throws SQLServ
10241055 }
10251056
10261057 LocalDateTime getLocalDateTime (int columnIndex ) throws SQLServerException {
1058+ setByIndex ();
10271059 loggerExternal .entering (getClassNameLogging (), "getLocalDateTime" , columnIndex );
10281060 checkClosed ();
10291061 LocalDateTime value = (LocalDateTime ) getValue (columnIndex , JDBCType .LOCALDATETIME );
@@ -1033,6 +1065,7 @@ LocalDateTime getLocalDateTime(int columnIndex) throws SQLServerException {
10331065
10341066 @ Override
10351067 public Timestamp getDateTime (int index ) throws SQLServerException {
1068+ setByIndex ();
10361069 if (loggerExternal .isLoggable (java .util .logging .Level .FINER ))
10371070 loggerExternal .entering (getClassNameLogging (), "getDateTime" , index );
10381071 checkClosed ();
@@ -1053,6 +1086,7 @@ public Timestamp getDateTime(String parameterName) throws SQLServerException {
10531086
10541087 @ Override
10551088 public Timestamp getDateTime (int index , Calendar cal ) throws SQLServerException {
1089+ setByIndex ();
10561090 if (loggerExternal .isLoggable (java .util .logging .Level .FINER ))
10571091 loggerExternal .entering (getClassNameLogging (), "getDateTime" , new Object [] {index , cal });
10581092 checkClosed ();
@@ -1075,6 +1109,7 @@ public Timestamp getDateTime(String parameterName, Calendar cal) throws SQLServe
10751109
10761110 @ Override
10771111 public Timestamp getSmallDateTime (int index ) throws SQLServerException {
1112+ setByIndex ();
10781113 if (loggerExternal .isLoggable (java .util .logging .Level .FINER ))
10791114 loggerExternal .entering (getClassNameLogging (), "getSmallDateTime" , index );
10801115 checkClosed ();
@@ -1096,6 +1131,7 @@ public Timestamp getSmallDateTime(String parameterName) throws SQLServerExceptio
10961131
10971132 @ Override
10981133 public Timestamp getSmallDateTime (int index , Calendar cal ) throws SQLServerException {
1134+ setByIndex ();
10991135 if (loggerExternal .isLoggable (java .util .logging .Level .FINER ))
11001136 loggerExternal .entering (getClassNameLogging (), "getSmallDateTime" , new Object [] {index , cal });
11011137 checkClosed ();
@@ -1118,6 +1154,7 @@ public Timestamp getSmallDateTime(String parameterName, Calendar cal) throws SQL
11181154
11191155 @ Override
11201156 public microsoft .sql .DateTimeOffset getDateTimeOffset (int index ) throws SQLServerException {
1157+ setByIndex ();
11211158 if (loggerExternal .isLoggable (java .util .logging .Level .FINER ))
11221159 loggerExternal .entering (getClassNameLogging (), "getDateTimeOffset" , index );
11231160 checkClosed ();
@@ -1163,6 +1200,7 @@ public boolean wasNull() throws SQLServerException {
11631200
11641201 @ Override
11651202 public final java .io .InputStream getAsciiStream (int parameterIndex ) throws SQLServerException {
1203+ setByIndex ();
11661204 loggerExternal .entering (getClassNameLogging (), "getAsciiStream" , parameterIndex );
11671205 checkClosed ();
11681206 InputStream value = (InputStream ) getStream (parameterIndex , StreamType .ASCII );
@@ -1182,6 +1220,7 @@ public final java.io.InputStream getAsciiStream(String parameterName) throws SQL
11821220
11831221 @ Override
11841222 public BigDecimal getBigDecimal (int parameterIndex ) throws SQLServerException {
1223+ setByIndex ();
11851224 loggerExternal .entering (getClassNameLogging (), "getBigDecimal" , parameterIndex );
11861225 checkClosed ();
11871226 BigDecimal value = (BigDecimal ) getValue (parameterIndex , JDBCType .DECIMAL );
@@ -1201,6 +1240,7 @@ public BigDecimal getBigDecimal(String parameterName) throws SQLServerException
12011240
12021241 @ Override
12031242 public BigDecimal getMoney (int parameterIndex ) throws SQLServerException {
1243+ setByIndex ();
12041244 loggerExternal .entering (getClassNameLogging (), "getMoney" , parameterIndex );
12051245 checkClosed ();
12061246 BigDecimal value = (BigDecimal ) getValue (parameterIndex , JDBCType .MONEY );
@@ -1220,6 +1260,7 @@ public BigDecimal getMoney(String parameterName) throws SQLServerException {
12201260
12211261 @ Override
12221262 public BigDecimal getSmallMoney (int parameterIndex ) throws SQLServerException {
1263+ setByIndex ();
12231264 loggerExternal .entering (getClassNameLogging (), "getSmallMoney" , parameterIndex );
12241265 checkClosed ();
12251266 BigDecimal value = (BigDecimal ) getValue (parameterIndex , JDBCType .SMALLMONEY );
@@ -1239,6 +1280,7 @@ public BigDecimal getSmallMoney(String parameterName) throws SQLServerException
12391280
12401281 @ Override
12411282 public final java .io .InputStream getBinaryStream (int parameterIndex ) throws SQLServerException {
1283+ setByIndex ();
12421284 loggerExternal .entering (getClassNameLogging (), "getBinaryStream" , parameterIndex );
12431285 checkClosed ();
12441286 InputStream value = (InputStream ) getStream (parameterIndex , StreamType .BINARY );
@@ -1258,6 +1300,7 @@ public final java.io.InputStream getBinaryStream(String parameterName) throws SQ
12581300
12591301 @ Override
12601302 public Blob getBlob (int parameterIndex ) throws SQLServerException {
1303+ setByIndex ();
12611304 loggerExternal .entering (getClassNameLogging (), "getBlob" , parameterIndex );
12621305 checkClosed ();
12631306 Blob value = (Blob ) getValue (parameterIndex , JDBCType .BLOB );
@@ -1277,6 +1320,7 @@ public Blob getBlob(String parameterName) throws SQLServerException {
12771320
12781321 @ Override
12791322 public final java .io .Reader getCharacterStream (int parameterIndex ) throws SQLServerException {
1323+ setByIndex ();
12801324 loggerExternal .entering (getClassNameLogging (), "getCharacterStream" , parameterIndex );
12811325 checkClosed ();
12821326 Reader reader = (Reader ) getStream (parameterIndex , StreamType .CHARACTER );
@@ -1296,6 +1340,7 @@ public final java.io.Reader getCharacterStream(String parameterName) throws SQLE
12961340
12971341 @ Override
12981342 public final java .io .Reader getNCharacterStream (int parameterIndex ) throws SQLException {
1343+ setByIndex ();
12991344 loggerExternal .entering (getClassNameLogging (), "getNCharacterStream" , parameterIndex );
13001345 checkClosed ();
13011346 Reader reader = (Reader ) getStream (parameterIndex , StreamType .NCHARACTER );
@@ -1327,6 +1372,7 @@ void closeActiveStream() throws SQLServerException {
13271372
13281373 @ Override
13291374 public Clob getClob (int parameterIndex ) throws SQLServerException {
1375+ setByIndex ();
13301376 loggerExternal .entering (getClassNameLogging (), "getClob" , parameterIndex );
13311377 checkClosed ();
13321378 Clob clob = (Clob ) getValue (parameterIndex , JDBCType .CLOB );
@@ -1346,6 +1392,7 @@ public Clob getClob(String parameterName) throws SQLServerException {
13461392
13471393 @ Override
13481394 public NClob getNClob (int parameterIndex ) throws SQLException {
1395+ setByIndex ();
13491396 loggerExternal .entering (getClassNameLogging (), "getNClob" , parameterIndex );
13501397 checkClosed ();
13511398 NClob nClob = (NClob ) getValue (parameterIndex , JDBCType .NCLOB );
@@ -2455,6 +2502,7 @@ public final void setSQLXML(String parameterName, SQLXML xmlObject) throws SQLEx
24552502
24562503 @ Override
24572504 public final SQLXML getSQLXML (int parameterIndex ) throws SQLException {
2505+ setByIndex ();
24582506 loggerExternal .entering (getClassNameLogging (), "getSQLXML" , parameterIndex );
24592507 checkClosed ();
24602508 SQLServerSQLXML value = (SQLServerSQLXML ) getSQLXMLInternal (parameterIndex );
@@ -2495,8 +2543,11 @@ public void registerOutParameter(String parameterName, int sqlType, String typeN
24952543 loggerExternal .entering (getClassNameLogging (), "registerOutParameter" ,
24962544 new Object [] {parameterName , sqlType , typeName });
24972545 checkClosed ();
2498- registerOutParameter (findColumn (parameterName , CallableStatementGetterSetterMethod .IS_SETTER_METHOD ), sqlType ,
2499- typeName );
2546+
2547+ int index = findColumn (parameterName , CallableStatementGetterSetterMethod .IS_SETTER_METHOD );
2548+
2549+ registerOutParameterByName (index , sqlType );
2550+
25002551 loggerExternal .exiting (getClassNameLogging (), "registerOutParameter" );
25012552 }
25022553
@@ -2506,8 +2557,12 @@ public void registerOutParameter(String parameterName, int sqlType, int scale) t
25062557 loggerExternal .entering (getClassNameLogging (), "registerOutParameter" ,
25072558 new Object [] {parameterName , sqlType , scale });
25082559 checkClosed ();
2509- registerOutParameter (findColumn (parameterName , CallableStatementGetterSetterMethod .IS_SETTER_METHOD ), sqlType ,
2510- scale );
2560+
2561+ int index = findColumn (parameterName , CallableStatementGetterSetterMethod .IS_SETTER_METHOD );
2562+
2563+ registerOutParameterByName (index , sqlType );
2564+ inOutParam [index - 1 ].setOutScale (scale );
2565+
25112566 loggerExternal .exiting (getClassNameLogging (), "registerOutParameter" );
25122567 }
25132568
@@ -2516,10 +2571,15 @@ public void registerOutParameter(String parameterName, int sqlType, int precisio
25162571 int scale ) throws SQLServerException {
25172572 if (loggerExternal .isLoggable (java .util .logging .Level .FINER ))
25182573 loggerExternal .entering (getClassNameLogging (), "registerOutParameter" ,
2519- new Object [] {parameterName , sqlType , scale });
2574+ new Object [] {parameterName , sqlType , scale , precision });
25202575 checkClosed ();
2521- registerOutParameter (findColumn (parameterName , CallableStatementGetterSetterMethod .IS_SETTER_METHOD ), sqlType ,
2522- precision , scale );
2576+
2577+ int index = findColumn (parameterName , CallableStatementGetterSetterMethod .IS_SETTER_METHOD );
2578+
2579+ registerOutParameterByName (index , sqlType );
2580+ inOutParam [index - 1 ].setValueLength (precision );
2581+ inOutParam [index - 1 ].setOutScale (scale );
2582+
25232583 loggerExternal .exiting (getClassNameLogging (), "registerOutParameter" );
25242584 }
25252585
@@ -2529,7 +2589,7 @@ public void registerOutParameter(String parameterName, int sqlType) throws SQLSe
25292589 loggerExternal .entering (getClassNameLogging (), "registerOutParameter" ,
25302590 new Object [] {parameterName , sqlType });
25312591 checkClosed ();
2532- registerOutParameter (findColumn (parameterName , CallableStatementGetterSetterMethod .IS_SETTER_METHOD ), sqlType );
2592+ registerOutParameterByName (findColumn (parameterName , CallableStatementGetterSetterMethod .IS_SETTER_METHOD ), sqlType );
25332593 loggerExternal .exiting (getClassNameLogging (), "registerOutParameter" );
25342594 }
25352595
0 commit comments