本篇是上一篇的姊妹篇,使用VB.NET实现,这有点类似.NET 4.0之后,C#的Dynamic方式实现,具体看代码,调用方式与上一篇类似:
Imports System Imports System.Collections.Generic Imports System.Text Imports System.Data.OleDb Imports System.Data.SqlClient Namespace System Public Class KingdeeLogin Private _kindeeLoginObject As Object Private _sqlConnectionString As String Private _accountName As String Private _userName As String Private _userId As Integer Public Sub New() _kindeeLoginObject = CreateObject("K3Login.ClsLogin") End Sub Public Function CheckLogin() As Boolean Dim result As Boolean = _kindeeLoginObject.CheckLogin If result Then InitialLoginDatas() End If Return result End Function #Region "解析金蝶的PropsString" Private Sub InitialLoginDatas() Dim kingdeePropsString As String = _kindeeLoginObject.PropsString _accountName = _kindeeLoginObject.AcctName ParsePropsStringToField(kingdeePropsString) End Sub Private Sub ParsePropsStringToField(ByVal propsString As String) Dim datas = ReadPropsStringToDictinary(propsString) _userName = GetValueFromDictionary("UserName", datas) _userId = CInt(GetValueFromDictionary("UserID", datas)) _sqlConnectionString = ConvertSqlConnectionString(GetValueFromDictionary("ConnectString", datas)) '在这里大家可以继续扩展哦 End Sub Private Function ConvertSqlConnectionString(ByVal oleDbConnectionString As String) As String Dim oleBuilder As New OleDbConnectionStringBuilder(oleDbConnectionString) Dim sqlBuilder As New SqlConnectionStringBuilder sqlBuilder.UserID = oleBuilder("User ID").ToString() sqlBuilder.Password = oleBuilder("Password").ToString() sqlBuilder.DataSource = oleBuilder("Data Source").ToString() sqlBuilder.InitialCatalog = oleBuilder("Initial Catalog").ToString() Dim IntegratedSecurity As New Object If oleBuilder.TryGetValue("Integrated Security", IntegratedSecurity) Then If IntegratedSecurity.ToString().ToUpper() = "SSPI" Then sqlBuilder.IntegratedSecurity = True End If Else sqlBuilder.IntegratedSecurity = False End If Return sqlBuilder.ConnectionString End Function Private Function ReadPropsStringToDictinary(ByVal propsString As String) As Dictionary(Of String, String) Dim result As New Dictionary(Of String, String) Dim curIndex As Integer = 0 While curIndex < propsString.Length curIndex += ReadSection(result, propsString) End While Return result End Function Private Function ReadSection(ByVal sections As Dictionary(Of String, String), ByVal source As String) As Integer Dim lengthResult As Integer = 0 Dim key As String = "" Dim value As String = "" lengthResult += ReadKey(source, key) lengthResult += ReadValue(source.Substring(lengthResult), value) sections.Add(key, value) Return lengthResult End Function Private Function ReadKey(ByVal source As String, ByRef key As String) As Integer key = "" Dim lengthResult As Integer = 0 For i As Integer = 0 To source.Length lengthResult = i + 1 If source(i) = "=" Then Exit For Else key += source(i) End If Next Return lengthResult End Function Private Function ReadValue(ByVal source As String, ByRef value As String) value = "" Dim lengthResult As Integer = 0 Dim charStack As New Stack(Of Char) For i As Integer = 0 To source.Length Dim c = source(i) lengthResult += i + 1 If c = "{" Then If charStack.Count > 0 Then value += c charStack.Push(c) ElseIf c = "}" Then charStack.Pop() If charStack.Count > 0 Then value += c ElseIf c = ";" Then If charStack.Count > 0 Then value += c Else Exit For Else value += c End If Next Return lengthResult End Function Private Function GetValueFromDictionary(ByVal key As String, ByVal source As Dictionary(Of String, String)) As String Dim dicKey As String = "" For Each sKey As String In source.Keys If key.Trim.ToUpper = sKey.Trim.ToUpper Then dicKey = sKey Exit For End If Next If (String.IsNullOrEmpty(dicKey)) Then Return String.Empty Return source(dicKey) End Function #End Region Public ReadOnly Property SqlConnectionString() As String Get Return _sqlConnectionString End Get End Property Public ReadOnly Property AccountName() As String Get Return _accountName End Get End Property Public ReadOnly Property UserName() As String Get Return _userName End Get End Property Public ReadOnly Property UserID() As Integer Get Return _userId End Get End Property End Class End Namespace希望可以帮助到使用VB.NET为金蝶做二次开发的人。