顯示具有 dbunit 標籤的文章。 顯示所有文章
顯示具有 dbunit 標籤的文章。 顯示所有文章

2014年3月1日 星期六

dbunit - 如何插入null的資料

參考:Importing data from XML to database using dbunit

使用dbunit的時候遇到一個問題,就是我要將NULL的資料insert進去,該如何做呢?

原來只要使用如:
  ReplacementDataSet dataSet = new ReplacementDataSet(srcDataSet); 
  dataSet.addReplacementObject("[NULL]", null);

就可以將指定的字串替換為null,之後再使用這個替換過的dataset依照原本使用dbunit的方式insert就可以囉~

2013年7月6日 星期六

dbunit初體驗 - 從現有XML DATA中過濾出需要的資料

之前使用的QueryDataSet可以下SQL Query來SELECT出想要的資料(請見此篇),
然而QueryDataSet好像只能接受從connection資料來建立...這不符合我的需求,找到一個好方法,就是使用RowFilterTable 搭配IRowFilter,直接來看code:


 public static ITable filterXmlDataCol(
   String xmlDataFile, String tableName,IDatabaseConnection conn
   , final String expectColNames[] , final Object expectColVals[]) throws Exception {
  
  IDataSet databaseDataSet = getDataSetFromXmlFile(xmlDataFile);
  ITable actualTable = databaseDataSet.getTable(tableName);
  
  IRowFilter rowFilter = new IRowFilter() {
   @Override
   public boolean accept(IRowValueProvider rowValueProvider) {
    try {
     for(int i=0 ; i< expectColNames.length ; ++i){
      Object columnValue = rowValueProvider.getColumnValue(expectColNames[i]);
      if (!columnValue.equals(expectColVals[i]))
       return false;
     }
     return true;
    } catch (DataSetException ex) {
     ex.printStackTrace();
    }
    return false;
   }
  };
  RowFilterTable filteredRowsTable = new RowFilterTable(
    actualTable, rowFilter);
  return filteredRowsTable;
 }

使用方式:
現有XML DATA:


  
  
    

    
    
    
    

我只希望以XMLDATA建立出的ITable有條件:product == "17公司" and name=="tables"的資料,那麼就照以下方式呼叫:
   ITable expect = DBUnitUtilities.filterXmlDataCol("datasheet\\FactoryInfo.xml","FactoryInfo"
     , _dbunitConnection,new String[]{"name","product"},new String[]{"17公司","tales"} );


這樣就可以過濾囉~~

debug一下其實可以發現RowFilterTable並不是真的將資料給"過濾"掉了,只是將原先的Table給wrap後,然後帶入自行建立的IRowFilter(上述line 8~23),並在每一次巡迴column資料時以自定義的@ovverride accept()回傳true(資料保留) 或 false(資料移除)
回傳true的row index就會被保留在filteredRowIndexes這個List中囉。


p.s:
星期一就要交差幾乎會開天窗的我居然還在研究test.....只希望我這個堅持是對的....畢竟我真的不想再寫垃圾Code穩定度又差又無法擴充又不敢修改的爛東西了阿.........0rz...


參考:Filtering data sets and comparing results using DBUnit

2013年6月21日 星期五

dbunit初體驗 - 新增table data from existing xml data


首先,做一些setup工作
        
private MsSqlConnection _dbunitConnection;
 @Before
 public void setUp() throws Exception {
     _dbunitConnection = new MsSqlConnection(DBUnitUtilities.createHsqlDBConnection(), null);
      //do something setup..
 }

重點在這:
 IDataSet setup = DBUnitUtilities.getDataSet("datasheet\\Banner11.xml");
 DatabaseOperation.CLEAN_INSERT.execute(_dbunitConnection,setup);


2013年5月16日 星期四

dbunit初體驗 - QueryDataSet.addTable((tableName, query) 出現 org.dbunit.dataset.DataSetException: java.sql.SQLSyntaxErrorException: user lacks privilege or object not found:


照者Juni in Action 中的第17章 p338的做法輸入:
QueryDataSet data = new QueryDataSet(_dbunitConnection);
data.addTable("TableName","select * from TableName where id="+value );

卻一直出現

org.dbunit.dataset.DataSetException: java.sql.SQLSyntaxErrorException: user lacks privilege or object not found: value

的錯誤,後來才發現因為我要比較的對象id為String,因此前後應加上單引號,上述應更正如下:
data.addTable("TableName","select * from TableName where id='"+value+"'");

OK 更改完畢,順利通過^^
這個錯誤也有可能是在使用之前Table未建立而產生