機械室の再構築——テンプレート方法モード+単例モード+ストレージプロセス最適化組合せクエリー

15452 ワード

コンビネーションクエリーという機能の実現は、VBの中ですでに体験されています.その中には大量の重複コードがあり、システムの性能に大きく影響しています.このブログでは、オブジェクト向けのVB.NET版コンビネーションクエリーを紹介します.その中で、テンプレートメソッドモードと組み合わせてコンビネーションクエリーを最適化しました.テンプレートメソッドモードとは何ですか.その切り札は何ですか.なぜコード多重化を実現できるのか、私たちはどのようにして私たちの望む結果を達成することができますか?答えを予知し、素晴らしい内容は以下の通りです.
テンプレートのメソッドパターンについては、ブログを参照してください.http://blog.csdn.net/hongwei15732623364/article/details/50659283
組合せクエリーの実装手順:
一、準備作業:
(1)親フォームの作成:
 
(2)継承フォームの作成:
 
二、ストレージプロセスの作成:
ALTER PROCEDURE [dbo].[PROC_Studentservice] 
	@Comboa1 varchar(50),
	@Comboa2 varchar(50),
	@Comboa3 varchar(50),
	@Combob1 varchar(50),	
	@Combob2 varchar(50),
	@Combob3 varchar(50),
	@Combod1 varchar(50),
	@Combod2 varchar(50),
	@txtc1 varchar(50),	
	@txtc2 varchar(50),	
	@txtc3 varchar(50),
	@listName varchar(20)
	
AS
	declare @strSQL varchar(500)
BEGIN
	set @strSQL='select * from '+@listName+' where '+@Comboa1+@Combob1+char(39)+@txtc1+char(39)
	if(@Combod1<>'')
	begin
	set @strSQL =@strSQL+@Combod1+CHAR(32)+@Comboa2+@Combob2+CHAR(39)+@txtc2+CHAR(39)
		if (@Combod2<>'')
		begin
		set @strSQL=@strSQL +@Combod2+CHAR(32)+@Comboa3+@Combob3+CHAR(39)+@txtc3+CHAR(39)
		end		
	end
	execute(@strSQL)
END

ストレージプロセスは長い間悩んでいましたが、SQL文にはスペースが1つ少なく書かれていて、最後の結果は「テーブル0が見つかりません」、char()、括弧の数値表示がASCコードに対応していることも分かりました.今回のストレージプロセスの使用により、より深く理解できましたが、時には間違えることもありますが、大丈夫です.やってみて、いつも分かります.
三、実装コード部分:
親フォームコード:
(1)まずフォームがロードされた後、Comboxコントロールで必要なクエリーフィールドを自動的にロードする必要があります.
<span style="font-size:18px;"><span style="font-size:18px;">    Private Sub UGroupQuery_Load(sender As Object, e As EventArgs) Handles MyBase.Load
        '        ,   
        '        , “”,      
        e_group.comboa1 = ""
        e_group.comboa2 = ""
        e_group.comboa3 = ""
        '   
        Combob1.Items.Add(">")
        Combob1.Items.Add("<")
        Combob1.Items.Add("=")
        Combob1.Items.Add("<>")
        Combob2.Items.Add(">")
        Combob2.Items.Add("<")
        Combob2.Items.Add("=")
        Combob2.Items.Add("<>")
        Combob3.Items.Add(">")
        Combob3.Items.Add("<")
        Combob3.Items.Add("=")
        Combob3.Items.Add("<>")
        '    
        Combod1.Items.Add(" ")
        Combod1.Items.Add(" ")
        Combod2.Items.Add(" ")
        Combod2.Items.Add(" ")

        '     ,          
        Comboa2.Enabled = False
        Comboa3.Enabled = False
        Combob2.Enabled = False
        Combob3.Enabled = False
        Combod2.Enabled = False
        txtc2.Enabled = False
        txtc3.Enabled = False

        '           
        dgv.SelectionMode = DataGridViewSelectionMode.FullRowSelect
        Dim i As Integer
        For i = 0 To dgv.Columns.Count - 1
            dgv.Columns(i).Width = DataGridViewAutoSizeColumnMode.AllCells
        Next
    End Sub</span></span>

(2)フォームのClickイベント:
<span style="font-size:18px;"><span style="font-size:18px;">    Protected e_group As New Entity.GroupEntity
   
    ''' <summary>
    '''   ,Click  
    ''' </summary>
    ''' <param name="sender"></param>
    ''' <param name="e"></param>
    ''' <remarks></remarks>
    ''' 
    Private Sub btnCheck_Click(sender As Object, e As EventArgs) Handles btnCheck.Click
        dgv.DataSource = Nothing        '      ,    
        '          
        If Combod1.Text = "" Then
            If Comboa1.Text = "" Or Combob1.Text = "" Or txtc1.Text = "" Then
                MsgBox("          ")
            End If
        End If
        '           ,             
        If Combod1.Text <> "" Then
            If Comboa2.Text = "" Or Combob2.Text = "" Or txtc2.Text = "" Then
                MsgBox("          ")
            End If
        End If
        '           ,            
        If Combod2.Text <> "" Then
            If Comboa3.Text = "" Or Combob3.Text = "" Or txtc3.Text = "" Then
                MsgBox("        ")
            End If
        End If

        '       
        e_group.Listname = GetdbName()
        e_group.comboa1 = ToEnglish(Comboa1.Text)
        e_group.comboa2 = ToEnglish(Comboa2.Text)
        e_group.comboa3 = ToEnglish(Comboa3.Text)

        e_group.combob1 = Combob1.Text.Trim
        e_group.combob2 = Combob2.Text.Trim
        e_group.combob3 = Combob3.Text.Trim

        e_group.txtc1 = txtc1.Text.Trim
        e_group.txtc2 = txtc2.Text.Trim
        e_group.txtc3 = txtc3.Text.Trim
        '      
        e_group.combod1 = ToEnglish(Combod1.Text)
        e_group.combod2 = ToEnglish(Combod2.Text)

        Dim dt As New DataTable
        Dim ugroup As New Facade.GroupFacade '      
        dt = ugroup.Grouplist1(e_group)
        If dt Is Nothing Then
            MsgBox("        ")
        Else
            Call Todgv()
        End If
    End Sub</span></span>

(3)テンプレートメソッドパターンを書き出すダミーメソッド:
<span style="font-size:18px;"><span style="font-size:18px;">    ''' <summary>
    '''     ,     ToEnglish,            
    ''' </summary>
    ''' <param name="turnName"></param>
    ''' <returns></returns>
    ''' <remarks></remarks>
    Public Overridable Function ToEnglish(turnName As String) As String
        Return ""
    End Function
</span></span>
<span style="font-size:18px;"><span style="font-size:18px;">    ''' <summary>
    '''        
    ''' </summary>
    ''' <returns></returns>
    ''' <remarks></remarks>
    Public Overridable Function GetdbName() As String
        Return ""
    End Function
</span></span>
<span style="font-size:18px;"><span style="font-size:18px;">    ''' <summary>
    '''      Datagridview 
    ''' </summary>
    ''' <remarks></remarks>
    Protected Overridable Sub Todgv()

    End Sub</span></span>

(4)コントロールの可用性の最適化:
<span style="font-size:18px;"><span style="font-size:18px;">''' <summary>
    '''           ,       
    ''' </summary>
    ''' <param name="sender"></param>
    ''' <param name="e"></param>
    ''' <remarks></remarks>
    Private Sub Combod1_SelectedIndexChanged(sender As Object, e As EventArgs) Handles Combod1.SelectedIndexChanged
        If Combod1.Text = "" Then
            Comboa2.Enabled = False
            Comboa3.Enabled = False
            Combob2.Enabled = False
            Combob3.Enabled = False
            Combod2.Enabled = False
            txtc2.Enabled = False
            txtc3.Enabled = False
        Else
            Comboa2.Enabled = True
            Combob2.Enabled = True
            Combod2.Enabled = True
            txtc2.Enabled = True
        End If
    End Sub
    ''' <summary>
    '''           ,       
    ''' </summary>
    ''' <param name="sender"></param>
    ''' <param name="e"></param>
    ''' <remarks></remarks>
    Private Sub Combod2_SelectedIndexChanged(sender As Object, e As EventArgs) Handles Combod2.SelectedIndexChanged
        If Combod2.Text = "" Then
            Comboa3.Enabled = False
            Combob3.Enabled = False
            txtc3.Enabled = False
        Else
            Comboa3.Enabled = True
            Combob3.Enabled = True
            txtc3.Enabled = True
        End If
    End Sub
End Class</span></span>

サブフォーム(UStudentservice):
(1)単例モードを追加する:
<span style="font-size:18px;"><span style="font-size:18px;">    Private Shared Student As UStudentservice '        ,  C# static
    Private Sub New()   '      ,        New   
        '            。
        InitializeComponent()

        '   InitializeComponent()            。
    End Sub
    '                        
    Public Shared Function GetInstance() As UStudentservice
        If Student Is Nothing OrElse Student.IsDisposed Then '             ,             nothing,     dispose 
            Student = New UStudentservice
            Student.MdiParent = frmMain.ActiveForm
        End If
        Return Student          '       ,       
    End Function</span></span>

メインフォームfrmMainでの実装に注意:
<span style="font-size:18px;"><span style="font-size:18px;">    ''' <summary>
    '''             
    ''' </summary>
    ''' <param name="sender"></param>
    ''' <param name="e"></param>
    ''' <remarks></remarks>
    Private Sub         ToolStripMenuItem_Click(sender As Object, e As EventArgs) Handles         ToolStripMenuItem.Click
        UStudentservice.GetInstance.Show()
    End Sub</span></span>

(2)ハッシュテーブルを用いてコントロールをロードするItemを完璧に実現し,1つ1つ書く悩みを省く.
<span style="font-size:18px;"><span style="font-size:18px;">    ''' <summary>
    '''   Combo item
    ''' </summary>
    ''' <param name="sender"></param>
    ''' <param name="e"></param>
    ''' <remarks></remarks>
    Private Sub UStudentservice_Load(sender As Object, e As EventArgs) Handles MyBase.Load
        Dim turnField As New Hashtable  '          hashtable
        Dim FieldName() As String
        Dim FieldValue() As String      '               
        '        
        FieldName = {"  ", "  ", "  ", "  ", "  ", "  ", "  ", "   "}
        FieldValue = {"Cardno", "Studentname", "Studentno", "Sex", "Department", "Grade", "Onclass", "Holder"}

        '  Field   
        Comboa1.Items.AddRange(FieldName)
        Comboa2.Items.AddRange(FieldName)
        Comboa3.Items.AddRange(FieldName)
        Comboa1.Items.Add("  ")
        'value   hashtable
        For i As Integer = 0 To FieldName.Count - 1
            turnField.Add(FieldName(i), FieldValue(i))
        Next

    End Sub</span></span>

(3)データベース識別可能な名前に変換:
<span style="font-size:18px;"><span style="font-size:18px;">    ''' <summary>
    '''               
    ''' </summary>
    ''' <param name="turnName"></param>
    ''' <returns></returns>
    ''' <remarks></remarks>
    Public Overrides Function ToEnglish(turnName As String) As String
        'Return MyBase.ToEnglish(comboa)
        Select Case turnName
            Case "  "
                Return "Cardno"
            Case "  "
                Return "Studentname"
            Case "  "
                Return "Studentno"
            Case "  "
                Return "Sex"
            Case "  "
                Return "Department"
            Case "  "
                Return "Grade"
            Case "  "
                Return "Onclass"
            Case "   "
                Return "Holder"
            Case " "
                Return "and"
            Case " "
                Return "or"
            Case Else
                Return ""
        End Select
    End Function</span></span>

(4)具体的な書き換え方法:
<span style="font-size:18px;"><span style="font-size:18px;">    ''' <summary>
    '''        ,      
    ''' </summary>
    ''' <returns></returns>
    ''' <remarks></remarks>
    Public Overrides Function GetdbName() As String
        Return "T_Student"
    End Function
</span></span>
<span style="font-size:18px;"><span style="font-size:18px;">    Protected Overrides Sub Todgv()
        dgv.DataSource = Nothing

        Dim UGroupQuery As New UGroupQuery '       
        Dim ugroup As New Facade.GroupFacade
        Dim table As DataTable

        Try
            table = ugroup.Grouplist1(e_group)
            If table.Rows.Count = 0 Then
                table.Clear()
                dgv.DataSource = Nothing
                dgv.Refresh()
                MsgBox("       ")
            Else
                'dgv.DataSource = Nothing
                dgv.DataSource = table
                dgv.Columns(0).HeaderText = "  "
                dgv.Columns(1).HeaderText = "  "
                dgv.Columns(2).HeaderText = "  "
                dgv.Columns(3).HeaderText = "  "
                dgv.Columns(4).HeaderText = "  "
                dgv.Columns(5).HeaderText = "  "
                dgv.Columns(6).HeaderText = "  "
                dgv.Columns(7).HeaderText = "   "

                '       
                dgv.AllowUserToAddRows = False

            End If
        Catch ex As Exception
            MessageBox.Show(ex.Message.ToString, "  ")
        End Try
        
    End Sub</span></span>

四、感想をまとめる:
組み合わせて全体の構想を検索してVB版の機械室の料金徴収システムとほとんど同じで、異なっているのは今回私が設計モードに参加して、完璧にコードの多重化を実現して、この2回機械室の料金徴収システムをして、最も深い感じのは構想がすでに簡単に見つけることができて、具体的なモードの使用はまだ多くのトレーニングが必要で、今回の組み合わせの検索の最適化のハイライトは:
1.単例モードでマルチフォーム表示の問題を簡単に解決し、ユーザーに極めて便利をもたらす.
2.テンプレートメソッドモードを使用して同じ部分をカプセル化し、コード多重化を完璧に実現し、システムの性能を増加し、オブジェクト向けを実現する.
3.ストレージプロセスはシステムの性能を高め、システムのデータベースへのアクセスを簡単にする.
4.ハッシュ表はコントロールのItemの追加を実現し、コード量を減らし、入力エラーを減らし、作業効率を高める.
コンビネーションクエリは複雑に見えますが、バスを見つけて、ゆっくりと考えを明らかにすれば、問題ではありません.だから、コードを書く前に最も重要な過程は考えることです.
 
貴重な時間をありがとうございます.通りかかった大牛の指摘を歓迎します.