2016-12-31 3 views
0

У меня есть кое-что, что я хочу знать, я надеюсь, что каждый может мне помочь. Итак, вот мой вопрос, как я могу сократить этот код. :)Сократите мое заявление ElseIf. Как?

If MetroTextBox1.Text = "" Then 
      If MetroCheckBox1.Checked = True And MetroCheckBox2.Checked = False Then 
       query = "select id, fname, mname, lname, dept, salary, ' ' as lengthservice from tbl_Employee where dresigned is null and " + 
         " (id like '%" & MetroTextBox1.Text & "%' or fname like '%" & MetroTextBox1.Text & "%' or mname like '%" & MetroTextBox1.Text & "%' or lname like '%" & MetroTextBox1.Text & "%' or dept like '%" & MetroTextBox1.Text & "%') " 
       dt = c.GetDataTable(query) 
      ElseIf MetroCheckBox2.Checked = True And MetroCheckBox1.Checked = False Then 
       query = "select id, fname, mname, lname, dept, salary, ' ' as lengthservice from tbl_Employee where dresigned is not null and " + 
         " (id like '%" & MetroTextBox1.Text & "%' or fname like '%" & MetroTextBox1.Text & "%' or mname like '%" & MetroTextBox1.Text & "%' or lname like '%" & MetroTextBox1.Text & "%' or dept like '%" & MetroTextBox1.Text & "%') " 
       dt = c.GetDataTable(query) 
      ElseIf MetroCheckBox1.Checked = True And MetroCheckBox2.Checked = True Then 
       query = "select id, fname, mname, lname, dept, salary from tbl_Employee" + 
         " where id like '%" & MetroTextBox1.Text & "%' or fname like '%" & MetroTextBox1.Text & "%' or mname like '%" & MetroTextBox1.Text & "%' or lname like '%" & MetroTextBox1.Text & "%' or dept like '%" & MetroTextBox1.Text & "%' " 
       dt = c.GetDataTable(query) 
      End If 
     ElseIf MetroTextBox1.Text <> "" Then 
      If MetroCheckBox1.Checked = True And MetroCheckBox2.Checked = False Then 
       query = "select id, fname, mname, lname, dept, salary, ' ' as lengthservice from tbl_Employee where dresigned is null and " + 
         " (id like '%" & MetroTextBox1.Text & "%' or fname like '%" & MetroTextBox1.Text & "%' or mname like '%" & MetroTextBox1.Text & "%' or lname like '%" & MetroTextBox1.Text & "%' or dept like '%" & MetroTextBox1.Text & "%') " 
       dt = c.GetDataTable(query) 
      ElseIf MetroCheckBox2.Checked = True And MetroCheckBox1.Checked = False Then 
       query = "select id, fname, mname, lname, dept, salary, ' ' as lengthservice from tbl_Employee where dresigned is not null and " + 
         " (id like '%" & MetroTextBox1.Text & "%' or fname like '%" & MetroTextBox1.Text & "%' or mname like '%" & MetroTextBox1.Text & "%' or lname like '%" & MetroTextBox1.Text & "%' or dept like '%" & MetroTextBox1.Text & "%') " 
       dt = c.GetDataTable(query) 
      ElseIf MetroCheckBox1.Checked = True And MetroCheckBox2.Checked = True Then 
       query = "select id, fname, mname, lname, dept, salary from tbl_Employee" + 
         " where id like '%" & MetroTextBox1.Text & "%' or fname like '%" & MetroTextBox1.Text & "%' or mname like '%" & MetroTextBox1.Text & "%' or lname like '%" & MetroTextBox1.Text & "%' or dept like '%" & MetroTextBox1.Text & "%' " 
       dt = c.GetDataTable(query) 
      End If 
     Else 
      query = "select id, fname, mname, lname, dept, salary, ' ' as lengthservice from tbl_Employee where id = ''" 
      dt = c.GetDataTable(query) 
     End If 
+0

ваш код кажется грязным! я видел в первом 'if', у вас есть:« Если MetroTextBox1.Text = »« Then », но позже в соответствующем блоке кода вы используете его значение:« Если MetroCheckBox1.Checked = True и MetroCheckBox2.Checked = False Then query = "выберите идентификатор, имя_файла, ..." + \t \t \t \t \t \t "(идентификатор, как«%" & ** MetroTextBox1.Text ** & ...', которые не доза кажется правильным! –

+0

Что такое ' c' в вашем коде выше? Я пытался написать параметризованную версию, чтобы избежать уязвимости для SQL-инъекции, вызванной передачей «MetroTextBox1.Text» без какой-либо проверки – LogicalFlaps

+0

Вы должны использовать 'AndAlso' /' OrElse' вместо 'And '/' Or'. [Почему?] (Http://stackoverflow.com/q/302047/4934172). –

ответ

0

Поскольку речь идет о сокращении кода, вот как:

query = " (id like '%" & MetroTextBox1.Text & "%' or fname like '%" & MetroTextBox1.Text & "%' or mname like '%" & MetroTextBox1.Text & "%' or lname like '%" & MetroTextBox1.Text & "%' or dept like '%" & MetroTextBox1.Text & "%')" 
If MetroTextBox1.Text = "" Then 
    If MetroCheckBox1.Checked = True And MetroCheckBox2.Checked = False Then 
     query = "select id, fname, mname, lname, dept, salary, ' ' as lengthservice from tbl_Employee where dresigned is null and" + query 
    ElseIf MetroCheckBox2.Checked = True And MetroCheckBox1.Checked = False Then 
     query = "select id, fname, mname, lname, dept, salary, ' ' as lengthservice from tbl_Employee where dresigned is not null and" + query 
    ElseIf MetroCheckBox1.Checked = True And MetroCheckBox2.Checked = True Then 
     query = "select id, fname, mname, lname, dept, salary from tbl_Employee where" + query 
    End If 
ElseIf MetroTextBox1.Text <> "" Then 
    If MetroCheckBox1.Checked = True And MetroCheckBox2.Checked = False Then 
     query = "select id, fname, mname, lname, dept, salary, ' ' as lengthservice from tbl_Employee where dresigned is null and" + query 
    ElseIf MetroCheckBox2.Checked = True And MetroCheckBox1.Checked = False Then 
     query = "select id, fname, mname, lname, dept, salary, ' ' as lengthservice from tbl_Employee where dresigned is not null and" + query 
    ElseIf MetroCheckBox1.Checked = True And MetroCheckBox2.Checked = True Then 
     query = "select id, fname, mname, lname, dept, salary from tbl_Employee where" + query 
    End If 
Else 
    query = "select id, fname, mname, lname, dept, salary, ' ' as lengthservice from tbl_Employee where id = ''" 
End If 
dt = c.GetDataTable(query) 
0

Это лучше (и короче) код:

Dim t1 As String = MetroTextBox1.Text 
Dim c1 As Boolean = MetroCheckBox1.Checked 
Dim c2 As Boolean = MetroCheckBox2.Checked 

Dim a, b As String 
a = "select id, fname, mname, lname, dept, salary" 
b = "(id like '%" & t1 & "%' or fname like '%" & t1 & "%' or mname like '%" & t1 & "%' or lname like '%" & t1 & "%' or dept like '%" & t1 & "%') " 

If c1 And Not c2 Then 
    query = a + ", ' ' as lengthservice from tbl_Employee where dresigned is null and " + b 

ElseIf c2 And Not c1 Then 
    query = a + ", ' ' as lengthservice from tbl_Employee where dresigned is not null and " + b 

Else 'If c1 And c2 Then 
    query = a + " from tbl_Employee where " + b 

End If 

dt = c.GetDataTable(query) 

(очевидно, что final Else никогда не вызывается, потому что всегда один из MetroTextBox1.Text = "" или MetroTextBox1.Text <> "" будет правдой).

Но здесь есть примечание. Когда MetroTextBox1.Text = "", условие, указанное в b, становится (id like '%%' or fname like '%%' or ...), что-то вроде where 1=1, которое можно удалить из запроса. но он не основан на вашем исходном коде. если вы хотите, я мог бы дать измененный код

0

Поскольку речь идет о сокращении кода, здесь короткое решение без If заявления

Dim query As String = 
    "SELECT id, fname, mname, lname, dept, salary, ' ' AS lengthservice 
    FROM tbl_Employee 
    WHERE (id LIKE @MetroTextBox1 
     OR fname LIKE '%" & MetroTextBox1.Text & "%' 
     OR mname LIKE '%" & MetroTextBox1.Text & "%' 
     OR lname LIKE '%" & MetroTextBox1.Text & "%' 
     OR dept LIKE '%" & MetroTextBox1.Text & "%')" 

Dim condition As New Dictionary(Of Byte, String) From 
{ 
    {0, ""}, 'You don't have result for case False, False 
    {1, " AND dresigned IS NULL"}, 'If MetroCheckBox1.Checked = True 
    {2, " AND dresigned IS NOT NULL"}, 'If MetroCheckBox2.Checked = True 
    {3, ""} 'Both Checkboxes are checked 
} 

Dim checkBox1 As Byte = Convert.ToByte(MetroCheckBox1) 
Dim checkBox2 As Byte = Convert.ToByte(MetroCheckBox2) << 1 
Dim selection As Byte = checkBox1 Or checkBox2 

query = query & condition(selection) 

dt = c.GetDataTable(query) 

И очень важно: Используйте SqlParameters для передачи значений в запросе

Параметры избавят вас от проблем с инъекциями Sql, а также заставят ваши запросы работать быстрее.