Frage

ich versuche, eine Tabelle zu laden, die eine Identitätsspalte hat, mit DB-Einheit. Ich möchte die ID-Wert in der Lage sein, mich zu setzen (ich will nicht die Datenbank es für mich generieren).

Hier ist eine Minimaldefinition meiner Tabelle

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

eine Zeile in X einzufügen, ich die folgende SQL

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

Kein Problem. Aber wenn ich versuche, diese Tabelle zu laden, mit dem folgenden db Einheit XML-Datensatz (RS_7_10_minimal_ini.xml)

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

mit dem folgenden minimalen JUnit (DBTestCase) Testfall:

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

Es schlägt fehl, mit folgenden Ausnahme

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

Es scheint DB Einheit nicht Identität nicht einschalten, bevor eine Zeile einzufügen, für den der Wert der Identitätsspalte angegeben ist.

Ich habe bereits versucht, mich auf der Verbindung von den JdbcDataBaseTester abgerufen auszuführen, aber kein Glück. Wahrscheinlich eine neue Verbindung oder nicht die gleiche Verbindung verwendet, um die Daten in de DB zu drücken.

Jede Idee?

Vielen Dank für Ihre Hilfe alle!

Octave

War es hilfreich?

Lösung

Ja, fand die Lösung in der DBUnit FAQ eigentlich

  

Kann ich DbUnit mit IDENTITY oder Autoinkrement-Spalten?

     

Viele RDBMSes erlauben IDENTITY und Autoinkrement-Spalten implizit mit Client-Werten überschrieben werden. DbUnit kann nativ mit diesem RDBMS verwendet werden. Einige Datenbanken, wie MS SQL Server und Sybase, müssen explizit activate Client Werte Schreiben. Die Art und Weise diese Funktion zu aktivieren ist herstellerspezifisch.       DbUnit bietet diese Funktionalität für MS SQL Server mit der InsertIdentityOperation Klasse.

Auch wenn es für den MS SQL Server geschrieben wird, wird funktioniert auch für Sybase. Also ich meine Datensatz Push-to-db mit

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

Et voilà.

Danke für deine Antwort rawheiser.

Andere Tipps

Nicht familar genug mit DBUnit Sie mit den Besonderheiten zu helfen; aber ich habe eine Tabelle truncate und Nachsaat den Identitätswert in ähnlichen Situationen angewandt.

dbcc checkident 
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top