SQL Server で SEQUENCE オブジェクトを試しており、シーケンス名を指定して C# で次の値を取得しています。範囲にはストアド プロシージャがあり、シーケンス名を渡すことができるため、範囲は単純です。
public static T Reserve<T>(string name, int count, SqlConnection sqlConn)
{
using (var sqlCmd = new SqlCommand("sp_sequence_get_range", sqlConn))
{
sqlCmd.CommandType = CommandType.StoredProcedure;
var firstValueParam = new SqlParameter("@range_first_value", SqlDbType.Variant) { Direction = ParameterDirection.Output };
sqlCmd.Parameters.AddWithValue("@sequence_name", name);
sqlCmd.Parameters.AddWithValue("@range_size", count);
sqlCmd.Parameters.Add(firstValueParam);
sqlCmd.ExecuteNonQuery();
return (T)firstValueParam.Value;
}
}
しかし、単一の値はどうでしょうか? 上記を「1」のカウントで呼び出すか、SQLを動的に構築できるように思えます。すなわち
var sqlCmdStr = string.Format("SELECT NEXT VALUE FOR {0}", name);
これは一般的に悪い習慣であることがわかっています(つまり、SQLインジェクション)。
誰が何を提案しますか?