VB.NET 调用金蝶登录,并解析PropsString

本篇是上一篇的姊妹篇,使用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为金蝶做二次开发的人。