一直聽說DB2是個很牛叉的數據庫,但是從知道有這麼一個數據庫到真正有機會用還是經過了漫長的歲月,到了今年的7、8月份才有機會用這個數據庫。最近在北京做某銀行的現金管理系統,銀行要求要用DB2數據庫,沒辦法把所有的程序都在DB2上進行了一次改進優化。
廢話不多說,直接分享經驗。
01:尋找DB2的安裝盤折騰了1-2周,因為不太擅長干這個,DB2有好幾個版本,會分32位、64位的不同的安裝版本,開發階段當然是運行在 Windows平台下,只是真實部署時會在其他非Windows系統下而已,第一個安裝盤始終安裝失敗,後來同事又發了一個版本,一安裝就成功了,安裝過程非常簡單,基本上只要設置用戶名、密碼就可以了,只要找到合適的安裝盤會非常順利了,安裝程序不是很大只有幾百兆1G都不到,安裝過程完畢運行程序會出現一個錯誤,在Windows裡設置一下權限就可以正常使用了、Google一下就可以解決了。
02:DB2裡如何執行SQL語句摸索了2天才會,因為沒人教,身邊也沒人會這個,手頭也沒任何DB2的參考書,就靠自己瞎摸索,終於知道了如何執行SQL語句了,過了這個關後,基本上想干啥都會順利一些了,下面就是DB2的管理工具。
用戶可以與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());
- }
- /// <summary>
- /// 導出一個表
- /// </summary>
- /// <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 等等眾多。。。
將權限管理、工作流管理做到我能力的極致,一個人只能做好那麼很少的幾件事情。