一直聽說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;
publicclass ImportExportData1
{
///<summary>
/// 導出資料庫到Oralce
///</summary>
publicvoid 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();
}
publicvoid ExportTable(string tableName)
ExportTable(tableName.ToUpper(), tableName.ToUpper());
/// 導出一個表
///<param name="tableName">表名</param>
///<param name="table">裡面的資料</param>
publicvoid 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 等等衆多。。。
本文轉自 jirigala 51CTO部落格,原文連結:http://blog.51cto.com/2347979/1197375,如需轉載請自行聯系原作者