5

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

这是我的表的最小定义

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

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

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

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

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

使用以下最小 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() {
        // ...
}
}

它失败并出现以下异常

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

在插入指定了标识列的值的行之前,数据库单元似乎没有打开标识。

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

任何想法?

非常感谢大家的帮助!

八度

4

2 回答 2

9

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

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

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

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

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

等等瞧。

感谢您的回答 rawheiser。

于 2010-11-18T08:33:42.060 回答
1

对 DBUnit 不够熟悉,无法帮助您了解具体细节;但我在类似情况下使用了表截断并重新设置标识值。

dbcc checkident 
于 2010-11-17T20:42:14.783 回答