国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > .NET > 正文

.net多語言和數據集內多數據表的處理(3)

2024-07-10 13:03:34
字體:
來源:轉載
供稿:網友

3 考慮以上兩種情況的綜合
當以上兩種情況湊在一塊的時候,情況還會復雜一些,因為在我們的這個解決方案中,多語言和信息的主體是采用的松耦合,如果不采用松耦合就不能保證其通用性和可擴展性,但是采用了松耦合在數據集中多表操作時又會產生麻煩。
因為松耦合,所以在數據集中自動級連更新的時候并不能夠自動更新,修改還無所謂,我們只要保證和多語言表關聯的那個guid不變就可以了,但是刪除呢?我們總不能把信息主體刪除了卻又把多語言數據留著吧,更麻煩的是因為數據已經刪除,我們很難知道刪除之前與多語言數據表關聯的guid是多少。而且我們需要把對信息主體的刪除和多語言數據的刪除放到一個事務中,相信誰都不會希望程序偶然出錯信息主體未被刪除的時候多語言數據都被刪除了。而且,我們還要實現前面曾說過的一個目標:每個用戶都只需要維護自己用的這種語言的記錄信息就可以了,而不用考慮其他語言的問題,也可以非常方便的即使系統運行了一段時間后再次添加支持的語言,不需要在添加記錄的事后就需要添加所有語言的版本,只在需要的時候才添加相應語言的版本,從而使數據庫記錄數盡量的少。
好了,我們知道了需求,然后該怎么做呢?看下面的代碼:
在從數據庫獲取數據時:
public addressdata getaddress(string languagecode)
{
addressdata ds = new addressdata();

sqldataadapter daregion = new sqldataadapter(addresssql.strgetregion,sqlconfig.databaseconnection);
daregion.fill(ds.region);

sqldataadapter dacountry = new sqldataadapter(addresssql.strgetcountry,sqlconfig.databaseconnection);
dacountry.fill(ds.country);

sqldataadapter daprovince = new sqldataadapter(addresssql.strgetprovince,sqlconfig.databaseconnection);
daprovince.fill(ds.province);

sqldataadapter dacity = new sqldataadapter(addresssql.strgetcity,sqlconfig.databaseconnection);
dacity.fill(ds.city);

sqldataadapter daport = new sqldataadapter(addresssql.strgetport,sqlconfig.databaseconnection);
daport.fill(ds.port);

regiontypedata regiontypeds = getregiontype(languagecode);

foreach ( addressdata.regionrow region in ds.region)
{
if (!region.isnameguidnull())
{
region.name = dbdisplaystring.getdisplay(region.nameguid,languagecode,vdisplaytable);
}
if (regiontypeds.regiontype.findbyregiontypeid(region.regiontypeid) != null)
{
region.regiontypename = regiontypeds.regiontype.findbyregiontypeid(region.regiontypeid).abbr;
}
}

foreach ( addressdata.countryrow country in ds.country)
{
if (!country.isnameguidnull())
{
country.name = dbdisplaystring.getdisplay(country.nameguid,languagecode,vdisplaytable);
}
}

foreach (addressdata.provincerow province in ds.province)
{
if (!province.isnameguidnull())
{
province.name = dbdisplaystring.getdisplay(province.nameguid,languagecode,vdisplaytable);
}
}

foreach (addressdata.cityrow city in ds.city)
{
if (!city.isnameguidnull())
{
city.name = dbdisplaystring.getdisplay(city.nameguid, languagecode,vdisplaytable);
}
}

foreach (addressdata.portrow port in ds.port)
{
if (!port.isnameguidnull())
{
port.name = dbdisplaystring.getdisplay(port.nameguid,languagecode,vdisplaytable);
}
}

return ds;
}
這樣,只需要通過一個單一的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()包辦掉這一切。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 丽水市| 宜昌市| 翁牛特旗| 宁德市| 宜都市| 鄂州市| 敦化市| 秦皇岛市| 平江县| 三穗县| 韶山市| 上蔡县| 乐至县| 高陵县| 泽普县| 潮安县| 大名县| 镇远县| 边坝县| 河池市| 昭通市| 五峰| 息烽县| 镶黄旗| 雅江县| 宜兰市| 太原市| 鹤岗市| 龙江县| 突泉县| 保定市| 阿克苏市| 谷城县| 阿拉尔市| 静宁县| 静宁县| 莱阳市| 西丰县| 锡林郭勒盟| 和平区| 龙江县|