2010-11-17 23 views
5

Provo a caricare una tabella, che ha una colonna Identity, con DB Unit. Voglio essere in grado di impostare il valore id da solo (non voglio che il database lo generi per me).Attivazione di IDENTITY_INSERT su una tabella per caricarlo con DB Unità

Ecco una definizione minima del mio tavolo

create table X (
id numeric(10,0) IDENTITY PRIMARY KEY NOT NULL 
) 

Per inserire una riga in X, eseguo il seguente SQL

set INDENTITY_INSERT X ON 
insert into X(id) VALUES(666) 

Nessun problema. Ma quando provo a caricare questa tabella con il seguente db dataset unità XML (RS_7_10_minimal_ini.xml)

<dataset> 
<X id="666"/> 
</dataset> 

utilizzando il seguente JUnit minima (DBTestCase) banco di prova:

package lms.lp.functionnal_config; 

import java.io.FileInputStream; 
import org.dbunit.DBTestCase; 
import org.dbunit.PropertiesBasedJdbcDatabaseTester; 
import org.dbunit.dataset.IDataSet; 
import org.dbunit.dataset.xml.FlatXmlDataSetBuilder; 
import lms.DBUnitConfig; 
import org.junit.Test; 

public class SampleTest extends DBTestCase 

{ 

public SampleTest(String name) 

{ 
    super(name); 
    System.setProperty(PropertiesBasedJdbcDatabaseTester.DBUNIT_DRIVER_CLASS, DBUnitConfig.DBUNIT_DRIVER_CLASS); 
    System.setProperty(PropertiesBasedJdbcDatabaseTester.DBUNIT_CONNECTION_URL, DBUnitConfig.DBUNIT_CONNECTION_URL); 
    System.setProperty(PropertiesBasedJdbcDatabaseTester.DBUNIT_USERNAME, DBUnitConfig.DBUNIT_USERNAME); 
    System.setProperty(PropertiesBasedJdbcDatabaseTester.DBUNIT_PASSWORD, DBUnitConfig.DBUNIT_PASSWORD); 

} 

protected IDataSet getDataSet() throws Exception 

{ 
    return new FlatXmlDataSetBuilder().build(new FileInputStream("src/test/resources/RS_7_10_minimal_ini.xml")); 
} 


@Test 
public void testXXX() { 
     // ... 
} 
} 

Si riesce con il seguente eccezione

com.sybase.jdbc3.jdbc.SybSQLException: Explicit value specified for identity field in table 'X' when 'SET IDENTITY_INSERT' is OFF. 

sembra DB unità non si accende identità ON prima di inserire una riga per cui viene specificato il valore della colonna di identità.

Ho già provato ad eseguirmi sulla connessione recuperata dal JdbcDataBaseTester ma senza fortuna. Probabilmente una nuova connessione o non la stessa connessione utilizzata per inserire i dati in de DB.

Qualche idea?

Grazie mille per il vostro aiuto!

Octave

risposta

9

Sì, ha trovato la soluzione nel DBUnit FAQ realtà

Posso usare DBUnit con l'identità o auto-incremento colonne?

Molti RDBMS consentono alle colonne IDENTITY e di incremento automatico di essere sovrascritte implicitamente con i valori del client. DbUnit può essere utilizzato con questi RDBMS in modo nativo. Alcuni database, come MS SQL Server e Sybase, devono attivare esplicitamente la scrittura dei valori dei client. Il modo per attivare questa funzione è specifico del fornitore. DbUnit fornisce questa funzionalità per MS SQL Server con la classe InsertIdentityOperation.

Sebbene sia stato scritto per MS SQL Server, funziona anche per Sybase. Quindi invio il mio set di dati a db con

new InsertIndentityOperation(DatabaseOperation.CLEAN_INSERT).execute(connection,initialDataSet); 

Et voilà.

Grazie per la tua risposta rawheiser.

+1

È un errore di battitura o il nome è cambiato in InsertIdentityOperation? Nel mio 'getSetUpOperation()' ho usato 'return new InsertIdentityOperation (DatabaseOperation.CLEAN_INSERT); ' – dustmachine

+0

Sei un vero risparmiatore :) grazie mille ... –

1

Non abbastanza familiarità con DBUnit per aiutarvi con le specifiche; ma ho usato una tabella troncata e ricomporre il valore dell'identità in situazioni simili.

dbcc checkident