为啥我的 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 代码