From: | "Andres Olarte" <olarte(dot)andres(at)gmail(dot)com> |
---|---|
To: | "vasylenko(at)uksatse(dot)org(dot)ua" <vasylenko(at)uksatse(dot)org(dot)ua> |
Cc: | pgsql-jdbc(at)postgresql(dot)org |
Subject: | Re: |
Date: | 2007-01-12 14:01:12 |
Message-ID: | 3fccaa690701120601g78c45dfcj3547085875e5966a@mail.gmail.com |
Views: | Raw Message | Whole Thread | Download mbox | Resend email |
Thread: | |
Lists: | pgsql-jdbc |
Two things that you might check for, but I think your problem is number 2.
1- Is the ResultSet updateable? Basically you create your Statement like this:
stmt=conn.createStatement
(ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_UPDATABLE)
2- Does your table have a oid and a primary key defined? Are you
selecting them in the ? You need to select those two (or at least
one, I'm not sure) in the ResultSet to be able to insert. Just do a
"SELECT * FROM table.schema LIMIT 1" to be sure
On 1/12/07, vasylenko(at)uksatse(dot)org(dot)ua <vasylenko(at)uksatse(dot)org(dot)ua> wrote:
>
>
>
> Ok, Dave
> your question:
> >Can you explain this more, or send a small test case. There should be
> >no reason to get a primary key simply to move to insert row.
> >We do need the primary key in the dataset, but other than that we
> >shouldn't fail on move to insert row ?
>
> I have just trased into moveToInsertRow() method step by step.
>
> Firstly, it try to find oid field in result set
> Than it looking for Primary Key in result.
>
> That's all what I have done.
>
> there 3 method
> moveToInsertRow()
> checkUpdateblet()
> isUpdateable()
>
> the exception is thrown in the last method.
>
>
> public synchronized void moveToInsertRow()
> throws SQLException
> {
> checkUpdateable();
>
> if (insertStatement != null)
> {
> insertStatement = null;
> }
>
>
> // make sure the underlying data is null
> clearRowBuffer(false);
>
> onInsertRow = true;
> doingUpdates = false;
>
> }
>
>
>
> private void checkUpdateable() throws SQLException
> {
> checkClosed();
>
> if (!isUpdateable())
> throw new PSQLException(GT.tr("ResultSet is not updateable.
> The query that generated this result set must select only one table, and
> must select all primary keys from that table. See the JDBC 2.1 API
> Specification, section 5.6 for more details."),
> PSQLState.INVALID_CURSOR_STATE);
>
> if (updateValues == null)
> {
> // allow every column to be updated without a rehash.
> updateValues = new HashMap((int)(fields.length / 0.75), 0.75f);
> }
> }
>
>
>
>
>
>
> boolean isUpdateable() throws SQLException
> {
> checkClosed();
>
> if (resultsetconcurrency == ResultSet.CONCUR_READ_ONLY)
> throw new PSQLException(GT.tr("ResultSets with concurrency
> CONCUR_READ_ONLY cannot be updated."),
> PSQLState.INVALID_CURSOR_STATE);
>
> if (updateable)
> return true;
>
> if ( Driver.logDebug )
> Driver.debug("checking if rs is updateable");
>
> parseQuery();
>
> if ( singleTable == false )
> {
> if ( Driver.logDebug )
> Driver.debug("not a single table");
> return false;
> }
>
> if ( Driver.logDebug )
> Driver.debug("getting primary keys");
>
> //
> // Contains the primary key?
> //
>
> primaryKeys = new Vector();
>
> // this is not stricty jdbc spec, but it will make things much
> faster if used
> // the user has to select oid, * from table and then we will just
> use oid
>
>
> usingOID = false;
> int oidIndex = 0;
> try
> {
> oidIndex = findColumn( "oid" );
> }
> catch (SQLException l_se)
> {
> //Ignore if column oid isn't selected
> }
> int i = 0;
>
>
> // if we find the oid then just use it
>
> //oidIndex will be >0 if the oid was in the select list
> if ( oidIndex > 0 )
> {
> i++;
> primaryKeys.add( new PrimaryKey( oidIndex, "oid" ) );
> usingOID = true;
> }
> else
> {
> // otherwise go and get the primary keys and create a hashtable
> of keys
> String[] s = quotelessTableName(tableName);
> String quotelessTableName = s[0];
> String quotelessSchemaName = s[1];
> java.sql.ResultSet rs = ((java.sql.Connection)
> connection).getMetaData().getPrimaryKeys("", quotelessSchemaName,
> quotelessTableName);
> for (; rs.next(); i++ )
> {
> String columnName = rs.getString(4); // get the columnName
> int index = findColumn( columnName );
>
> if ( index > 0 )
> {
> primaryKeys.add( new PrimaryKey(index, columnName ) );
> // get the primary key information
> }
> }
>
> rs.close();
> }
>
> if ( Driver.logDebug )
> Driver.debug( "no of keys=" + i );
>
> if ( i < 1 )
> {
> throw new PSQLException(GT.tr("No primary key found for table
> {0}.", tableName),
> PSQLState.DATA_ERROR);
> }
>
> updateable = primaryKeys.size() > 0;
>
> if ( Driver.logDebug )
> Driver.debug( "checking primary key " + updateable );
>
> return updateable;
> }
>
>
> ---------------------------(end of broadcast)---------------------------
> TIP 1: if posting/reading through Usenet, please send an appropriate
> subscribe-nomail command to majordomo(at)postgresql(dot)org so that your
> message can get through to the mailing list cleanly
>
From | Date | Subject | |
---|---|---|---|
Next Message | James Neff | 2007-01-12 14:14:13 | Re: exclusive locking on SELECT ? |
Previous Message | vasylenko | 2007-01-12 08:59:51 | Re: |