Commons DbUtils
  1. Commons DbUtils
  2. DBUTILS-44

QueryRunner#fillStatement setNull all database fix proposal

    Details

    • Type: Bug Bug
    • Status: Closed
    • Priority: Major Major
    • Resolution: Fixed
    • Affects Version/s: 1.1
    • Fix Version/s: None
    • Labels:
      None

      Description

      There is currently many open issues ( DBUTILS-14, DBUTILS-31, DBUTILS-39 and DBUTILS-41) concerning the problem with setNull(i+1, Types.VARCHAR) in the QueryRunner#fillStatement method when the given object is null.

      I use Commons DbUtils in several projects, and I have found a workaround which works for any database:
      The problem is that when the object is null, the API does not know to which SQL TYPE it should map the object to.

      I've added an Interface, named SQLParam, which exactely resolve this problem:

      public interface SQLParam {
          /**
           * Returns the object
           * 
           * @return the object
           */
          public Object getObject();
      
          /**
           * Returns the SQL type of the object,
           * must be one of {@link java.sql.Types}
           * 
           * @return the type of the object
           * @see java.sql.Types
           */
          public int getType();
      }
      

      Then I've changed the QueryRunner API, by replacing all Object param and Object[] params by SQLParam param and SQLParam[] params (in a new QueryRunnerSQLParam class).

      It does work just well for me; any comments gladly appreciated.

      1. QueryRunnerSQLParam.java
        19 kB
        Julien Aymé
      2. SQLParam.java
        0.5 kB
        Julien Aymé
      3. SQLParamBuilder.java
        8 kB
        Julien Aymé
      4. SQLParamImpl.java
        4 kB
        Julien Aymé

        Activity

        Dan Fabulich made changes -
        Fix Version/s 1.2 [ 12312139 ]
        Henri Yandell made changes -
        Status Open [ 1 ] Closed [ 6 ]
        Resolution Fixed [ 1 ]
        Dennis Lundberg made changes -
        Description There is currently many open issues ( DBUTILS-14, DBUTILS-31, DBUTILS-39 and DBUTILS-41) concerning the problem with setNull(i+1, Types.VARCHAR) in the QueryRunner#fillStatement method when the given object is null.

        I use Commons DbUtils in several projects, and I have found a workaround which works for any database:
        The problem is that when the object is null, the API does not know to which SQL TYPE it should map the object to.

        I've added an Interface, named SQLParam, which exactely resolve this problem:
        public interface SQLParam {

            /**
             * Returns the object
             *
             * @return the object
             */
            public Object getObject();

            /**
             * Returns the SQL type of the object,
             * must be one of {@link java.sql.Types}
             *
             * @return the type of the object
             * @see java.sql.Types
             */
            public int getType();
        }

        Then I've changed the QueryRunner API, by replacing all Object param and Object[] params by SQLParam param and SQLParam[] params (in a new QueryRunnerSQLParam class).

        It does work just well for me; any comments gladly appreciated.
        There is currently many open issues ( DBUTILS-14, DBUTILS-31, DBUTILS-39 and DBUTILS-41) concerning the problem with setNull(i+1, Types.VARCHAR) in the QueryRunner#fillStatement method when the given object is null.

        I use Commons DbUtils in several projects, and I have found a workaround which works for any database:
        The problem is that when the object is null, the API does not know to which SQL TYPE it should map the object to.

        I've added an Interface, named SQLParam, which exactely resolve this problem:

        {code}
        public interface SQLParam {
            /**
             * Returns the object
             *
             * @return the object
             */
            public Object getObject();

            /**
             * Returns the SQL type of the object,
             * must be one of {@link java.sql.Types}
             *
             * @return the type of the object
             * @see java.sql.Types
             */
            public int getType();
        }
        {code}

        Then I've changed the QueryRunner API, by replacing all Object param and Object[] params by SQLParam param and SQLParam[] params (in a new QueryRunnerSQLParam class).

        It does work just well for me; any comments gladly appreciated.
        Julien Aymé made changes -
        Attachment SQLParamImpl.java [ 12374539 ]
        Attachment SQLParamBuilder.java [ 12374540 ]
        Julien Aymé made changes -
        Field Original Value New Value
        Attachment SQLParam.java [ 12374536 ]
        Attachment QueryRunnerSQLParam.java [ 12374537 ]
        Julien Aymé created issue -

          People

          • Assignee:
            Unassigned
            Reporter:
            Julien Aymé
          • Votes:
            0 Vote for this issue
            Watchers:
            0 Start watching this issue

            Dates

            • Created:
              Updated:
              Resolved:

              Development