2011年12月29日 星期四

資料庫的內容繁轉簡(Big5 to GB)

要怎麼把 table 裡的 data, 轉成簡體(或繁體),
step 1: 開出 table 的欄位資訊.
step 2: 用loop 取得每一筆要被更新的 record.
step 3: 透過元件取出欄位內容, 繁轉簡之後, 放回去欄位裡, 再透過 recoredset.update 更新回 table 裡.


程式的說明:



程式碼:


* 說明1: open recordset, 記得不要開成 readonly, 醬子才可以用 recordset.update 更新資料.




* 說明2: 針對 table 的 TYPE_NAME 有 text 或 char 型別的, 才需要做內容的轉換.



執行結果:


==================================
相關說明:
----------------
Set RsObject = Server.CreateObject(”ADODB.Recordset:”)
RsObject.Open 資料來源,資料連結,指標型態,鎖定方式
資料來源:指定資料表名稱
資料連結:指定一個已Connection的物件


指標型態:
----------------
0:只能向前移動的指標,此為預設值
1:無法讀取其他使用著新增之資料,更新之資料會立即反應
2:可以及時反應其他使用著操作資料庫之狀況
3:無法及時反映其他使用著操作相同資料庫的狀況用於搜尋或新增記錄時使用


鎖定方式:
----------------
1:將Recordset 開啟為唯讀狀態,此為預設值
2:當使用著對Recordset 中的某筆資料作編輯時店鎖定記錄
3:當使用著呼叫Update方法對Recordset做更新時才鎖定記錄
4:使用著做批次更新時才鎖定記錄


===================================

原理是 call windows kernel32.dll 裡的 LCMapString  function, 理論上只要是可以 call dll 的 programming language 都可以做到offline 的簡/繁互轉.


如果您的需求和我一樣, 只是想把文字內容的簡繁部分轉換, 並不是想轉成 big5 或 gb, 整個輸出入都是 unicode, 而且也不想破壞其他非簡繁文字部分的話, 那麼結論就是照著本篇文章的一開始的 d1, d2 範例呼叫 VB 的 Strings.StrConv 帶上 0x0009 或是其他 SingleByte 字集的 localeID 當成第三個參數就可以啦!!!
如果不想引入 Microsoft.VisualBasic.dll (別問為什麼, 純屬個人偏好) 又想要做到相同的效果, 做法也很簡單, 請參考以下的範例程式碼!!!

public static class ChineseStringUtility
{
    internal const int LOCALE_SYSTEM_DEFAULT = 0x0800;
    internal const int LCMAP_SIMPLIFIED_CHINESE = 0x02000000;
    internal const int LCMAP_TRADITIONAL_CHINESE = 0x04000000;

    [DllImport("kernel32", CharSet = CharSet.Auto, SetLastError = true)]
    internal static extern int LCMapString(int Locale, int dwMapFlags, string lpSrcStr, int cchSrc, [Out] string lpDestStr, int cchDest);

    public static string ToSimplified(string source)
    {
        String target = new String(' ', source.Length);
        int ret = LCMapString(LOCALE_SYSTEM_DEFAULT, LCMAP_SIMPLIFIED_CHINESE, source, source.Length, target, source.Length);
        return target;
    }

    public static string ToTraditional(string source)
    {
        String target = new String(' ', source.Length);
        int ret = LCMapString(LOCALE_SYSTEM_DEFAULT, LCMAP_TRADITIONAL_CHINESE, source, source.Length, target, source.Length);
        return target;
    }
}




沒有留言:

張貼留言

Facebook 留言板