从.NET安全地获取下一个SQL Server序列值

Bar*_*ast 3 c# sql sql-server sequence sql-server-2012

我正在试验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;
        }
    }
Run Code Online (Sandbox Code Playgroud)

但单值呢?在我看来,我可以调用上面的计数'1',或者我可以动态地构造SQL.即

var sqlCmdStr = string.Format("SELECT NEXT VALUE FOR {0}", name);
Run Code Online (Sandbox Code Playgroud)

我知道通常是不好的做法(即SQL注入).

有人会建议什么?

Bra*_*vic 5

我知道通常是不好的做法(即SQL注入).

并非每个动态SQL都是邪恶的.

是否对SQL注入开放取决于值(在SQL文本中插入)的来源.如果它来自严密控制代码的地方(例如switch,从一组字符串常量中选择的语句),则SQL注入不是问题.

或者,您可以简单地为每个序列分别设置一个查询(假设您没有很多序列).

  • 不仅仅是插入文本的来源,还有类型.如果插入的文本来自int,那么应该没有注入的风险. (2认同)