2009年9月16日 星期三

DataSet序列化(M04)

1、使用DataSet內建方法
  • WriteXML方法:將DataSet寫成XML檔
  • ReadXML方法:將XML檔還原為DataSet
  • GetXML方法:取得序列化後的XML字串資料
2、控制DataSet序列化格式
  • 修改DataSet的DataSetName屬性
  • 修改DataTable的DataTable屬性
  • 修改DataColumn的ColumnName屬性
  • 修改DataColumn的ColumnMapping屬性
===================================
程式實作
Public Class Form1

Private Sub JobsBindingNavigatorSaveItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles JobsBindingNavigatorSaveItem.Click
Me.Validate()
Me.JobsBindingSource.EndEdit()
Me.JobsTableAdapter.Update(Me.PubsDataSet.jobs)

End Sub

Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
'TODO: 這行程式碼會將資料載入 'PubsDataSet.jobs' 資料表。您可以視需要進行移動或移除。
Me.JobsTableAdapter.Fill(Me.PubsDataSet.jobs)

End Sub
Public ds As New pubsDataSet
Private Sub ToolStripButton1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ToolStripWriteDataSet.Click
Me.JobsTableAdapter.Fill(Me.ds.jobs)
ds.DataSetName = "工作列表"
For Each dc As DataColumn In ds.Tables(0).Columns
dc.ColumnMapping = MappingType.Attribute

Next
ds.Tables(0).Columns("job_id").ColumnName = "工作編號"
ds.WriteXml(Application.StartupPath & "\DataSet.xml")
End Sub

Private Sub ToolStripButton2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ToolStripReadDataSet.Click
ds.Clear()
ds.ReadXml(Application.StartupPath & "\DataSet.xml")
MessageBox.Show("共讀取到" & ds.Tables(0).Rows.Count.ToString & "筆資料")
End Sub

Private Sub ToolStripButton3_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ToolStripGetDataSet.Click
MessageBox.Show(ds.GetXml)
End Sub
End Class

SOAP序列化(M04)

SOAP序列化
SOAP(Simple Object Access Protocol)標準定義基本物件型別的XML描述方法,也定義了遠端程序呼叫的標準。
SOAP序列化和反序列化物件
SOAP結合XML序列化和Binary序列化的兩個重要特性,一是格式為標準XML,具備跨網際網路的特性,二是對於Private資料也能夠保存。
=====================
1、參考System.Runtime.Serialization.formatters.Soap.dll
2、SOAP序列化和反序列化物件
  • System.Runtime.Serialization.Formatters.Soap
  • 使用Formatter物件
  • 使用Stream物件
  • 呼叫Serialize和Deserialize方法
========================================
Public Class Person
Public strName As String = "Jerry"
Private intAge As Integer = 18
End Class
=====================

Imports System.Runtime.Serialization.Formatters.Soap
Imports System.IO
Public Class Form1


Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
'1、建立及使用物件
Dim obj As New Person


'2、序列化SOAP物件
Dim Formatter As New SoapFormatter()
Dim fs As New FileStream(Application.StartupPath & "\Person.xml", FileMode.Create)

Formatter.Serialize(fs, obj)
fs.Close()
End Sub

Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
'3、反序列化還原物件
Dim Formatter As New SoapFormatter()
Dim fs As New FileStream(Application.StartupPath & "\Person.xml", FileMode.Open)
Dim obj As Person = CType(Formatter.Deserialize(fs), Person)
fs.Close()
MessageBox.Show("Deseriablize OK...Name = " & obj.strName)

End Sub
End Class

2009年9月13日 星期日

序列化(M04)_Binary VS XML

序列化是一種轉換記憶體的物件資料格式技術,目的在於將物件資料轉換成可以保存於檔案或其他儲存位置的技術,方便未來將物件資料保存或傳送。
  • 跨AppDomain時使用
何謂序列化與反序列化
序列化技術同時也包含反序列化方法,當物件資料序列化成資料串流(Stream)格式,藉由網路送到其他位置時,需使用反序列化的方法將之還原成物件方能繼續使用物件

.NET相關序列化技術
1、Binary Serialization
  • 提供物件的完整型別保存,通常用鄉跨不同應用程式之間的物件交換ex:剪貼簿可將物件序列化後放進剪貼簿,就像應用程式關閉,也可從剪貼簿反序列化到另一個應用程式使用。
  • 將物件序列化之後可以轉換到 資料串流、硬體或記憶體,透過網路就可和各應用程式交換資料。ex:Romoting技術就是依靠序列化技術完成遠端呼叫的資料傳遞。
Binary Serialization實作
(1)建立一個可序列化的類別
  • 套用Serializable Attribute
  • 套用NonSerialized Attribute
(2)序列化及反序列化物件
  • System.Runtime.Serialization.Formatters.Binary
  • 使用Formatter物件
  • 使用Stream物件
  • 呼叫Serialize與Deserialize方法

Imports System.Runtime.Serialization.Formatters.binary
Imports System.IO

Public Class BinaryClass
Private Name As String = "Jerry"
Private Age As Integer = 10
Private Birthday As Date

Public Property strName() As String
Get
Return Name
End Get
Set(ByVal value As String)
Name = value
End Set
End Property

Public Property intAge() As Integer
Get
Return Age
End Get
Set(ByVal value As Integer)
Age = value
End Set
End Property

Public Property dateBirthday() As DateTime
Get
Return Birthday
End Get
Set(ByVal value As DateTime)
Birthday = value
End Set
End Property
End Class

=====================
Imports System.Runtime.Serialization.Formatters.Binary
Imports System.IO

Public Class Form1
'1、建立物件及使用物件
Dim People As New BinaryClass()
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click

People.strName = "Jerry"
People.intAge = 18
People.dateBirthday = "2009/09/15"

'2、將序列化成Binary檔案
Dim formatter As New BinaryFormatter()
Dim fs As New FileStream(Application.StartupPath & "People.bin", FileMode.Create)
formatter.Serialize(fs, People)
fs.Close()
End Sub

Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
'3、反序列化為物件
Dim formatter As New BinaryFormatter
Dim fs As New FileStream(Application.StartupPath & "People.bin", FileMode.Open)
Dim obj As BinaryClass = CType(formatter.Deserialize(fs), BinaryClass)
fs.Close()
Messagebox.Show("Deserialize OK...Private strName" & obj.strName)
'MessageBox.Show(Application.StartupPath & "People.bin")
End Sub
End Class
========================================
2、XML Serialization
  • 只保存物件當中Public的成員資料與成員屬性,不保證資料完整性,通常應用在單純的資料保存及傳遞,且由於序列化後資料格式為XML,為一個開放的標準,適合於現今的網路中。
  • 但因XML格式完全開放自行定義,會導致不相容於所有應用程式的情況發生,而SOAP標準就成為應用程式之前XML資料格式的標準了,讓資料更具通透性。
XML Serialization實作

(1)建立一個類別包含Public的資料
(2)XML序列化和反序列化物件
  • System.Xml.Serializtion
  • 使用Stream物件
  • 呼叫Serialize與Deserialize方法

Public Class MyBook
Public bookID As Integer
Public bookName As String
End Class
=====================
Imports System.IO
Imports System.Xml.Serialization
Public Class Form1

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
'1、建立及使用物件
Dim obj As New MyBook
obj.bookID = 10
obj.bookName = "琦真說童年"
'2、序列化XML物件
Dim ser As New XmlSerializer(GetType(MyBook))
Dim fs As New FileStream(Application.StartupPath & "\MyBook.xml", FileMode.Create)
ser.Serialize(fs, obj)
fs.Close()
End Sub

Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
'3、反序列化還原物件
Dim ser As New XmlSerializer(GetType(MyBook))
Dim fs As New FileStream(Application.StartupPath & "\MyBook.xml", FileMode.Open)
Dim obj As MyBook = CType(ser.Deserialize(fs), MyBook)
fs.Close()
MessageBox.Show("Deseriablize OK...PublicBookName = " & obj.bookName)
End Sub
End Class
========================================
使用Attribute控制XML序列化
(1)建立一個類別包含Public資料
(2)XML序列化及反序列化物件
(3)如何使用Attribute控制XML序列化
  • System.Xml.Serialization Namespace
  • XmlRoot Attribute
  • XmlElement Attribute
  • XmlAttribute Attribute
(4)控制陣列型別的序列化
  • XmlArray Attribute
  • XmlArrayItem Attribute
=====================
Imports System.Xml.Serialization

Public Class MyProduct
Public productID As Integer
Public productName As String
End Class
=====================

Imports System.IO
Imports System.Xml.Serialization
Public Class Form1

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
'1、建立及使用物件

Dim obj As New MyProduct
obj.productID = 123
obj.productName = "可愛小寶具"


'2、序列化XML物件
Dim ser As New XmlSerializer(GetType(MyProduct))
Dim fs As New FileStream(Application.StartupPath & "\MyProduct.xml", FileMode.Create)
ser.Serialize(fs, obj)
fs.Close()
End Sub

Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
'3、反序列化還原物件
Dim ser As New XmlSerializer(GetType(MyProduct))
dim fs as New FileStream(application.StartupPath & "\MyProduct.xml",FileMode.Open)
Dim obj As MyProduct = CType(ser.Deserialize(fs), MyProduct)
fs.Close()

MessageBox.Show("Deseriablize OK...PublicBookName = " & obj.productName)
End Sub
End Class
========================================
使用控制Array型別序列化
Imports System.Xml.Serialization

Public Class MyProduct
Public productID As Integer
Public productName As String
End Class

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

Private Sub Button5_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button5.Click
'1、建立及使用物件
Dim obj As New Group
Dim emp1 As New Employee
Dim emp2 As New Employee
emp1.Name = "Jerry"
emp2.Name = "John"

obj.Employees(0) = emp1
obj.Employees(1) = emp2
'2、序列化XML物件
Dim ser As New XmlSerializer(GetType(Group))
Dim fs As New FileStream(Application.StartupPath & "\Group.xml", FileMode.Create)
ser.Serialize(fs, CType(obj, Group))
fs.Close()
End Sub

Private Sub Button6_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button6.Click
'3、反序列化還原物件
Dim ser As New XmlSerializer(GetType(Group))
Dim fs As New FileStream(Application.StartupPath & "\Group.xml", FileMode.Open)

Dim obj As Group = CType(ser.Deserialize(fs), Group)
fs.Close()
MessageBox.Show("Deseriablize OK...Group = " & obj.Employees(0).Name)

End Sub

2009年9月8日 星期二

工作管理員和記憶體定址空間(M2)

工作管理員

一、記憶體使用歷程記錄:圖示包含全部的虛擬記憶體,也就是實體記憶體+交換檔。記憶體的指標在上下游移就已經可能有問題,因為代表持續需要使用硬碟交換檔上的記憶體。

二、總計:左上角的總計代表著系統中多個應用程式所使用的Windows物件,由於存取Windows各種物件都需要透過2個32位元的「控制碼(Handles)」,所以這裡代表著系統中用了多少個Windows的基礎物件。
=>在「處理程序」頁籤,選擇主選單上「檢視」->「選擇欄位」選項,在「選擇欄位」對話窗中勾選「控制碼計數(Handle Count)」或「執行緒計數(Thread Count)」,再將各程序這兩欄的值加總。而「處理程序」則代表系統上正在執行的處理程序數目。

三、實體記憶體(K):「總共」代表系統實體記體的總數,以KByte為單位。「可用」代表實體記憶體中,尚未被使用的數量。「系統快取記憶體」代表被系統保留做快取用的記憶體大小,這是系統保留給I/O等核心運作時所需的暫存區。

四、確認負載(K):代表虛擬記憶體的使用狀況。「總共」代表已經使用的虛擬記憶體。「限制」代表系統最大虛擬記憶體量。「尖峰」代表曾經使用到最大虛擬記憶體量。

五、核心記憶體(K):代表作業總系統核心所使用的記憶體量。「已分頁」代表可以被置換出去到硬碟的記憶量。「未分頁」代表無論如何都不可以被置換出去到硬碟的記憶體的量。

X86架構下程序的記憶體定址空間
在32位元的定址架構下,理論上是4GBytes空間大小,而實際上該空間會對切成使用者(user)和系統(system)區塊。
=>一般來說,應用程式使用的空間最大為2GB,放的是應用程式的程式碼、公共變數、資料結構、每一條執行緒的堆疊,以及DLL程式碼。
=>系統區塊則放著作業系統的程式碼、HAL、各種系統的資料結構,以及各種驅動程式等等。

當要存取這兩個不同區塊的記憶體時,CPU必須要切換模式,避免一般應用程式出錯時損毀系統區塊,導致整個系統當機。

但所有在系統記憶體區塊執行彼此並沒有保護,因此往往不佳的驅動程式會讓系統呈現極不穩定的狀態。
=>當系統超過2GB以上實體記憶體空間時,需要在boot.ini設定啟動數/3GB或PAE,應用程式才可以使用超出2GB以上的實體記憶體。

2009年9月2日 星期三

各項硬體使用剖析

各項硬體使用剖析
=>不管是使用系統上的哪一項資源,當使用率持續趟過80%時,系統的整體效能必定會急速下滑,而不會呈現線性關係,表示此系統已達「臨界門檻」或「可用性門檻」。

動力泉源

前陣子在工作上遇上的瓶頸,那就是MIS日復一日重覆的工作,
上班不能看雜七雜八的書,至少也讓我有動力動一動吧,
讓人身心感到厭煩,生活沒有成就感,直覺性的操作感覺好像機器,
最近I部上課,讓我從這困境爬了出來,
學習~輸出~學習~輸出,果然還是成長的動力來源,
我要在這邊努力加油,用我的手腦產生的成果,
不要在意別人了…趕緊加油吧…

2009年9月1日 星期二

SQL Service架構(M02)

一、SQL Service架構
1、Database Engine
a、是用於儲存、處理和保護資料的核心服務。
b、可建立線上交易或分析的關聯式資料庫,包括資料表、索引、檢視和預存程序等資料庫物件,以檢視管理和保護資料。
c、整合.NET CLR引擎到SQL Server核心,讓程式設計者可用.NET語言來開發SQL Server內物件。
d、支援ANSI SQL 2003與W3C的XML標準,讓關聯式資料與XML兩種常用的資料儲存格式都可集中到Database Engine來處理。

2、Full Text Search
a、SQL Server 7.0,使用Microsoft Search Service讓資料表欄位內容可以全文檢索方式查詢
b、SQL Server 2000之後,增加image資料格式檢索能力,可將.doc、.xls、.ppt、.txt、.htm直接放入SQL Server大型二進位欄位一併檢索。
d、SQL Server2005建立全文檢索的Catalog內容時,擴展Index population的速度較舊版速度快上一倍,查詢效率30~50%。
=>全文檢索服務支援多執行個體(multi-instanced),而各SQL Server執行個體使用各自全文檢索服務執行個體時,不會互相干擾。
=>支援叢集架構以提高可獲得性
=>可以備份/還原、卸離/附加(detach/attach)全文檢索的catalog,讓資料庫還原或搬移時,不需重建catalog

3、Replication
複寫用於從某個資料庫複製/散發資料和物件至另一資料庫,之後在兩個資料庫之間進行同步處理以維護一致性。
SQL Server提供三種複寫
a、快照式複寫
b、交易式複寫
c、合併式複寫

4、Query Notification
SQL Server2005在使用者存取的資料被他變更時,可主動地通知前端應用程式。

5、Service Broker
提供訊息導向或非同步程式的開發平台,透過SQL Server所提供的佇列(Query),讓服務間非同步的溝通,並保證訊息傳遞間的品質,訊息一定送達且按照發送的先後順序只寄達一次。

6、Analysis Services 2005提出的概念
a、整合異質型資料來源
b、豐富的資料呈現與瀏覽模型,以專業領域的用詞呈現符合商業邏輯的資料
c、深入分析
d、進階的快取

7、Integration Services

8、Reports Services
=============================
二、SQL Server資料存取架構
1、查詢:透過各種物件建立SQL查詢語法
2、使用者端Net-Library採用預設的協定,或是以「用戶端網路公用程式」(SQL Server Client Network Utility)設定通訊協定,經由呼叫Windows的IPC(communication)API,將封包轉由作業系統所支援的通訊協定堆疊傳出。
=>一般來說SQL Server7.0之前優先採用具名管道(Named Pipes),SQL Server 2000之後改採TCP/IP。
=>可採用各種加/解密法傳輸,但會降低效率。
3、ODS(Open Data Services)負責將TDS(Tabular Data Stream)封包內的SQL語法還原,並轉交給關聯式引擎。關聯式引擎最佳化執行計劃後,再賦予儲存式引擎執行。
4、儲存引擎執行完關聯式引擎交付的執行計劃後,將結果傳回給關聯式引擎,關聯式引擎再將其包裝成結果集(resultset),並傳遞給ODS。
5、ODS將結果轉成TDS封包,繼續回傳給「伺服器端Net-Libraries」,「伺服器端Net-Libraries」與「使用者端Net-Library」合作,將結果透過網路傳回。
「使用者端Net-Library」將網路封包還原成TDS封包,轉給上層資料庫介面OLE DB或ODBC等等。
6、OLE DB或ODBC將TDS所描述的結果集還原成上層應用程式可以接受的「結果集 」也就是我們一般應該程式存取的結果。
=============================
三、SQL Server的核心分成兩大引擎
1、Relational Engine

=>SQL Manager總管所有事務的流程,因為透過TDS傳遞有可能是一般SQL語法/pseudo預存程式。
=>一般SQL語法交由左方單元執行。
=>pseudo系統預存程序則由SQL Manager自行處理。
=>再透過ODS轉成TDS通訊協定還給使用者。
=>Catolog Service主要處理Create Table、Create View等語法,Catalog Services主要可橫跨兩個引擎(關聯式引擊/儲存引擎)
=>UMS(User Mode Scheduler)與ODS合作,將工作排程賦予到Thread或fiber。負責有效地運用多CPU的硬體資源,且避免過多的Thread反而拖垮系統。
=>系統預存程序則是由一堆額外之DLL實作出來的,主要提供SQL Server延伸的功能(ex:COM元件)。

a、Relational Engine主要工作
(1)掃描與分析SQL語法,將其分成各個邏輯單元,如關鍵字、參數、運算子及識別項。
(2)建立最佳的執行計畫:此為關聯式引擎最重要的工作。一般而言相同的SQL語法其執行並建立結果集的方式不止一種。查詢最佳化程式(Query Optimizer)必須判斷各種方式、估計其成本(以檔案I/O與使用CPU為主),選擇其成本最低的方式。
(3)處理資料定義語言(DDL)和其它SQL語法(例如:Create、Set等語法)。
(4)格式化結果:關聯式引擎會將回用戶端的結果格式化,可能會格式化成傳統的表格式結果集,或成為XML文件。然後結果會被封裝成一個以上的TDS封包,再傳回前端應用程式。
=============================
2、Storage Engine
=>Access methods manager:設定並要求對資料表或索引做掃描的動作,準備記錄集以傳回關聯式引擎。
=>Row operations manager:存取、修改和執行其它與單筆記錄相關的運作。
=>Index manager:存取索引的搜尋。
=>Page manager:控制分頁(Page)和extent的存取。
=>Text manager:控制text和image資料型態的儲存。
=>Lock manager:要求並釋放鎖定、解決死結,並在需要時升高鎖定的層級。
=>Log manager:將在記憶體中的交易記錄成可寫進硬碟記錄檔。
=>Sort manager:管理資料排序工作。
=>Transaction manager:管理交易,並與Lock Manager協調鎖定的運作。
=>File/Device manager:管理硬碟上的檔案和備援裝置。
=>Buffer manager:讀取實體分頁,將分頁的內容放入記憶體,並協助其它的manager讀取分頁內容。
=& gt;其它的manager:管理各種工具程式,如大量載入(bulk load), DBCC,備份和還原,以及虛擬裝置介面(Virtual Device Interface;VDI)。VDI讓工具程式可以存取SQL Server的資料結構而不需要經過關聯式引擎。

a、儲存引擎主要的工作表如下:
(1)管理資料庫的實體檔案
(2)建立及讀取硬碟上儲存著資料的分頁。
(3)管理實體檔案的資料緩衝區及I/O。
(4)控制多個需求的並行處理。
(5)管理交易並使用鎖定來控制平行存取的資料行。
(6)記錄(Log)與復原。
(7)實作公用程式功能(ex:BACKUP、RESTORE和DBCC陳述式及大量複製(Bulk Copy)等)