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
suivanteset 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
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
Vous êtes un sauveteur :) merci beaucoup ... –