Отображение данных сервера 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 ответ
Как правило, если у вас есть код, который повторяется, попробуйте сделать следующее:
Возьмите код для одного элемента, переместите его в функцию.
Найдите все, что отличается для каждого элемента: например, запросы, имена таблиц, имена столбцов, элементы управления и т. Д. Добавьте параметр в метод для каждого из них и замените каждое вхождение в коде параметром.
Вызовите метод один раз для каждого элемента, передав правильные параметры.
Это в основном двухэтапный рефакторинг: во-первых, метод извлечения. Во-вторых, извлечь параметр.
Однако в вашем случае, в основном, меняются 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.