如何解决C# SQLite3 选择是否为空
如果数据库中不存在它要查找的内容,我希望代码执行某些操作。这就是我目前正在使用的:
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 行。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。