在表上打开IDENTITY_INSERT以使用DB Unit加载它

Oct*_*ave 5 sybase junit dbunit identity-insert identity-column

我尝试使用DB Unit加载具有标识列的表.我希望能够自己设置id值(我不希望数据库为我生成它).

这是我的表的最小定义

create table X (
 id numeric(10,0) IDENTITY PRIMARY KEY NOT NULL
)
Run Code Online (Sandbox Code Playgroud)

要在X中插入一行,我执行以下SQL

set INDENTITY_INSERT X ON
insert into X(id) VALUES(666)
Run Code Online (Sandbox Code Playgroud)

没问题.但是当我尝试使用以下数据库单元XML数据集(RS_7_10_minimal_ini.xml)加载此表时

<dataset>
 <X id="666"/>
</dataset>
Run Code Online (Sandbox Code Playgroud)

使用以下最小JUnit(DBTestCase)测试用例:

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() {
        // ...
}
}
Run Code Online (Sandbox Code Playgroud)

它失败,出现以下异常

com.sybase.jdbc3.jdbc.SybSQLException: Explicit value specified for identity field in table 'X' when 'SET IDENTITY_INSERT' is OFF.
Run Code Online (Sandbox Code Playgroud)

在插入指定了标识列值的行之前,DB Unit似乎没有打开标识.

我已经尝试在从JdbcDataBaseTester检索到的连接上执行自己,但没有运气.可能是新连接或用于将数据推送到de DB的相同连接.

任何的想法?

非常感谢您的帮助!

八度

Oct*_*ave 9

是的,实际上在DBUnit FAQ中找到了解决方案

我可以将DbUnit与IDENTITY或自动增量列一起使用吗?

许多RDBMS允许使用客户端值隐式覆盖IDENTITY和自动增量列.DbUnit本身可以与这些RDBMS一起使用.某些数据库(如MS SQL Server和Sybase)需要显式激活客户端值写入.激活此功能的方法是特定于供应商的.DbUnit使用InsertIdentityOperation类为MS SQL Server提供此功能.

虽然它是为MS SQL Server编写的,但也适用于Sybase.所以我将我的数据集推送到db

    new InsertIndentityOperation(DatabaseOperation.CLEAN_INSERT).execute(connection,initialDataSet); 
Run Code Online (Sandbox Code Playgroud)

Etvoilà.

谢谢你的回答rawheiser.

  • 这是拼写错误还是名称更改为InsertIdentityOperation?在我的getSetUpOperation()中,我使用了return new InsertIdentityOperation(DatabaseOperation.CLEAN_INSERT);。 (2认同)