| <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2//EN"> |
| <HTML> |
| <head> |
| <META HTTP-EQUIV="CONTENT-TYPE" CONTENT="text/html; charset=windows-1252"> |
| <TITLE>The creation and retrieving of auto increment values</TITLE> |
| <META NAME="GENERATOR" CONTENT="StarOffice 6.0 (Win32)"> |
| <META NAME="AUTHOR" CONTENT="Ocke Janssen"> |
| <META NAME="CREATED" CONTENT="20020710;8345700"> |
| <META NAME="CHANGEDBY" CONTENT="Ocke Janssen"> |
| <META NAME="CHANGED" CONTENT="20020729;8060399"> |
| <STYLE> |
| <!-- |
| @page { margin: 2cm } |
| TD P { margin-bottom: 0.21cm } |
| H1 { margin-bottom: 0.21cm } |
| H1.western { font-family: "Albany", sans-serif; font-size: 16pt } |
| H1.cjk { font-size: 16pt } |
| H1.ctl { font-size: 16pt } |
| P { margin-bottom: 0.21cm } |
| H2 { margin-bottom: 0.21cm } |
| H2.western { font-family: "Albany", sans-serif; font-size: 14pt; font-style: italic } |
| H2.cjk { font-size: 14pt; font-style: italic } |
| H2.ctl { font-size: 14pt; font-style: italic } |
| H3 { margin-bottom: 0.21cm } |
| H3.western { font-family: "Albany", sans-serif } |
| H4 { margin-bottom: 0.21cm } |
| H4.western { font-family: "Albany", sans-serif; font-size: 11pt; font-style: italic } |
| H4.cjk { font-size: 11pt; font-style: italic } |
| H4.ctl { font-size: 11pt; font-style: italic } |
| TH P { margin-bottom: 0.21cm; font-style: italic } |
| --> |
| </STYLE> |
| </head> |
| <body LANG="en-US"> |
| <H1 CLASS="western" ALIGN=CENTER>The creation and retrieving of auto |
| increment values</H1> |
| <P><BR><BR> |
| </P> |
| <P>Version History</P> |
| <TABLE WIDTH=100% BORDER=1 BORDERCOLOR="#000000" CELLPADDING=4 CELLSPACING=0> |
| <COL WIDTH=128*> |
| <COL WIDTH=128*> |
| <THEAD> |
| <TR VALIGN=TOP> |
| <TH WIDTH=50%> |
| <P>What/When</P> |
| </TH> |
| <TH WIDTH=50%> |
| <P>Who</P> |
| </TH> |
| </TR> |
| </THEAD> |
| <TBODY> |
| <TR VALIGN=TOP> |
| <TD WIDTH=50%> |
| <P>Draft---July 18, 2002</P> |
| </TD> |
| <TD WIDTH=50%> |
| <P>Ocke Janssen</P> |
| </TD> |
| </TR> |
| <TR VALIGN=TOP> |
| <TD WIDTH=50%> |
| <P>GUI string review---July 25, 2002</P> |
| </TD> |
| <TD WIDTH=50%> |
| <P>Elizabeth Matthis</P> |
| </TD> |
| </TR> |
| <TR VALIGN=TOP> |
| <TD WIDTH=50%> |
| <P>GUI change---July 26, 2002</P> |
| </TD> |
| <TD WIDTH=50%> |
| <P>Ocke Janssen</P> |
| </TD> |
| </TR> |
| <TR VALIGN=TOP> |
| <TD WIDTH=50%> |
| <P>Final--- July 26, 2002fill in date |
| </P> |
| </TD> |
| <TD WIDTH=50%> |
| <P>Ocke Janssen</P> |
| </TD> |
| </TR> |
| </TBODY> |
| </TABLE> |
| <H1 CLASS="western"><BR><BR> |
| </H1> |
| <H2 CLASS="western">Problem description</H2> |
| <P>At the moment it is not possible to create auto increment columns |
| and to retrieve the value of an auto increment column when a new row |
| was inserted. |
| </P> |
| <H4 CLASS="western">Creation of auto increment columns</H4> |
| <P>Due to the fact that there exists no standard way on defining auto |
| increment columns when creating a new table, a general approach is |
| not possible. For example: MySQL identifies an auto increment |
| definition of a column with the key word “auto_increment”, |
| the MS SQL Server on the other side uses the keyword “increment(1,1)” |
| to identify the auto increment column. |
| </P> |
| <H4 CLASS="western">Retrieving of auto increment column's values</H4> |
| <P>The retrieving of an auto increment column's value, when inserting |
| a new row, is already defined in the JDBC API 3.0. There the |
| statement supports an additional method which returns a result set to |
| access the new inserted auto increment column's value. This result |
| set also supports meta data. To check if the statement supports this |
| mechanism, the database meta data is extended by new support method |
| which simply returns true or false.</P> |
| <H2 CLASS="western">Solution</H2> |
| <P>To allow a general approach of defining/retrieving auto increment |
| columns/values, the user must have the possibility to define a |
| statement which should be appended at the column definition when |
| creating a table or should be called when fetching the new value of |
| the auto increment column.</P> |
| <H4 CLASS="western">Creation of auto increment columns</H4> |
| <P>When creating tables for any kind of database, the current |
| handling at the moment is that we use a general SDBCX layer for all |
| database drivers which do not support the layer by their self. In |
| other words the user has to take no action when the database driver |
| supports already the SDBCX layer. For the case that the driver |
| doesn't support the SDBCX layer and the user creates a new table, the |
| generated SQL statement may look like this:</P> |
| <P>CREATE TABLE “table1” (“id” INTEGER)</P> |
| <P>The “CREATE TABLE” statement doesn't support any auto |
| increment features, so that it isn't possible to create such columns. |
| For MySQL this statement for an auto increment column looks like |
| this:</P> |
| <P>CREATE TABLE “table1” (“id” INTEGER |
| AUTO_INCREMENT)</P> |
| <P>Like this examples shows the user must have the opportunity to add |
| the missing part of the statement to the “CREATE TABLE” |
| statement. This can be done in two different ways which mustn't |
| exclude each other.</P> |
| <OL> |
| <LI><P>The data source stores in their info property an additional |
| string which should be appended to the column part when creating an |
| auto increment column. To allow the user to insert this string the |
| data source administration dialog could be extended by a simple text |
| field and may be an additional checkbox which enables this text |
| field.</P> |
| <LI><P>The table design offers an additional field on the column |
| properties area when an auto increment type was selected. This field |
| can be used by the user to define a string which should be appended |
| to the “CREATE TABLE” statement. |
| </P> |
| <LI><P>The points 1. and 2. are both used and under point 2, the |
| string which the user inserted under point 1 will be displayed in |
| the extra field.</P> |
| </OL> |
| <P>The 3<SUP>rd</SUP> approach would be the one which allows the user |
| the most flexibility to get a predefined string which he could change |
| if necessary. The best place to store the value for the data source |
| would be the data source administration dialog. To be more precise |
| this would be implemented for the JDBC and the ODBC drivers (they |
| don't support the SDBCX layer). All other drivers support the SDBCX |
| layer.</P> |
| <H4 CLASS="western">Retrieving of auto increment column's values</H4> |
| <P>As mentioned in the problem description JDBC 3.0 already defines |
| methods to accomplish the task but it is not possible just to forward |
| this to the used drivers. Many drivers as also APIs like ODBC don't |
| support this feature. To fit near all databases, a method has to be |
| implemented that allows to fetch the new inserted auto increment |
| value. Many databases support a special SQL statement which allows to |
| fetch this value. Mostly these statements are database specific and |
| not SQL conform. So a similar approach as for the creation of auto |
| increment columns should be chosen. The data source should also store |
| a SQL string which allows to fetch the auto increment values. This |
| string will then be executed by the statement when asked for the auto |
| increment values after inserting a new row. To be compatible as |
| possible to any kind of database the SQL string, stored in the data |
| source, must fulfill some additional specifications to be valid for |
| different tables. In other words, the SQL string must contain some |
| keywords like $column1 or $table1 which will be replaced with the |
| auto increment column name or with the used table. A general string |
| could already be inserted into the data source dialog which is not |
| the best solution but works for a lot of drivers:</P> |
| <P>“select count($column1)+1 from $table1”</P> |
| <P>If the supporting of this feature should be disabled the string |
| could be cleared by the user or an additional checkbox must be |
| inserted into to the dialog to enable or disable this feature. When |
| this feature is enabled the database meta data object implemented by |
| the driver will return false when asking the general support method |
| for the feature “AutoRetrievingEnabled” otherwise true. |
| When true was returned the statement object implemented by the driver |
| allows the creation of a result set to fetch the auto increment |
| values.</P> |
| <H2 CLASS="western" STYLE="page-break-before: always">Data source |
| administration dialog</H2> |
| <P><IMG SRC="AutoIncrementValues_html_m243b4459.gif" NAME="Graphic1" ALIGN=LEFT WIDTH=643 HEIGHT=391 BORDER=0><BR CLEAR=LEFT><BR><BR> |
| </P> |
| <P><BR><BR> |
| </P> |
| <TABLE WIDTH=100% BORDER=1 BORDERCOLOR="#000000" CELLPADDING=4 CELLSPACING=0> |
| <COL WIDTH=85*> |
| <COL WIDTH=85*> |
| <COL WIDTH=85*> |
| <THEAD> |
| <TR VALIGN=TOP> |
| <TH WIDTH=33%> |
| <P>English</P> |
| </TH> |
| <TH WIDTH=33%> |
| <P>German</P> |
| </TH> |
| <TH WIDTH=33%> |
| <P>Comment</P> |
| </TH> |
| </TR> |
| </THEAD> |
| <TBODY> |
| <TR VALIGN=TOP> |
| <TD WIDTH=33%> |
| <P>~Retrieve generated values</P> |
| </TD> |
| <TD WIDTH=33%> |
| <P>Generierte Werte ~berücksichtigen</P> |
| </TD> |
| <TD WIDTH=33%> |
| <P>Checkbox to enable this feature</P> |
| </TD> |
| </TR> |
| <TR VALIGN=TOP> |
| <TD WIDTH=33%> |
| <P>~Auto-increment statement</P> |
| </TD> |
| <TD WIDTH=33%> |
| <P>~Auto-Increment-Ausdruck</P> |
| </TD> |
| <TD WIDTH=33%> |
| <P>FixedText which contains the statement which should be |
| appended after each column definition</P> |
| </TD> |
| </TR> |
| <TR VALIGN=TOP> |
| <TD WIDTH=33%> |
| <P>~Query of generated values</P> |
| </TD> |
| <TD WIDTH=33%> |
| <P>Abfrage der generierten ~Werte</P> |
| </TD> |
| <TD WIDTH=33%> |
| <P>FixedText which contains the statement which will be called |
| after an “INSERT” statement</P> |
| </TD> |
| </TR> |
| </TBODY> |
| </TABLE> |
| <P><BR><BR> |
| </P> |
| <H3 CLASS="western">Table design</H3> |
| <P><IMG SRC="AutoIncrementValues_html_2f28066b.gif" NAME="Graphic2" ALIGN=LEFT WIDTH=642 HEIGHT=372 BORDER=0><BR CLEAR=LEFT><BR><BR> |
| </P> |
| <TABLE WIDTH=100% BORDER=1 BORDERCOLOR="#000000" CELLPADDING=4 CELLSPACING=0> |
| <COL WIDTH=85*> |
| <COL WIDTH=85*> |
| <COL WIDTH=85*> |
| <THEAD> |
| <TR VALIGN=TOP> |
| <TH WIDTH=33%> |
| <P>English</P> |
| </TH> |
| <TH WIDTH=33%> |
| <P>German</P> |
| </TH> |
| <TH WIDTH=33%> |
| <P>Comment</P> |
| </TH> |
| </TR> |
| </THEAD> |
| <TBODY> |
| <TR VALIGN=TOP> |
| <TD WIDTH=33%> |
| <P>Auto-increment statement</P> |
| </TD> |
| <TD WIDTH=33%> |
| <P>~Auto-Increment-Ausdruck</P> |
| </TD> |
| <TD WIDTH=33%> |
| <P>FixedText which contains the same value as the 2<SUP>nd</SUP> |
| FixedText in data source administration dialog</P> |
| </TD> |
| </TR> |
| <TR VALIGN=TOP> |
| <TD WIDTH=33%> |
| <P>Enter an SQL statement for the auto-increment field.\n\nThis |
| statement will be directly transferred to the database when the |
| table is created.</P> |
| </TD> |
| <TD WIDTH=33%> |
| <P>Geben Sie hier einen SQL Ausdruck für das |
| Auto-Increment-Feld an.\n\nDieser Ausdruck wird beim Erzeugen der |
| Tabelle direkt an die Datenbank übertragen.</P> |
| </TD> |
| <TD WIDTH=33%> |
| <P>HelpText for this field which appears in the left side control</P> |
| </TD> |
| </TR> |
| </TBODY> |
| </TABLE> |
| <P><BR><BR> |
| </P> |
| </body> |
| </HTML> |