天天看點

把C#.NET程式移植到DB2上的經驗淺談(C#連接配接DB2可以用IBM.Data.DB2.dll)

感謝部落格園不再封殺,差點兒搬家的念頭都産生了,部落格園還是有大胸懷,繼續留在部落格園寫口水文應該沒錯,娛樂自己、娛樂大家,給枯燥的程式設計生活增加一點兒笑料,也給大家充當個開心果,讓大家高興一下下、輕松一下下,工作累了,看看吉日的文章心情就會好很多了,因為吉日技術太菜了還喜歡寫文章分享更喜歡上首頁不說文章内容又全是廣告、嘿嘿。

   一直聽說DB2是個很牛叉的資料庫,但是從知道有這麼一個資料庫到真正有機會用還是經過了漫長的歲月,到了今年的7、8月份才有機會用這個資料庫。最近在北京做某銀行的現金管理系統,銀行要求要用DB2資料庫,沒辦法把所有的程式都在DB2上進行了一次改進優化。

   廢話不多說,直接分享經驗。

   01:尋找DB2的安裝盤折騰了1-2周,因為不太擅長幹這個,DB2有好幾個版本,會分32位、64位的不同的安裝版本,開發階段當然是運作在Windows平台下,隻是真實部署時會在其他非Windows系統下而已,第一個安裝盤始終安裝失敗,後來同僚又發了一個版本,一安裝就成功了,安裝過程非常簡單,基本上隻要設定使用者名、密碼就可以了,隻要找到合适的安裝盤會非常順利了,安裝程式不是很大隻有幾百兆1G都不到,安裝過程完畢運作程式會出現一個錯誤,在Windows裡設定一下權限就可以正常使用了、Google一下就可以解決了。

   02:DB2裡如何執行SQL語句摸索了2天才會,因為沒人教,身邊也沒人會這個,手頭也沒任何DB2的參考書,就靠自己瞎摸索,終于知道了如何執行SQL語句了,過了這個關後,基本上想幹啥都會順利一些了,下面就是DB2的管理工具。

   03:DB2的Windows版本的使用者可以與Windows的系統使用者內建在一起,用起來很友善,管理起來也靈活了。

   04:DB2裡2個字元相加,跟Oralce一樣,都需要用 “||” 符号,參數化也用 @符号,這些沒什麼大差別,也跟Oralce類似有 Dual 等特殊的表。

   05:DB2裡,又有子增量,又有序列,這方面比sqlsever好用多了,畢竟Oracle有序列,沒字增量,但是DB2很爽,字增量、序列的功能都有,主鍵可以靈活采用采用這2個方式之一,這樣效率也高一些,也會減少一些并發帶來的麻煩,省事一些。

   06:DB2也有分頁的語句與Oralce類似,查幾下資料就可了。

   07:DB2裡也可以建立分區等等,這個跟Oralce很相似、雖然DB2的管理工具也不是很漂亮,但是用起來還算舒服,比Oralce自帶的管理工具強很多,當然說管理工具最好用的還是sqlserver的,複制粘貼、批量複制粘貼等非常友善,這方面DB2、Oralce是差距甚遠、他們沒考慮菜鳥級大衆使用者,隻考慮了專家。

   08:那C#通路DB2用什麼類、這個DLL哪裡下載下傳?這個折騰了不少,到IBM網站上注冊了使用者,才下載下傳到這個DLL,雖然是VS2005版本的,但是也可以安裝,然後直接找到相應的DLL,複制過來,引用到自己的項目裡就可以了。我采用了IBM.Data.DB2.dll。

   09:接下來就是解決 資料庫連接配接串的問題,沒幾下就測試成功了資料庫連接配接串,參考資料庫連結串如下:

    <add key="UserCenterDbConnection" value="Database=JIRI_UC;UserID=administrator;Password=pAssw0rd;Server=WIN-3T3M2TTDAFK;" />

    <add key="BusinessDbConnection" value="Database=JIRI_DB;UserID=administrator;Password=pAssw0rd;Server=WIN-3T3M2TTDAFK;" />

  10:接下來就是導資料的工作了,以前花費幾天寫了一個将資料導入到Oralce的工具,這次稍微修改幾下花費了半個小時就改進為又支援導入Oralce、也支援導入DB2等任何資料庫的導入導出工具,代碼貼出來給大家分享一下,代碼總共沒幾行、但是非常實用。

//--------------------------------------------------------------------

// All Rights Reserved , Copyright (C) 2011 , Hairihan TECH, Ltd. 

using System.Data;

namespace DotNet.Example

{

    using DotNet.BaseManager;

    using DotNet.DbUtilities;

    public class ImportExportData1

    {

        /// <summary>

        /// 導出資料庫到Oralce

        /// </summary>

        public void Export()

        {

            //this.ExportTable("ItemDetails");

            //this.ExportTable("Items_Condition");

            //this.ExportTable("Items_Currency");

            //this.ExportTable("Items_E_Signature");

            //this.ExportTable("Items_RoleCategory");

            //this.ExportTable("Items_SecurityLevel");

            //this.ExportTable("Items_TablePermissionScope");

            //this.ExportTable("Base_Comment");

            //this.ExportTable("Base_Exception");

            //this.ExportTable("Base_File");

            //this.ExportTable("Base_Folder");

            //this.ExportTable("Base_Items");

            //this.ExportTable("Base_Log");

            //this.ExportTable("Base_Message");      

            //this.ExportTable("Base_Organize");

            this.ExportTable("Base_Module");

            //this.ExportTable("Base_PermissionItem");

            //this.ExportTable("Base_Role");

            //this.ExportTable("Base_Staff");

            //this.ExportTable("Base_Parameter");           

            //this.ExportTable("Base_Permission");

            //this.ExportTable("Base_PermissionScope");

            //this.ExportTable("Base_Sequence");

            // this.ExportTable("Base_TableColumns");

            // this.ExportTable("Base_User");

            // this.ExportTable("Base_UserAddress");

            // this.ExportTable("Base_UserOrganize");

            // this.ExportTable("Base_UserRole");

            //this.ExportTable("Base_WorkFlowActivity");

            //this.ExportTable("Base_WorkFlowCurrent");

            //this.ExportTable("Base_WorkFlowHistory");

            //this.ExportTable("Base_WorkFlowProcess");

            System.Console.ReadLine();

        }

        public void ExportTable(string tableName)

            ExportTable(tableName.ToUpper(), tableName.ToUpper());

        /// 導出一個表

        /// <param name="tableName">表名</param>

        /// <param name="table">裡面的資料</param>

        public void ExportTable(string tableName, string table)

            // 這裡是擷取目标資料表的方法

            IDbHelper sourceDB = new SqlHelper("Data Source=192.168.0.121;Initial Catalog=UserCenterJMCB;User Id = sa ; Password = Password@1;");

            sourceDB.Open();

            DataTable dataTable = new DataTable(tableName);

            if (tableName.Equals(table))

            {

                dataTable = sourceDB.Fill("SELECT * FROM " + table);

            }

            else

                dataTable = sourceDB.Fill(table);

            sourceDB.Close();

            // 這裡是目标表的資料插入處理

            // IDbHelper targetDB = new OracleHelper("Data Source=KANGFU;user=usercenter;password=usercenter;");

            // IDbHelper targetDB = new DB2Helper("Database=JMCB_UC;UserID=JoinMoreCash;Password=P@ssw0rd;Server=WIN-3T3M2TTDAFK;");

            IDbHelper targetDB = new DB2Helper("Database=JMCB_UC;UserID=administrator;Password=p@ssw0rd2077;Server=WIN-3T3M2TTDAFK;");

            targetDB.Open();

            // targetDB.BeginTransaction();

            SQLBuilder sqlBuilder = new SQLBuilder(targetDB);

            try

                // 清除表資料

                // targetDB.ExecuteNonQuery(" TRUNCATE TABLE " + tableName);

                targetDB.ExecuteNonQuery(" DELETE FROM " + tableName);

                // 建立配套的序列

                // targetDB.ExecuteNonQuery("create sequence SEQ_" + tableName.ToUpper() + " as bigint start with 1000000 increment by 1 minvalue 10000 maxvalue 99999999999999999 cycle cache 20 order");

                // targetDB.ExecuteNonQuery("create sequence SEQ_" + tableName + " minvalue 1 maxvalue 999999999999999999999999 start with 1 increment by 1 cache 20");

                int r = 0;

                for (r = 0; r < dataTable.Rows.Count; r++)

                {

                    sqlBuilder.BeginInsert(tableName);

                    for (int i = 0; i < dataTable.Columns.Count; i++)

                    {

                        sqlBuilder.SetValue(dataTable.Columns[i].ColumnName, dataTable.Rows[r][dataTable.Columns[i].ColumnName]);

                    }

                    sqlBuilder.EndInsert();

                    System.Console.WriteLine("表 " + tableName + " 已插入第 " + r.ToString() + " 行");

                }

                System.Console.WriteLine(" - - 表 " + tableName + " 共插入 " + r.ToString() + " 行");

                targetDB.CommitTransaction();

            catch (System.Exception exception)

                // targetDB.RollbackTransaction();

                System.Console.WriteLine(tableName + " -- " + exception.Message);

            finally

                targetDB.Close();

    }

}

  11:為了相對系統的了解一下DB2資料庫,狠下心30多元買了一本,翻了一天心裡有感覺了,接着遇到什麼問題Google一下基本上就可以解決了。

   前後折騰了半個多月,終于把C#.NET通用權限管理元件全部在DB2上調試了一遍,從從來沒摸過DB2到把資料庫都折騰好,很多事情說起來簡單,但是真正做好,做細節就會耗費很多時間,2周多時間就這麼一眨眼就過去了。其實這2周的成本大概是上萬(杭州來回北京的路費 + 住酒店的費用 + 工資成本 + 測試成本),還有好幾個人給測試确認功能是否正确。

   軟體是否值錢?想把一個軟體賣10000是很難的,很多人不能接受,但是等有需要時花費20000也搞不定就可以充分體驗到軟體貴如金,還好這些都由客戶買單否則自己還真沒實力亂折騰。這還不是開發通用權限管理系統的成本,隻是實作一個DB2資料庫上的相容性就需要有這些成本才能實作好。

   若真有又便宜品質又好的軟體源碼,購買遠比自己開發強,自己寫遠沒有分析了解别人的代碼上改進幾下見效快,何必跟自己過不去呢,浪費那麼多生命重複建設幹啥,若我工作上遇到的難題,都可以别人能幫忙解決的話會全部購買了完事了,該休息休息了。

   C#連接配接DB2可以用IBM.Data.DB2.dll, 有需要這個類庫的,加我QQ:252056973 索取。以上是膚淺的總結、有不足之處請指正、歡迎大家留言發表見解。

通用權限管理系統元件源碼現在支援 Access, mysql, sqlserver, Oracle, db2, SqLite 等等衆多。。。

将權限管理、工作流管理做到我能力的極緻,一個人隻能做好那麼很少的幾件事情。

吉日嘎拉(蒙古語為吉祥如意),2000年畢業于黑龍江大學計算機系軟體專業,目前定居杭州,典型的IT軟體土鼈一個,外号“軟體包工頭”。

通用權限管理系統元件(GPM - General Permissions Manager)自2003年開始釋出,目前是國内注冊使用者和免費盜版使用者最多的權限管理系統,是各種資訊管理系統開發中徹底的權限解決方案。本元件支援多種主流資料庫(Oracle、sqlsever、db2、mysql),功能強大,使用友善,代碼簡潔,思路嚴謹,被廣大支援者稱為權限管理系統中的“走火入魔級權限管理系統”。

精心維護通用權限管理系統元件(GPM - General Permissions Manager)有8年多,3年的不斷推廣,20萬行經典的業務邏輯積累,經過上萬次的調試修正,經曆了四百個付費客戶,上百軟體公司的實戰開發。

11年以上開發經驗,外企工作5年,上市公司3年,獨立經營軟體公司2年,主持研發部門管理工作4年以上。

将權限管理、工作流做到我能力的極緻,一個人隻能做好那麼很少的幾件事情。

QQ:252056973,Mail:[email protected]

把C#.NET程式移植到DB2上的經驗淺談(C#連接配接DB2可以用IBM.Data.DB2.dll)

通用權限管理子產品的嚴謹設計定位、精心編碼實作、不斷維護推廣、持續優化改進,主要是為了實作一個可以高度重複利用勞動成果的工具軟體并有償提供給所需的人們,另想成為國人值得驕傲的知名軟體功能子產品。

可供國内管理類開發人員在日常工作中進行靈活二次開發利用的子產品,開發管理類軟體的必備工具之一,我們的目标就是讓程式員早點兒回家休息。

本文轉自jirigala_bao 51CTO部落格,原文連結:http://blog.51cto.com/jirigala/812656