[Отказ от ответственности]: В настоящее время мы работаем с более старой версией SQL Server 2000, но мы можем обновить ее до SQL Server 2008 в течение следующих 6 месяцев или около того.
В нашей производственной среде у меня есть очень длинный фрагмент кода C #, чтобы определить следующее:
Какой сотрудник "владеет" продуктом (определяется как первый сотрудник, который над ним работает),
Что это за возможный продукт Test_Result
на станции Проверка давления , и
То, что первый продукт этого Test_Result
находится на Вакуумный тест станции.
Все значения Test_Result
(хранящиеся в строковых значениях) содержатся в плоской файловой таблице, созданной на основе более старой электронной таблицы Microsoft Excel. Структура базы данных не может быть легко изменена, поскольку машины компании и машины поставщиков записывают в них данные.
Раз в месяц или около того, руководство запускает отчет, чтобы отобразить, сколько продуктов принадлежит каждому сотруднику, если первый тест давления прошел успешно, и если возможно Вакуумный тест прошел успешно.
В настоящее время моя техника для этого заключается в SQL
звонках с C#
код:
SELECT DISTINCT Serial_Number WHERE Date_Time BETWEEN @Date1 AND @Date2
В течение месяца мы могли регистрировать в любом месте от 1500 до 3500 различных продуктов Serial_Number
значений.
Для каждого Serial_Number
я создаю экземпляр пользовательского класса Product
, который содержит PressureEmployee
и VacuumEmployee
, оба инициализированы в NULL
.
- Теперь для каждого из этих
Product
экземпляров я выбираю все данные и порядок в поле Date_Time
, чтобы определить, какой сотрудник выполнил сначала тестовые действия с продуктом.
SQL для этого похож на следующий квази-код:
string sqlText = "SELECT Date_Time, Employee, System_ID, Test_Result " +
"FROM Production " +
"WHERE Serial_Number=@SN ORDER BY Date_Time";
using (SqlCommand cmd = new SqlCommand(sqlText, new SqlConnection(connStr))) {
cmd.Parameters.Add("@SN", SqlDbType.NVarChar, 20);
cmd.Connection.Open();
foreach (var item in productList) {
cmd.Parameters["@SN"].Value = item;
SqlDataReader r = cmd.ExecuteReader();
while (r.Read()) {
string systemId = r["System_ID"].ToString();
string testResult = r["Test_Result"].ToString();
if (-1 < systemId.IndexOf("pressure")) {
if (String.IsNullOrEmpty(item.PressureEmployee)) {
item.PressureEmployee = r["Employee"].ToString();
}
// check that product ever passes
if (-1 < testResult.IndexOf("pass")) {
item.VacuumPass = true;
}
}
if ((-1 < systemId.IndexOf("vacuum")) &&
String.IsNullOrEmpty(item.VacuumEmployee)) {
item.VacuumEmployee = r["Employee"].ToString();
// product passes 1st time
item.VacuumPass = (-1 < testResult.IndexOf("pass"));
}
}
}
}
На самом деле это намного больше, но оно должно дать общее представление.
Что я хотел бы сделать, это создать представление, которое может находиться на Сервере, которое просто содержит список каждого Serial_Number
, результата Pressure_Test
, даты Pressure_Test
, результата Vacuum_Test
и Vacuum_Test
дата.
Если мое мышление будет правильным, это приведет к меньшему количеству работы на сервере, потому что он будет поддерживать это представление всегда. Кроме того, представление должно выполняться намного быстрее ... верно?
Итак, как бы я написал такой взгляд?
Если это не быстрее, есть ли способ получить статус запроса во время его выполнения? Отображение Cursor = Cursors.WaitCursor
в течение 40 минут не вселяет большую уверенность в моем приложении.