问题描述
如果数据库中不存在它要查找的内容,我希望代码执行某些操作。这就是我目前正在使用的:
const string cs = @"Data Source= ..\..\..\database.sqlite3";
await using var con = new sqliteConnection(cs);
con.open();
await using var cmd = new sqliteCommand(con);
member ??= ctx.Member;
cmd.CommandText = @"SELECT iq FROM users WHERE id = $user_id";
cmd.Parameters.AddWithValue("$user_id",member.Id);
var r = cmd.ExecuteReader();
while (r.Read())
{
if (r["iq"] == null)
{
var random = new Random();
var iq = random.Next(1,200);
await cmd.disposeAsync();
cmd.CommandText = "INSERT INTO users(id,iq) VALUES($member_id,$id)";
cmd.Parameters.AddWithValue("$iq",iq);
cmd.Parameters.AddWithValue("$member_id",member.Id);
cmd.ExecuteNonQuery();
var embed = new discordEmbedBuilder
{
Title = $"IQ of {member.Username} is {iq} :brain:",Color = discordColor.Cyan
};
await ctx.Channel.SendMessageAsync(embed);
}
else
{
var iqFinal = r["iq"];
var embed = new discordEmbedBuilder
{
Title = $"IQ of {member.Username} is {iqFinal} :brain:",Color = discordColor.Cyan
};
await ctx.Channel.SendMessageAsync(embed);
}
}
我真的不知道如何做到这一点,我尝试了 try catch
块,但它们似乎也不起作用。我该怎么做?
解决方法
我假设 id
是表的主键,因此您不希望语句中超过 1 行:
SELECT iq FROM users WHERE id = $user_id
这个语句的问题在于,如果表中不存在 $user_id
,它可能不会返回任何行,因此在这种情况下,r.Read()
将返回 false
和其中的代码while
循环永远不会被执行。
做你想做的一种方法是使用聚合:
SELECT MAX(iq) AS iq FROM users WHERE id = $user_id
总是返回一行:带有 iq
的行,其中 id = $user_id
或 null
如果 $user_id
在表中不存在。
>
您还应该将 while
循环更改为:
if (r.Read()) {
.....................
}
或者更好:
r.Read();
因为聚合查询保证将准确返回 1 行。