2010-11-17 1 views
5

Je tente de charger une table contenant une colonne d'identité avec unité DB. Je veux pouvoir définir moi-même la valeur de l'identifiant (je ne veux pas que la base de données le génère pour moi).Activation d'IDENTITY_INSERT sur une table pour le charger avec l'unité DB

Voici une définition minimale de ma table

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

Pour insérer une ligne dans X, j'exécute SQL

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

Pas de problème. Mais lorsque je tente de charger ce tableau avec l'ensemble de données XML unité db suivant (RS_7_10_minimal_ini.xml)

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

en utilisant le cas de test JUnit minimal (DBTestCase) suivant:

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() { 
     // ... 
} 
} 

Il échoue avec les éléments suivants exception

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

Il semble DB l'appareil ne se met pas en identité avant d'insérer une ligne pour laquelle est spécifiée la valeur de la colonne d'identité.

J'ai déjà essayé de m'exécuter sur la connexion récupérée à partir du JdbcDataBaseTester mais pas de chance. Probablement une nouvelle connexion ou pas la même connexion utilisée pour pousser les données dans de DB.

Une idée?

Merci beaucoup pour votre aide à tous!

Octave

Répondre

9

Oui, trouvé la solution dans la FAQ DBUnit fait

Puis-je utiliser DbUnit avec des colonnes d'identité ou auto-incrément?

De nombreux SGBDR autorisent l'écrasement implicite des colonnes IDENTITY et auto-incrémentées avec les valeurs client. DbUnit peut être utilisé avec ces SGBDR nativement. Certaines bases de données, telles que MS SQL Server et Sybase, doivent explicitement activer l'écriture de valeurs client. La façon d'activer cette fonctionnalité est spécifique au fournisseur. DbUnit fournit cette fonctionnalité pour MS SQL Server avec la classe InsertIdentityOperation.

Bien qu'il soit écrit pour MS SQL Server, il fonctionne également pour Sybase. Donc, je pousse mon ensemble de données à db avec

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

Et voilà.

Merci pour votre réponse rawheiser.

+1

Est-ce une faute de frappe ou le nom a-t-il changé en InsertIdentityOperation? Dans 'getSetUpOperation()', j'ai utilisé 'return new InsertIdentityOperation (DatabaseOperation.CLEAN_INSERT); ' – dustmachine

+0

Vous êtes un sauveteur :) merci beaucoup ... –

1

Pas assez familier avec DBUnit pour vous aider avec les détails; mais j'ai utilisé une table tronquée et réapparaissant la valeur d'identité dans des situations similaires.

dbcc checkident 
Questions connexes