Pages - Menu

2016年8月12日 星期五

Dapper for VB.net(動態欄位取值)

以前一直用自己寫的code撈資料,丟給datatable,在將值撈出來。
前鎮子看到Dapper,不用不知道,用了之後我都在想把我先前寫的code丟去旁邊了。
強型別的好處,當你寫過MVC的人就會知道。
Dapper詳細的介紹可以參考下面幾位大大的說明,
在此不多說,因為同事他看不懂C#,為了讓他日後接手,所以寫應用程式必須用VB。
而網路上Dapper for VB.net 的語法不是很多,所以備忘一下。
mrkt的程式學習筆記
黑暗執行緒
國外寫的C#對應VB.net

比較常用的語法,
如果有使用對稱金鑰,要解密的話也可以用。

    Public Function SelectClientConfig(Process As String) As IEnumerable(Of strConnect)
            Using conn As SqlConnection = New SqlConnection(SqlConnString())
                Const query As String = "OPEN SYMMETRIC KEY RM_SY
DECRYPTION BY PASSWORD = 'Mes6987600'; select ProcessName,MachineLine,ProcessIP,DbName,TableType,TableName,ColName,
UserName,CONVERT(VARCHAR, DECRYPTBYKEY(UserPw)) as UserPw from GetDataConfig where processName=@pName and machineLine = @mLine"
                Return conn.Query(Of strConnect)(query, New With {.pName = processName, .mLine = machineLine})
            End Using
    End Function

前面的範例,基本上就夠使用了。
現在為了要懶一點,日後不想改程式,
直接維護資料庫就好,所以我的欄位以及資料表名稱都是變數,
必須用其他方式帶入。如果是使用Dapper的語法,會在變數的前後加上單引號…然後導致錯誤

Public Function selectClientValue(clientConfig As strConnect, sn As Integer)
    If IsNothing(clientConfig) = False Then
        Dim connStr As String = String.Format("Data Source=10.27.1.62,1433;Initial Catalog={0};User ID={1};Password={2}",
                                clientConfig.DbName, clientConfig.UserName, clientConfig.UserPw)
        Using conn As SqlConnection = New SqlConnection(connStr)
            Dim query As String = String.Format("select {0} from {1} where sn=@sn and pasteLine=@machineLine", clientConfig.ColName, clientConfig.TableName)
            Dim ClientValue As Object = conn.Query(query, New With {.sn = sn, .machineLine = clientConfig.MachineLine})
            Return ClientValue
        End Using
    End If
End Function


這邊我沒用到強型別,可以看到conn.query後面就直接接執行的語法以及變數。
不像上一個conn.Query(Of strConnect) 還有指定型別。
此時,怎麼撈資料就會是一個重點。
先上程式碼

Dim _clientPar As Object = selectClientValue(clientConfig, sn)
           For Each par As IDictionary(Of String, Object) In _clientPar
               Dim value = par.Values.ToArray
               Dim col = par.Keys.ToArray
               Dim listPar As List(Of String) = New List(Of String)
               For i = 0 To col.Count - 1
                   listPar.Add(col(i).ToString() & ":" & value(i).ToString)
               Next
               Dim strPar = String.Join(",", listPar)
               Console.WriteLine(strPar)
               'For Each a In listPar
               '    Console.WriteLine(a)
               'Next
               'Dim lot As String = y.Values.ElementAt(0)
             

           Next

不使用強型別,所撈出來的資料是一個object 。
將他轉成  IDictionary(Of String,object),後才能對他做撈取的動作。
如果不想轉也可以,可以使用

_clientPar(0).pasteLot

(0)是指第一行資料;pasteLot 是欄位名稱。
但我如果知道欄位名稱,幹麻不用強型別就好,還不用怕打錯字。
所以這邊要想辦法改用陣列的方式取值。
所以使用  IDictionary這個不能少。
取值 是 Values 物件。而keys 是撈取欄位的名稱。
在上面直接轉成array,因為我要將欄位名稱跟值合在一起。
如果不需要可以直接用

par.Values.ElementAt(0)

取值。
上面有使用到clientConfig.colName,是因為前面有用dapper從資料庫內
擷取資料出來。

補上 strConnect的結構

Public Class strConnect
    Property ProcessName As String
    Property MachineLine As String
    Property ProcessIP As String
    Property Port As Integer
    Property DbName As String
    Property TableType As String
    Property TableName As String
    Property ColName As String
    Property UserName As String
    Property UserPw As String
End Class

沒有留言:

張貼留言