前鎮子看到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
沒有留言:
張貼留言