我正在 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 注入(inject))。
有人会建议什么?
最佳答案
Which I know to generally be bad practice (i.e. SQL injection).
并非每个动态 SQL 都是邪恶的。
您是否对 SQL 注入(inject)持开放态度取决于值(插入到 SQL 文本中)的来源。如果它来自您的代码严格控制的地方(例如,从一组字符串常量中选择的 switch
语句),则 SQL 注入(inject)不是问题。
或者,您可以简单地对每个序列进行单独的查询(假设您没有很多序列)。
关于c# - 从 .NET 安全地获取下一个 SQL Server 序列值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14220667/