2010-11-17 14 views
5

Ich versuche eine Tabelle mit einer Identitätsspalte mit DB Unit zu laden. Ich möchte in der Lage sein, den ID-Wert selbst einzustellen (ich möchte nicht, dass die Datenbank es für mich generiert).IDENTITY_INSERT in einer Tabelle einschalten, um sie mit DB Unit zu laden

Hier ist eine minimale Definition meiner Tabelle

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

eine Zeile in X einzufügen, führe ich die folgenden 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 mit dem 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 Identität lässt sich nicht einschalten, bevor Sie eine Zeile einzufügen, für den der Wert der Identitätsspalte angegeben ist.

Ich habe bereits versucht, mich auf der Verbindung aus dem JdbcDataBaseTester abgerufen, aber kein Glück. Wahrscheinlich eine neue Verbindung oder nicht die gleiche Verbindung verwendet, um die Daten in de DB zu schieben.

Irgendeine Idee?

Vielen Dank für Ihre Hilfe alle!

Octave

Antwort

9

Ja, fand die Lösung in der DBUnit FAQ tatsächlich

Kann ich DbUnit mit IDENTITY oder Autoinkrement-Spalten verwenden?

Viele RDBMS erlauben IDENTITY- und Auto-Increment-Spalten, die implizit mit Client-Werten überschrieben werden. DbUnit kann nativ mit diesen RDBMS verwendet werden. Einige Datenbanken, wie MS SQL Server und Sybase, müssen das Schreiben von Client-Werten explizit aktivieren. Die Aktivierung dieser Funktion ist herstellerspezifisch. DbUnit bietet diese Funktionalität für MS SQL Server mit der InsertIdentityOperation-Klasse.

Obwohl es für den MS SQL Server geschrieben wurde, funktioniert es auch für Sybase. Also schiebe ich meinen Datensatz auf db mit

Et voilà.

Danke für Ihre Antwort rawheiser.

+1

Ist das ein Tippfehler oder hat sich der Name in InsertIdentityOperation geändert? In meiner 'getSetUpOperation() 'habe ich' neue InsertIdentityOperation (DatabaseOperation.CLEAN_INSERT); ' – dustmachine

+0

Du bist ein Lebensretter :) vielen Dank ... –

1

nicht vertraut genug mit DBUnit Sie mit den Besonderheiten zu helfen; aber ich habe eine Tabelle gekürzt und den Identity-Wert in ähnlichen Situationen neu seediert.

dbcc checkident