为啥我的 TSQL SELECT 命令会吐出随机数据?

Posted

技术标签:

【中文标题】为啥我的 TSQL SELECT 命令会吐出随机数据?【英文标题】:Why does my TSQL SELECT command spit out random data?为什么我的 TSQL SELECT 命令会吐出随机数据? 【发布时间】:2021-06-18 09:45:37 【问题描述】:

我正在尝试为 ASP.NET 编写一个函数,该函数检查表中的现有 ID,并为我在其他地方使用的 INSERT 命令返回一个未使用的 ID。但是,当我在表中只有 3 个成员时,这个函数会吐出一个 61 个成员的随机数数组。

public int getId()
        
            List<int> list = new List<int>();
            string sql = @"select Id from dbo.Tasks";
            using (IDbConnection cnn = new SqlConnection(connString("db1")))
            
                foreach (int a in Convert.ToString(cnn.Query(sql)).ToList())
                
                    list.Add(a);
                
            

            for (int x = 0; x < 100; x++) if (!list.Contains(x)) return x;
            return 99;
        
Count = 61
83
121
115
116
101
109

//etc.

ToDo.Controllers.HomeController

但是,此列表甚至不包含表中的现有 ID,这会导致在创建新行时出现重复的主错误。

【问题讨论】:

为什么是 Convert.ToString? 您尝试将查询结果转换为字符串,但结果是IEnumerable,无法转换为字符串。您将得到的只是一个描述对象类型的字符串。然后你在上面调用了ToList,它已经将它转换成一个字符串 【参考方案1】:

首先,这是一种性能非常差的 ID 选择方法。我建议使用AUTO_INCREMENT(如果您使用的是 mysql)或IDENTITY,如果您使用的是 SQLServer。由于您已经用两者标记了您的问题,我不知道您使用的是哪一个。

话虽如此,关于你的问题:

string sql = @"select Id from dbo.Tasks order by Id"; // make sure you
                                                      // order by something
                                                      // to prevent random
                                                      // results
using (IDbConnection cnn = new SqlConnection(connString("db1")))

    list = cnn.Query<int>(sql).ToList();


return list.Any() ? list.Min() : 0;

【讨论】:

谢谢,这已经解决了!我还是 SQL 的新手(我正在使用 MySQL),所以我现在只是想了解一下这些概念,而不是真正担心执行速度。 很高兴它有帮助!享受学习过程! 忘掉速度,如果你是为了学习,也不要这样做

以上是关于为啥我的 TSQL SELECT 命令会吐出随机数据?的主要内容,如果未能解决你的问题,请参考以下文章

使用 Node/Express 解析 CSV 文件会吐出奇怪的 \x001 代码

为啥jQuery减法输出NaN?

为啥此代码会使 Visual Studio 2015 崩溃?

C中的维吉尼亚密码

Jenkins 流水线不扩展 Git 命令

没有GPU的Nvcc