C# Discord.net任务调用问题

C# Discord.net任务调用问题,c#,.net,discord,discord.net,C#,.net,Discord,Discord.net,我正在尝试在.NET中创建一个discord bot,使用命令将用户置于标记上。例如,服务器管理员给用户50个标记,用户将删除其所有角色,并将获得一个名为“标记”的角色。然后,会出现一个文本频道,用户需要发送50条垃圾邮件来删除标记,然后他就可以取回所有东西。我已经发出了给出标记和删除标记的命令,但是当我试图通过调用Program.cs中的函数来删除某人的标记时,出于某种原因,它会给出一个空指针异常。代码如下: Program.cs事件: private async Task MessageRe

我正在尝试在.NET中创建一个discord bot,使用命令将用户置于标记上。例如,服务器管理员给用户50个标记,用户将删除其所有角色,并将获得一个名为“标记”的角色。然后,会出现一个文本频道,用户需要发送50条垃圾邮件来删除标记,然后他就可以取回所有东西。我已经发出了给出标记和删除标记的命令,但是当我试图通过调用Program.cs中的函数来删除某人的标记时,出于某种原因,它会给出一个空指针异常。代码如下:

Program.cs事件:

private async Task MessageRecieved(SocketMessage arg)
        {
            //Checking if the user has markers
            var roles = (arg.Author as SocketGuildUser).Roles;
            bool imaMarkere = false;
            foreach (var role in roles)
            {
                if (role.Id == 844558286611152917)
                    imaMarkere = true;
            }
            
            if (arg.Channel.Id == 844558185024585770 && imaMarkere)
            {
                int markerCount = 0;
                using (SqliteConnection con = new SqliteConnection(connectionString))
                {
                    con.Open();
                    string query = $"select markercount from markers";
                    var com = con.CreateCommand();
                    com.CommandText = query;
                    var rdr = com.ExecuteReader();
                    if (rdr.Read())
                    {
                        markerCount += Convert.ToInt32(rdr["markercount"]) - 1;
                    }
                    rdr.Close();
                    //Removing 1 marker per message recieved
                    if (markerCount > 0)
                    {
                        com.CommandText = $"update markers set markercount={markerCount} where userid='{arg.Author.Id}'";
                        com.ExecuteNonQuery();
                    }
                    //If no markers are left returning the user roles
                    else
                    {
                        Commands c = new Commands();
                        await c.Skini(arg.Author as IGuildUser);
                    }
                    con.Close();
                }
            }
            else return;
            
        }
Commands.cs

[Command("skini"), RequireUserPermission(GuildPermission.Administrator, ErrorMessage = "Nemate potrebnu dozvolu ``ADMINISTRATOR``")]
            public async Task Skini(IGuildUser user = null)
            {
                if(user == null)
                {
                    await ReplyAsync($"{Context.User.Mention},kome da skinem?");
                }
            string rolesString = "";
            string[] roles;
            using (SqliteConnection con = new SqliteConnection(connectionString))
            {
                con.Open();
                var com = con.CreateCommand();
                string readQuery = "select pastroles from markers";
                com.CommandText = readQuery;
                var rdr = com.ExecuteReader();
                if (rdr.Read())
                {
                    rolesString += rdr["pastroles"].ToString();
                }
                rdr.Close();
                string deleteQuery = $"delete from markers where userid = '{user.Id}'";
                com.CommandText = deleteQuery;
                com.ExecuteNonQuery();
                con.Close();
                
            }
            roles = rolesString.Split(",");
            foreach (var roleid in roles)
            {
                var role = Context.Guild.GetRole(Convert.ToUInt64(roleid));//this line is where the exception happens
                if(!role.IsEveryone)
                    await user.AddRoleAsync(role);
            }
            var roleMarkeri = Context.Guild.GetRole(844558286611152917);
            await user.RemoveRoleAsync(roleMarkeri);
            var EmbedBuilder = new EmbedBuilder()
                    .WithTitle("**MARKERI**")
                    .WithColor(Color.Blue)
                    .WithDescription($":white_check_mark: {Context.User.Mention} je **skinuo** markere {user.Username}")
                    .WithFooter(footer =>
                    {
                        footer
                        .WithText("Marker log");
                    });
            Embed embed = EmbedBuilder.Build();
            await ReplyAsync(embed: embed);
        }

您应该尝试创建一个用于SQL连接的字段。如果(arg.Channel.Id==844558185024585770&&imarkere)为真,则在程序开始时初始化连接,这样您就不必每次都连接到它。还有,程序.cs的功能是什么?你能说明代码的哪一部分出错吗?具体哪一行并提供内部异常。错误消息说错误在哪一行?