上色

Code Block

2013年8月2日 星期五

[VB.Net] Using並不包含錯誤處理

如下列程式碼︰
Using cmd As New OleDbCommand("CREATE TABLE [test] ([ID] INTEGER,[Username] VarChar,[UserPwd] VarChar)", CalcdConnection)
  cmd.ExecuteNonQuery()
  cmd.CommandText = "INSERT INTO [test$] VALUES(1,'elmer','password')"
  cmd.ExecuteNonQuery()
End Using
可寫成如下表示︰
Dim cmd As New OleDbCommand("CREATE TABLE [test] ([ID] INTEGER,[Username] VarChar,[UserPwd] VarChar)", CalcdConnection)
Try
  cmd.ExecuteNonQuery()
  cmd.CommandText = "INSERT INTO [test$] VALUES(1,'elmer','password')"
  cmd.ExecuteNonQuery()
Finally
    If cmd <> vbNull Then
        cmd.Dispose()
    End If
End Try
事實上並不包含錯誤處理,也就是Catch區塊;因此需自行添加錯誤處理方式

[Date Structure] Class和Structure

Class是reference type,程式執行時資料儲存在heap中
Structure是Value type,程式執行時資料儲存在stack中

因此在method中使用structure時,事實上是建立該structure的副本,因此改動這個數值並不會影響本來的資料,如︰

Structure TotalTime
  Dim tt As String
End Structure

Dim result(100) as TotalTime '定義result為TotalTime陣列 

For Each a As TotalTime In result
    a.tt=a.tt+1
Next
此時,result陣列中的數值並不會改變,因為Structure是Value type,所以For...Each時是複製一個result的副本。
因此需將result定義為class才可正確獲得預期效果。

但是同樣需要注意的是,因為Class是reference type,必須以New關鍵字一一將陣列中的元素定義為執行個體(物件)

[VB.Net] 讀取Access與Excel資料庫

'Access資料庫之連接位址
Public DBLocation As String = "Provider=Microsoft.ACE.Oledb.12.0;Data Source=檔案位址"
'Excel資料表之連接位址
Public DBLocation As String = "Provider=Microsoft.ACE.Oledb.12.0;Data Source=檔案位址;Extended Properties=""Excel 8.0;HDR=Yes;IMEX=1,ReadOnly=0"""
屬性意義
HDR=Yes: 第一列不要視為資料欄位,應視為欄位標題
IMEX=1: 所有資料視為文字讀取,如此即可順利讀取所有資料
ReadOnly=0: 設定為可讀寫,如此才可以更新內容

以OleDbConnection開啟資料庫
DBConnection = New OleDbConnection(DBLocation)
DBConnection.Open() '打開連接

以SQL命令執行各種搜尋,如︰
Dim objCmd As OleDbCommand = New OleDbCommand("SELECT * FROM 資料表", DBConnection)
此處資料表即為Access中的資料表,或是Excel中的工作表

引用Excel工作表時︰
  • 若要引用工作表全部範圍
    Select * from [Sheet1$]
  • 引用已定義名稱的範圍
    Select * from [MyNamedRange] 
  • 引用工作表中特定位址的某範圍
    Select * from [Sheet1$A1:B10] 
※工作表後的美元符號($)代表工作表存在的指示,若要新增工作表,請勿使用此符號

Reference:  HOW TO:使用 ADO.NET 擷取與修改利用 Visual Basic .NET 之 Excel 活頁簿中的記錄

2013年7月6日 星期六

[VB.Net] ThreadStart與ParameterizedThreadStart

若要建立一個不含參數的執行緒(thread),使用ThreadStart這個委託函式即可;但是若要建立含有參數的執行緒,則須以ParameterizedThreadStart這個委託函式建立。

但是自.Net framework 2.0開始,只要方法不是overloading,compiler都會自行判斷要使用哪個方法建立執行緒,因此直接以一般方法建立即可,如︰
Dim thread1 As Thread = New Thread(AddressOf MyThread);
thread1.Start();

Dim thread2 As Thread = New Thread(New ThreadStart(AddressOf MyThread));
thread2.Start();

Dim thread3 As Thread = New Thread(AddressOf MyThreadWithParameter);
thread3.Start(myClass);

Dim thread4 As Thread = New Thread(New ParameterizedThreadStart(AddressOf MyThreadWithParameter));
thread4.Start(myClass);
以上四種方法都是可行的。

Reference:
http://www.cftea.com/c/2012/03/0ELGB9V327N8CCKT.asp

2013年7月4日 星期四

[VB.Net] Invoke and BeginInvoke

Control.Invoke︰強制於UI thread上執行委派,與原始thread同步
Control.BeginInvoke︰強制於UI thread上執行委派,與原始thread不同步

[delegate].Invoke︰在原來thread上同步執行委派
[delegate].BeginInvoke︰在一個新的背景thread上執行委派,與原始thread不同步

2013年6月30日 星期日

[VB.Net] 物件XML序列化及反序列化方法

可將物件序列化之後利用網路傳送至其他程序,或者另存為文件
 
Public Function Serialize(ByVal objType As Type, ByVal obj As Object) As String
    '將元件進行序列化
    Dim XMLString As String = String.Empty
    Dim mySerializer As XmlSerializer = New XmlSerializer(objType) '以objType建立XML序列化元件
    Dim writer As New IO.StringWriter '建立資料流
    mySerializer.Serialize(writer, obj) 'XML序列化
    XMLString = writer.ToString '轉為字串
    writer.Close() '關閉資料流
    Return XMLString '回傳
End Function

Public Function Deserialize(ByVal objType As Type, ByVal XMLString As String) As Object
    '將取得的內容進行反序列化
    Dim mySerializer As XmlSerializer = New XmlSerializer(objType) '以objType建立XML序列化元件
    Dim reader As New IO.StringReader(XMLString) '以序列化後的XMLString建立資料流
    Return mySerializer.Deserialize(reader) '回傳反序列化後的物件
End Function 

2013年5月1日 星期三

[圖像處理] BMP影像分散寬度(stride)與影像寬度(width)

Stride︰代表每列影像列的位元長度(bytes),等於argb(32bits)或rgb(24bits)乘上影像寬度
Width︰影像寬度

此處有個問題,若影像寬度乘上位元之後不是4的倍數(32bits),系統會自動補足到4的倍數;如影像寬度270,則Stride應為810,但810不是4的倍數,因此系統會自動補到812,若直接以Stride/Width取得位元組數或是要取得影像起始位置時就會出錯。