В духе Donnies ответа, я предоставил простой SQL пример того, как получить то, что вы после использования более защищаемого механизма чем динамически построенного SQL (как и другие посоветовали вам)
В простом случае вы должны создать хранимую процедуру для каждой операции создания, чтения, обновления, удаления, доступной для приложения, для каждого объекта в базе данных. (Это не 100% истинно в больших производственных системах, но это лучше, чем динамически созданный SQL, построенный в приложении)
Теперь для READ в этом списке перечислены все, если параметр не указан. Это упрощенная версия подхода, на котором архитектор базы данных на моей работе читал лекции - здесь мы не отделяем извлеченную хранимую процедуру от процедуры листинга, они фактически выполняют ту же операцию. Это будет выплачиваться в меньшем количестве SQL-кода для поддержки в долгосрочной перспективе.
CREATE PROCEDURE usp_ReadName
@name_id bigint=NULL
AS
BEGIN
SET NOCOUNT ON;
if (@name_id IS NULL)
SELECT name_id,name,description
from name with(nolock)
else
select name_id,name,description
from name with(nolock)
where name_id = @name_id
END
GO
Теперь для C# стороны. Для хранения результатов мы определяем объект передачи данных. Вообще говоря, это более легкий вес, чем данные, более быстрые и эффективные в использовании. Если скорость, большие объемы данных или ограниченная память не являются предметом озабоченности, просто используйте данные с данными.(В среднем вы будете экономить примерно 40% + память, и около 10% скорости - 100K записи структуры выше использования пиков памяти на 140MB с DataTable, а пики DTE на 78MB)
/// <summary>
/// A simple data transfer entity
/// </summary>
public struct name_data
{
public long name_id;
public string name;
public string description;
public name_data(long id, string n, string d)
{
name_id = id;
name = n;
description = d;
}
}
Теперь мы фиксируем результаты в C# с использованием синтаксиса с нулевым параметром. Этот код предполагает, что вы уже открыли соединение SQL
conn.Open();
using (SqlCommand cmd = new SqlCommand("usp_ReadName",conn))
{
cmd.CommandType = CommandType.StoredProcedure;
if (id.HasValue)
cmd.Parameters.Add("@name_id", SqlDbType.BigInt).Value = id.Value;
using (SqlDataReader reader = cmd.ExecuteReader())
{
if (reader.HasRows)
{
while (reader.Read())
{
dte.name_data item = new dte.name_data(
(long)reader["name_id"],
reader["name"].ToString(),
reader["description"].ToString());
items.Add(item);
}
}
}
}
Особая благодарность Адаму Робинсону за помощь в этом вопросе. –
Подходит для тщательного ответа, но в контексте вопроса я думаю, что он имел в виду «алгоритм бинарного поиска», а не «алгоритм поиска двоичных данных». –