2017/10/24

.Net Standard 學習心得與想法

.Net Standard 發展的勢頭越來越旺,身為一個跟資訊沾點邊的人當然要好好地來了解一下。
以下是我的一些想法,如果有錯誤的地方歡迎來指正。

網路上已經有了很多.Net Standard 的相關文章,不論是官方的說明、還是網友的分享都寫得非常的精采,但是這些都還是無法解我的疑惑?
大部分的介紹文都會放這張圖


     資料來源:https://blogs.msdn.microsoft.com/dotnet/2016/09/26/introducing-net-standard/

這張圖讓我了解了.Net Standard 的架構,但是然後呢?
我應該怎麼使用.Net Standard 在我現有的專案上?
難道要我把現有的專案都用.Net Standard 的標準改寫嗎?
這些疑惑讓我對.Net Standard 這項技術有無從下手的感覺。
好在天無絕人之路,看了一篇文章
https://dotblogs.com.tw/aspnetshare/2017/02/26/20170225-netstandardagain
其中有一段
".Net Standard 並不算是一個實做任何東西的 platform,其實它是一系列的規範來要求每個 platform 在不同的版本下需要實做出那些 API"
我瞬間懂了,這其實說的就是物件裡的介面嘛!
簡單的說就是微軟定義了好幾組要大家遵守的介面API,並在編譯時幫忙將 .Net Standard API 對應到.Net Framework、Net Core、XAMARIN等實際可用的同名方法。

實際上應該要怎麼使用呢?
我的想法是:
在開發一個符合.Net Standard架構的系統,這個新的.Net Standard系統主要是要把已開發的.Net Framework系統供外部呼叫使用
有點類似MVC 的controller 的功用
假設我有一個已開發完成的 .Net Framework DLL 專案,那麼我先依據以下這張表決定要用哪一版的.Net Standard來開發

舉個例子:
我有一個.Net Framework開發的系統 ABC.DLL
我先依據ABC.DLL使用的.Net Framework版本參考以下這張表決定要用哪一版的.Net Standard來開發


    資料來源:https://github.com/dotnet/standard/blob/master/docs/versions.md

在來另開一個新的.Net Standard專案STD.DLL,當然STD.DLL必須能呼叫使用ABC.DLL
然後外部系統不論是用.Net Framework、Net Core還是XAMARIN來開發,只要支援STD.DLL 的.Net Standard版本
都可以透由STD.DLL 來使用 ABC.DLL。

2017/10/19

樹型資料庫結構設計

最近正在研究樹型資料庫結構設計,從網路上找了不少資料甚有啟發
特別記錄下網路上的資料

大家如果有好的觀點,或者好的文章連結,歡迎聯絡我!

2017/10/14

[VB.net] 如何避免程式重複執行

一般要避免開發的應用程式在系統上被使用者重複執行時有以下方法:


方法一.
直接在專案設定裡勾選 "建立單一執行個體應用程式"。


採用這個方法無論在執行程式前程式名稱是否不同,都無法重複執行。

方法二.
直接在 form load 事件裡新增檢查系統上是否有重複名稱的程式在執行

Dim _ThisProcess As Process = Process.GetCurrentProcess
Dim _ProcessArr() As Process = Process.GetProcessesByName(_ThisProcess.ProcessName)
If _ProcessArr.Length > 1 Then
'有重複名稱的程式開啟,關閉自己停止執行

   Erase _ProcessArr
   End

Else

   Erase _ProcessArr

End If

這個方法需要特別注意的是,在執行程式前只要程式名稱不同,雖然是相同的程式也是會重複執行。


2017/10/09

[ADO.NET] VB.net 資料庫連線 IV

接續前一篇 [ADO.NET] VB.net 資料庫連線 III
系列文章最後一篇,說明如何使用參數方式來避免隱碼攻擊


If VbConn.State = ConnectionState.Closed Then
   VbConn.ConnectionString = VbConnectionString
   VbConn.Open()
   Dim VbCommand As System.Data.SqlClient.SqlCommand = VbConn.CreateCommand

   VbCommand.CommandText="SELECT * FROM Test WHERE test1=@p1"
   VbCommand.Parameters.AddWithValue("@p1" , "a123")


   Dim ExecuteReturn As Integer = VbCommand.ExecuteNonQuery
   VbCommand.Cancel()
   VbConn.Close()
End If

接著說明DataAdapter如何使用參數
Dim MyDataTable As New DataTable
Dim GetData As String=""
Using VbConn As SqlClient.SqlConnection = New SqlClient.SqlConnection(VbConnectionString)

   Using Adp As New System.Data.SqlClient.SqlDataAdapter("SELECT * FROM Test WHERE test1=@p1", VbConn)
     Adp.SelectCommand.Parameters.AddWithValue("@p1" , "A123")


     Adp.Fill(MyDataTable)
   End Using

End Using

For i = 0 To MyDataTable.Rows.Count - 1 Step 1
   GetData = MyDataTable.Rows(i).Item("欄位名稱")
Next


使用參數化查詢並沒有特別困難,但是要特別注意!!
以SELECT * FROM Test WHERE test1=@p1 這個範例來說,無論test1這個欄位是不是文字格式,都只要輸入test1=@p1就好,千萬不要輸入test1='@p1',會造成系統錯誤。

補充:
如果使用的是OdbcParameter 參數的使用會比較不同
範例:
If VbConn.State = ConnectionState.Closed Then
   VbConn.ConnectionString = VbConnectionString
   VbConn.Open()
   Dim VbCommand As System.Data.Odbc.OdbcCommand = VbConn.CreateCommand

   VbCommand.CommandText="SELECT * FROM Test WHERE test1=? AND test2=?"
   VbCommand.Parameters.Add("test1" ,OdbcType.VarChar).Value="A1234"
   VbCommand.Parameters.Add("test2" ,OdbcType.Int).Value="1234"


   Dim ExecuteReturn As Integer = VbCommand.ExecuteNonQuery
   VbCommand.Cancel()
   VbConn.Close()
End If
詳細說明請參考:https://msdn.microsoft.com/zh-tw/library/zxdcah9t(v=vs.110).aspx

2017/10/01

[EXCEL] VBA語法紀錄

偶而還是會用到EXCEL VBA進行開發,紀錄一下語法方便查詢

常用命令:
1. Workbook 活頁簿
2. Workbooks 活頁簿集合
3. Workbooks("filename") 檔名為filename的活頁簿
4. ActiveWorkbook 正在作用中的活頁簿
5. Sheets 活頁簿中所有工作表
6. Sheets(n) 活頁簿中第n張工作表
7. Worksheet 工作表
8. Worksheets 所有工作表(包括圖表)
9. Worksheets("sheet") 指表名為sheet工作表
10. ActiveSheet 正在作用中的工作表
11. Columns("c1:c2") c1至c2欄(其中c1,c2為A~Z或AA~XFD等欄名)
12. Rows("r1:r2") r1至r2列(其中r1,r2為1~1048576等列名
13. Range("x1:x2") x1至x2間的儲存格(其中x1,x2為儲存格位址名稱)
14. cells(i,j) 儲存格(第i列、第j行)
15. ActiveCell 目前的儲存格
16. Selection 目前所選取的物件
使用範例:
Workbooks("Book1").Sheets("Sheet1").Range("A1:D5").Font.Bold = True
Worksheets("Sheet1").Cells.ClearContents
Worksheets("Sheet1").Rows(1).Font.Bold = True
Range("1:1,3:3,8:8")
Worksheets("Sheet1").Cells(6, 1).Value = 10
Worksheets("Sheet1").[A1:B5].ClearContents
ActiveCell.Offset(1, 3).Font.Underline = xlDouble

活頁簿常用屬性:
1.ActiveWorkBook.Name 目前活頁簿的名稱
2.ActiveWorkBook.Save 儲存目前的活頁簿
3.ActiveWorkBook.SaveAs Filename := "filename" 另儲新檔
4.WorkBooks.Add 新增活頁簿
5.WorkBooks(i).Close [SaveChange, Filename, RouteWorkbook] 關閉指定的第i個活頁簿
     SaveChange := True 改變儲存
     SaveChange := False 不會改變儲存
     SaveChange省略時,會出現對話方塊
     filename := "檔名"
6.WorkBooks.Open "filename" 開啟一個活頁簿
7.Application.Windows 所有活頁簿視窗
8.WorkBooks.Count 活頁簿的數量
9.WorkBooks.Item(Index) 傳回單一活頁簿,由索引值指定

工作表常用屬性:
Worksheets.Add [Before, After, Count, Type] 新增工作表
     Before := Worksheets(n) 出現於某工作表之前
     After := Worksheets(n) 出現於某工作表之後
     Count := n 新增工作表數量
     Type := xlWorksheet (工作表) 或 xlChart (圖表)
WorkSheets.Name 工作表名稱
WorkSheets("Sheet1").Activate 設定工作表為目前作用的功作表