我这里有一个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
同样,我正在尝试优化速度(显然,它应该仍然如上所述)。
感谢您的反馈!
答案 0 :(得分:0)
如果您在循环中创建了一个查询而不是在循环之后执行它而不是单独执行每个查询,那将会有所帮助。也使用StringBuilder而不是String的连接(这在你的情况下不是那么大的问题,但是对于更长的字符串会更大)