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

标签 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;
        }
    }

但是单一值呢?在我看来,我可以用计数“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/

相关文章:

c# - 十进制转换在云端工作,但不适用于本地计算机

sql - 在 Oracle 中,是否可以通过 View 插入或更新记录?

mysql - 如何将两个表内连接到连接表

sql - 如何使用批量插入而不插入自动编号列?

c# - 通过 ESC/P 命令将位图写入 Epson TM88IV (Write To NVRam)

c# - 将对象添加到适当数据结构的设计

c# - DLL 引用之间的区别?和用途?

sql - 为只有文件服务器的多用户应用程序选择数据库 (windows)

sql - 使用 like 和 where 模式对列进行索引?

asp.net - 添加 Pooling=True 和 Integrated Security 会产生什么后果?