这样,只需要通过一个单一的Name字段便可以获取用户所用语言的数据了,而不用考虑用户使用的到底是哪一种语言。这里不在数据库里直接做join的原因是:这个获取多语言数据的方法并不是直接把数据库资料取出来那么简单,假如用户要取的那种语言的某条资料恰好没有呢?我们取了一个系统默认语言的数据,那么哪一种是系统默认语言呢?可见如果这些都放在SQL中做的话,要传入的参数会非常多,SQL语句会变得非常复杂,也就不利于封装了,而且考虑到SQL语句
那么把数据更新回数据库又该怎么办呢?看下面的代码: private void DeleteDisplay(AddressData ds, Guid refGuid) { foreach (AddressData.AddressDisStrRow dis in ds.AddressDisStr.
select("RefGuid = +refGuid+ ")) { dis.Delete(); } } private void DeletePort(AddressData ds, int portID) { if (!ds.Port.FindByPortID(portID).IsNameGuidNull()) { DeleteDisplay(ds,ds.Port.FindByPortID(portID).NameGuid); } ds.Port.FindByPortID(portID).Delete(); } private void DeleteCity(AddressData ds, int cityID) { if (!ds.City.FindByCityID(cityID).IsNameGuidNull()) { DeleteDisplay(ds,ds.City.FindByCityID(cityID).NameGuid); } foreach (AddressData.PortRow port in ds.Port) { if ((int)port["CityID",DataRowVersion.Original] == cityID) { port.RejectChanges(); DeletePort(ds,port.PortID); } } ds.City.FindByCityID(cityID).Delete(); } private void DeleteProvince(AddressData ds, int provinceID) { if (!ds.Province.FindByProvinceID(provinceID).IsNameGuidNull()) { DeleteDisplay(ds,ds.Province.FindByProvinceID(provinceID).NameGuid); } foreach (AddressData.CityRow city in ds.City) { if ((int)city["ProvinceID",DataRowVersion.Original] == provinceID) { city.RejectChanges(); DeleteCity(ds,city.CityID); } } ds.Province.FindByProvinceID(provinceID).Delete();
} public void UpdateProvince(AddressData ds, string languageCode) { SqlDataAdapter DAAddressDisStr = new SqlDataAdapter(AddressSQL.strGetAddressDisStr,SQLConfig.DataBaseConnection); DAAddressDisStr.Fill(ds.AddressDisStr); foreach(AddressData.ProvinceRow province in ds.Province) { if (province.RowState == DataRowState.Deleted) { province.RejectChanges(); DeleteProvince(ds,province.ProvinceID); } else if (province.RowState == DataRowState.Added || province.RowState == DataRowState.Modified) { if (province.IsNameNull() && !province.IsNameGuidNull()) { DBDisplayString.SaveDisplay(languageCode,province.NameGuid,null,vDisplayTable); } else if (!province.IsNameNull()) { if (province.IsNameGuidNull()) { province.NameGuid = Guid.NewGuid(); } DBDisplayString.SaveDisplay(languageCode,province.NameGuid,province.Name,vDisplayTable); } } } DataTableExtend[] dts = new DataTableExtend[4]; dts[0] = new DataTableExtend(ds.Port,"Port"); dts[1] = new DataTableExtend(ds.City, "City"); dts[2] = new DataTableExtend(ds.Province,"Province"); dts[3] = new DataTableExtend(ds.AddressDisStr,vDisplayTable); SQLModify.ModifyDataBase(dts);
}
可以看出,这个操作会很麻烦,对于删除操作而言,我们需要把该条记录所有的多语言数据都删掉,然后很不幸,对于数据集中已删除了的记录而言,虽然它还存在但却不能访问,更不幸的是,因为多数据表关联的原因,我们甚至都不知道有多少数据被级连删除了:(没办法,RejectChanges()吧,然后通过关联找到所有被级连删除的数据,把多语言数据都删除掉,然后再删除自身,注意到我这里用到了Select方法,这是一个很方便的做法,减少了到数据库的往返操作,从而以牺牲一些
内存的代价节省了与数据库痛心的时间。对于新增和修改操作,我们则负担着另一项任务,即把Name字段里的数据根据用户的当前语言,更新会数据库相应的记录中,这里也会有很多种情况,如该字段数据是新增的,缺省语言的数据也没有,当前语言的数据也没有,或者是缺省语言的数据有了当前语言的数据却没有,再或者用户是把这个字段的数据清空了,我们必须要找到多语言表中相应的记录并删除掉……等等,无奈,我们只好让DBDisplayString.SaveDisplay()包办掉这一切。
来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/10794571/viewspace-974651/
,如需转载,请注明出处,否则将追究法律责任。