VB MySql优化

时间:2014-01-24 22:10:07

标签: mysql vb.net optimization

我这里有一个VB代码,它连接到MySql数据库,以更新数据库中表单的每个页面上的每个控件。

我被告知要花的时间超过应该跑的时间。注释'Setup MySql connection'是它启动的地方。我想知道是否有任何明显的优化技巧我在这里缺少或者有些东西写得很糟糕(我不确定何时打开和关闭MySqlDataReader和Connections):

    Dim penPngList As New List(Of String)

    'Get information on the pen docked
    Dim penID As String
    penID = _form.SessionData(0).DeviceState.PadDeviceID
    'penID = "aaa"

    Try
        Dim i = 0

        For Each er As ExportResult In _form.Validator.ExportResults


            If er.DataPathName = "xml" Then

                'Load the XML
                Dim doc As New XmlDocument
                doc.Load(er.ExpandedFilePath)

                'Get MySql Reader ready
                Dim rdr0 As MySqlDataReader
                Dim rdr As MySqlDataReader

                Dim sessionID As Int32

                'Grab the Descriptor
                Dim document As XPathDocument = New XPathDocument(er.ExpandedFilePath)
                Dim navigator As XPathNavigator = document.CreateNavigator()

                Dim descNode As XPathNavigator = navigator.SelectSingleNode("//MIFORMS_EXPORT/SESSION/FIELD[@NAME='DESCRIPTOR']")

                'Strip the Descriptor to get ID
                Dim descriptorString As String = descNode.InnerXml
                'Const descriptorString As String = "3_cytoxdemtest_0199_999_1"

                'Strip the Descriptor to get ID
                Dim descriptorSplitArray As String() = descriptorString.Split("_")
                Dim id As String = descriptorSplitArray(0)

                'TASK: Get the pen image PNG name
                'Get the total Session count in XML
                Dim penImageRaw As Int32 = doc.GetElementsByTagName("SESSION").Count

                If penImageRaw > 0 Then
                    'Grab the last session element (Last one is count-1)
                    Dim test As XmlNode = doc.GetElementsByTagName("SESSION").Item(penImageRaw - 1)
                    Dim list As XmlNodeList = test.ChildNodes

                    For Each node As XmlNode In list
                        If String.Equals(node.Name, "IMAGE") Then

                            Dim penImageExplode As String() = node.FirstChild.Value.Split("\")
                            PenImage = penImageExplode(penImageExplode.Length - 1)
                            penPngList.Add(PenImage)

                        End If
                    Next

                Else
                    MsgBox("ERROR: No Session nodes found")
                End If

                'Set-up MySql connection                    
                Const connStr As String = "server=localhost;user id=root; password=password; database=backend; pooling=false"
                Dim conn As New MySqlConnection(connStr)
                conn.Open()

                'Get the information from that ID the concerned ID
                Dim stm As String = "SELECT Patient , Visit, Project, Centre FROM identifiers WHERE ID = '" & id & "'"
                Dim cmd As New MySqlCommand(stm, conn)
                rdr = cmd.ExecuteReader()


                If rdr.Read Then
                    patient = rdr.GetString(0)
                    visit = rdr.GetInt32(1)
                    project = rdr.GetString(2)
                    centre = rdr.GetString(3)
                Else
                    Throw New Exception("Could not find the identifier")
                End If

                'Connect to the patient using the information gathered from above
                Dim connStrToProject As String = "server=localhost;user id=root; password=password; database=" & project & "; pooling=false"
                Dim connToProject As New MySqlConnection(connStrToProject)
                connToProject.Open()

                'Set-up MySql connection                    
                Const connStr0 As String = "server=localhost;user id=root; password=password; database=backend; pooling=false"
                Dim conn0 As New MySqlConnection(connStr0)
                conn0.Open()

                'Get the session info
                Dim stm0 As String = "SELECT MAX(Session) FROM " & project & ".bay"
                Dim cmd0 As New MySqlCommand(stm0, conn0)
                rdr0 = cmd0.ExecuteReader()

                While (rdr0.Read())
                    If rdr0("MAX(Session)") Is DBNull.Value Then
                        sessionID = 1
                    Else
                        sessionID = rdr0.GetInt32(0)
                        sessionID = sessionID + 1
                    End If
                End While

                rdr0.Close()

                'For each page of the form pages
                For Each myPage As FormPage In _form.Pages()

                    'Go through each control on the page
                    For Each myControl As FormControl In myPage.Controls()

                        Dim nowDate As String
                        nowDate = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss")

                        'convert cm to DIU (device-independent units)
                        Dim rectHeight As Int32 = (myControl.Size.Height / 2.54) * 72
                        Dim rectWidth As Int32 = (myControl.Size.Width / 2.54) * 72
                        Dim rectX As Int32 = (myControl.Position.X / 2.54) * 72
                        Dim rectY As Int32 = (myControl.Position.Y / 2.54) * 72

                        'As date variable numbers repeat, MiForm adds _x, which breaks update query. 
                        'This is where we strip that out.
                        Dim stringToCheck As String = myControl.Name
                        Const stringToFind As String = "_"
                        Dim exp As New Regex(stringToFind, RegexOptions.IgnoreCase)
                        Dim occurrences As Integer = exp.Matches(stringToCheck).Count

                        If occurrences = 1 And stringToCheck.Contains("_M") = False Or myControl.Name.Contains("_T") = False Then
                            Dim singleVal = myControl.Name.Split("_")
                            Dim sameValue = singleVal(0)

                            Dim insertQuery1 As String = "INSERT INTO audit_pen (`Session`, `Patient`, `ValidText`, `FieldNumber`, `Marker_Height`, `Marker_Width`, `Marker_X`, `Marker_Y`, `PenPng`, `Visit`, `Page`, `EntryDate`) " & _
                            "VALUES ('" & sessionID + 1 & "', '" & patient & "', '" & myControl.Value & "', '" & sameValue & "', '" & rectHeight & "', '" & rectWidth & "', '" & rectX & "', '" & rectY & "', '" & penPngList(i) & "', '" & visit & "', '" & myPage.Name & "', '" & nowDate & "')"

                            Dim insertQuery1Exe As New MySqlCommand(insertQuery1, connToProject)
                            rdr = insertQuery1Exe.ExecuteReader()
                            rdr.Close()

                            Dim insertQueryForRepeatVars As String = "UPDATE patient" & patient & " SET `Data Verified (valid)` = '1' , " & _
                            "`Valid Text (validc)` = '" & myControl.Value & "' , " & _
                            "`Verified DEC (namev)` = '" & penID & "' , " & _
                            "`Base DEC (nameb)` = '[Valid Override]' , `Compare DEC (namec)` = '[Valid Override]' , " & _
                            "`LatestPenDate` = '" & nowDate & "' , " & _
                            "`Base Entry Date (mdateb)` = '" & nowDate & "' , " & _
                            "`Compare Entry Date (mdatec)` = '" & nowDate & "' , " & _
                            "UploadedXML = '" & er.DataPathName & "' , " & _
                            "FromDigiPen = '1' , " & _
                            "rect_height = '" & rectHeight & "' , " & _
                            "rect_width = '" & rectWidth & "' , " & _
                            "rect_x = '" & rectX & "' , " & _
                            "rect_y = '" & rectY & "' , " & _
                            "PenPngLocation = '/images/" & penPngList(i) & "'" & _
                            "WHERE `Visit Number (VISIT)` = '" & visit & "' AND " & _
                            "`Page Number (PAGE)` = '" & myPage.Name & "' AND " & _
                            "`Variable Number (var)` = '" & sameValue & "'"

                            Dim insertQueryForRepeatVarsExe As New MySqlCommand(insertQueryForRepeatVars, connToProject)
                            rdr = insertQueryForRepeatVarsExe.ExecuteReader()
                            rdr.Close()

                        End If

                        'If underscore occured twice, that means "_x" was added in a date field "AO001DATE_M_x"
                        If occurrences = 2 Or myControl.Name.Contains("_M") Or myControl.Name.Contains("_T") Then
                            Dim test = myControl.Name.Split("_")
                            Dim sameVarName = test(0) + "_" + test(1)

                            Dim insertQuery2 As String = "INSERT INTO audit_pen (`Session`, `Patient`, `ValidText`, `FieldNumber`, `Marker_Height`, `Marker_Width`, `Marker_X`, `Marker_Y`, `PenPng`, `Visit`, `Page`, `EntryDate`) " & _
                            "VALUES ('" & sessionID + 1 & "', '" & patient & "', '" & myControl.Value & "', '" & sameVarName & "', '" & rectHeight & "', '" & rectWidth & "', '" & rectX & "', '" & rectY & "', '" & penPngList(i) & "', '" & visit & "', '" & myPage.Name & "', '" & nowDate & "')"

                            Dim insertQuery2Exe As New MySqlCommand(insertQuery2, connToProject)
                            rdr = insertQuery2Exe.ExecuteReader()
                            rdr.Close()

                            'Update the patient data for repeat values
                            Dim insertQueryForRepeatValues As String = "UPDATE patient" & patient & " SET `Data Verified (valid)` = '1' , " & _
                            "`Valid Text (validc)` = '" & myControl.Value & "' , " & _
                            "`Verified DEC (namev)` = '" & penID & "' , " & _
                            "`Base DEC (nameb)` = '[Valid Override]' , `Compare DEC (namec)` = '[Valid Override]' , " & _
                            "`LatestPenDate` = '" & nowDate & "' , " & _
                            "`Base Entry Date (mdateb)` = '" & nowDate & "' , " & _
                            "`Compare Entry Date (mdatec)` = '" & nowDate & "' , " & _
                            "UploadedXML = '" & er.DataPathName & "' , " & _
                            "FromDigiPen = '1' , " & _
                            "rect_height = '" & rectHeight & "' , " & _
                            "rect_width = '" & rectWidth & "' , " & _
                            "rect_x = '" & rectX & "' , " & _
                            "rect_y = '" & rectY & "' , " & _
                            "PenPngLocation = '/images/" & penPngList(i) & "'" & _
                            "WHERE `Visit Number (VISIT)` = '" & visit & "' AND " & _
                            "`Page Number (PAGE)` = '" & myPage.Name & "' AND " & _
                            "`Variable Number (var)` = '" & sameVarName & "'"

                            Dim insertQueryForRepeatValuesExe As New MySqlCommand(insertQueryForRepeatValues, connToProject)
                            rdr = insertQueryForRepeatValuesExe.ExecuteReader()
                            rdr.Close()

                        End If

                        If occurrences = 0 Then

                            Dim insertQuery2 As String = "INSERT INTO audit_pen (`Session`, `Patient`, `ValidText`, `FieldNumber`, `Marker_Height`, `Marker_Width`, `Marker_X`, `Marker_Y`, `PenPng`, `Visit`, `Page`, `EntryDate`) " & _
                            "VALUES ('" & sessionID + 1 & "', '" & patient & "', '" & myControl.Value & "', '" & myControl.Name & "', '" & rectHeight & "', '" & rectWidth & "', '" & rectX & "', '" & rectY & "', '" & penPngList(i) & "', '" & visit & "', '" & myPage.Name & "', '" & nowDate & "')"

                            Dim insertQuery2Exe As New MySqlCommand(insertQuery2, connToProject)
                            rdr = insertQuery2Exe.ExecuteReader()
                            rdr.Close()

                            'Update the patient data
                            Dim insertQuery As String = "UPDATE patient" & patient & " SET `Data Verified (valid)` = '1' , " & _
                            "`Valid Text (validc)` = '" & myControl.Value & "' , " & _
                            "`Verified DEC (namev)` = '" & penID & "' , " & _
                            "`Base DEC (nameb)` = '[Valid Override]' , `Compare DEC (namec)` = '[Valid Override]' , " & _
                            "`LatestPenDate` = '" & nowDate & "' , " & _
                            "`Base Entry Date (mdateb)` = '" & nowDate & "' , " & _
                            "`Compare Entry Date (mdatec)` = '" & nowDate & "' , " & _
                            "UploadedXML = '" & er.DataPathName & "' , " & _
                            "FromDigiPen = '1' , " & _
                            "rect_height = '" & rectHeight & "' , " & _
                            "rect_width = '" & rectWidth & "' , " & _
                            "rect_x = '" & rectX & "' , " & _
                            "rect_y = '" & rectY & "' , " & _
                            "PenPngLocation = '/images/" & penPngList(i) & "'" & _
                            "WHERE `Visit Number (VISIT)` = '" & visit & "' AND " & _
                            "`Page Number (PAGE)` = '" & myPage.Name & "' AND " & _
                            "`Variable Number (var)` = '" & myControl.Name & "'"

                            Dim insertQueryExe As New MySqlCommand(insertQuery, connToProject)
                            rdr = insertQueryExe.ExecuteReader()
                            rdr.Close()

                        End If

                    Next myControl
                    i += 1
                Next myPage
            End If
        Next

    Catch ex As Exception

    Dim nowDate As String
    nowDate = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss")

    Dim rdrError As MySqlDataReader

    'Connect to the patient using the information gathered from above
    Const connStrToProject As String = "server=localhost;user id=root; password=password; database=backend; pooling=false"
    Dim connToProject As New MySqlConnection(connStrToProject)
    connToProject.Open()

    Dim insertError As String = "INSERT INTO penerror (`Pen`, `Error`, `Study`, `ErrorDate`) VALUES ('" & penID & "', """ & ex.Message & """, '" & project & "', '" & nowDate & "')"
    Dim insertErrorExe As New MySqlCommand(insertError, connToProject)
    rdrError = insertErrorExe.ExecuteReader()
    rdrError.Close()

    End Try

同样,我正在尝试优化速度(显然,它应该仍然如上所述)。

感谢您的反馈!

1 个答案:

答案 0 :(得分:0)

如果您在循环中创建了一个查询而不是在循环之后执行它而不是单独执行每个查询,那将会有所帮助。也使用StringBuilder而不是String的连接(这在你的情况下不是那么大的问题,但是对于更长的字符串会更大)