Отображение данных сервера sql до 16 текстовых блоков

Всем доброго времени суток. У меня проблема с кодированием, у меня длинная строка кодов, чтобы показать 16 элементов с сервера sql до 16 текстовых блоков, ошибки нет, но я хочу сохранить короткую строку кодов. Вот 2 примера кодовых блоков (из 16):

            orgDa.SelectCommand = conn.CreateCommand();
            orgDa.SelectCommand.CommandText = "select OrganizationName from Organizationtbl where OrgID=1";
            orgDa.SelectCommand.CommandType = CommandType.Text;
            orgDa.Fill(ds, "Organizationtbl");

            deptDa.SelectCommand = conn.CreateCommand();
            deptDa.SelectCommand.CommandText = "select DepartmentName from Departmenttbl where DeptID=1";
            deptDa.SelectCommand.CommandType = CommandType.Text;
            deptDa.Fill(ds, "Departmenttbl");

            if (ds.Tables["Organizationtbl"].Rows.Count == 1)
            {
                foreach (DataRow orgItem in ds.Tables["Organizationtbl"].Rows)
                {
                    if (orgItem.IsNull("OrganizationName"))
                    {
                        foreach (DataRow deptItem in ds.Tables["Departmenttbl"].Rows)
                        {
                            textblock_EventTitle0.Text = deptItem["DepartmentName"].ToString();
                        }
                    }
                    else
                    {
                        textblock_EventTitle0.Text = orgItem["OrganizationName"].ToString();
                    }
                }
            }
            else
            {
                foreach (DataRow deptItem in ds.Tables["Departmenttbl"].Rows)
                {
                    if (deptItem.IsNull("DepartmentName"))
                    {
                        foreach (DataRow orgItem in ds.Tables["Organizationtbl"].Rows)
                        {
                            textblock_EventTitle0.Text = orgItem["OrganizationName"].ToString();
                        }
                    }
                    else
                    {
                        textblock_EventTitle0.Text = deptItem["DepartmentName"].ToString();
                    }
                }
            }

            orgDa.SelectCommand = conn.CreateCommand();
            orgDa.SelectCommand.CommandText = "select OrganizationName from Organizationtbl where OrgID=2";
            orgDa.SelectCommand.CommandType = CommandType.Text;
            orgDa.Fill(ds, "Organizationtbl");

            deptDa.SelectCommand = conn.CreateCommand();
            deptDa.SelectCommand.CommandText = "select DepartmentName from Departmenttbl where DeptID=2";
            deptDa.SelectCommand.CommandType = CommandType.Text;
            deptDa.Fill(ds, "Departmenttbl");

            if (ds.Tables["Organizationtbl"].Rows.Count == 1)
            {
                foreach (DataRow orgItem in ds.Tables["Organizationtbl"].Rows)
                {
                    if (orgItem.IsNull("OrganizationName"))
                    {
                        foreach (DataRow deptItem in ds.Tables["Departmenttbl"].Rows)
                        {
                            textblock_EventTitle1.Text = deptItem["DepartmentName"].ToString();
                        }
                    }
                    else
                    {
                        textblock_EventTitle1.Text = orgItem["OrganizationName"].ToString();
                    }
                }
            }
            else
            {
                foreach (DataRow deptItem in ds.Tables["Departmenttbl"].Rows)
                {
                    if (deptItem.IsNull("DepartmentName"))
                    {
                        foreach (DataRow orgItem in ds.Tables["Organizationtbl"].Rows)
                        {
                            textblock_EventTitle1.Text = orgItem["OrganizationName"].ToString();
                        }
                    }
                    else
                    {
                        textblock_EventTitle1.Text = deptItem["DepartmentName"].ToString();
                    }
                }
            }

Как я могу показать 16 элементов от sql до 16 текстовых блоков всего за один цикл? Мне нужна ваша помощь. Заранее спасибо.

1 ответ

Решение

Как правило, если у вас есть код, который повторяется, попробуйте сделать следующее:

  1. Возьмите код для одного элемента, переместите его в функцию.

  2. Найдите все, что отличается для каждого элемента: например, запросы, имена таблиц, имена столбцов, элементы управления и т. Д. Добавьте параметр в метод для каждого из них и замените каждое вхождение в коде параметром.

  3. Вызовите метод один раз для каждого элемента, передав правильные параметры.

Это в основном двухэтапный рефакторинг: во-первых, метод извлечения. Во-вторых, извлечь параметр.

Однако в вашем случае, в основном, меняются OrgId и DeptID (и элемент управления для присвоения значения), поэтому читайте о параметризованных запросах, например, http://www.csharp-station.com/Tutorials/AdoDotNet/Lesson06.aspx

Ваш извлеченный метод может выглядеть следующим образом (не проверено и не скомпилировано):

    void LoadStuff(int id, TextBox control){
            orgDa.SelectCommand = conn.CreateCommand();
            orgDa.SelectCommand.CommandText = "select OrganizationName from Organizationtbl where OrgID=@orgId";
            orgDa.SelectCommand.CommandType = CommandType.Text;
            var parameter = orgDa.SelectCommand.CreateParameter();
            parameter.ParameterName = "@orgId";
            parameter.Value = id;
            orgDa.SelectCommand.AddParameter(parameter);
            orgDa.Fill(ds, "Organizationtbl");

            deptDa.SelectCommand = conn.CreateCommand();
            deptDa.SelectCommand.CommandText = "select DepartmentName from Departmenttbl where DeptID=@deptID";
            deptDa.SelectCommand.CommandType = CommandType.Text;
            parameter = orgDa.SelectCommand.CreateParameter();
            parameter.ParameterName = "@deptID";
            parameter.Value = id;
            orgDa.SelectCommand.AddParameter(parameter);
            deptDa.Fill(ds, "Departmenttbl");

            if (ds.Tables["Organizationtbl"].Rows.Count == 1)
            {
                foreach (DataRow orgItem in ds.Tables["Organizationtbl"].Rows)
                {
                    if (orgItem.IsNull("OrganizationName"))
                    {
                        foreach (DataRow deptItem in ds.Tables["Departmenttbl"].Rows)
                        {
                            control.Text = deptItem["DepartmentName"].ToString();
                        }
                    }
                    else
                    {
                        control.Text = orgItem["OrganizationName"].ToString();
                    }
                }
            }
            else
            {
                foreach (DataRow deptItem in ds.Tables["Departmenttbl"].Rows)
                {
                    if (deptItem.IsNull("DepartmentName"))
                    {
                        foreach (DataRow orgItem in ds.Tables["Organizationtbl"].Rows)
                        {
                            control.Text = orgItem["OrganizationName"].ToString();
                        }
                    }
                    else
                    {
                        control.Text = deptItem["DepartmentName"].ToString();
                    }
                }
            }
    }

А затем позвоните с помощью:

LoadStuff(1, textblock_EventTitle0);
LoadStuff(2, textblock_EventTitle1);
LoadStuff(3, textblock_EventTitle2);
....

или с какой-то более умной петлей.

Конечно, это можно упростить еще больше. Кажется, что есть много общего в двух ветвях конструкции if-else.

Другие вопросы по тегам