Donnies answer の精神で、動的に構築された 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% の速度を節約できます。DTE は 78MB でピークに達しますが、データテーブルでは 140MB でピークメモリ使用量を超える構造の 100K レコード)
/// <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;
}
}
ここで、null 許容パラメーター構文を使用して 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);
}
}
}
}