Почему мой .NET SQL UPDATE работает только один раз? - PullRequest
1 голос
/ 04 мая 2019

По какой-то причине приведенный ниже код на самом деле работает только один раз после стрельбы (и иногда дважды, если мне повезет).

После этого он возвращает res > 0, но строка в базе данных не изменяется. Любая идея, почему это происходит и как я могу это исправить?

Я уже пытался избавиться от объекта DbCommand (как вы можете видеть).

public static async Task<bool> SetWallpaper(CornUser User, ulong ID)
{
    using (DbCommand dbCommand = DbProviderFactory.CreateCommand()) 
    { 
        dbCommand.Connection = SQLConnection;

        dbCommand.CommandText = @"
            UPDATE Users
            SET Wallpaper = @Wallpaper
            WHERE DiscordID = @DISCORDID";

        dbCommand.Parameters.Add(new SqlParameter("@DISCORDID", System.Data.SqlDbType.BigInt) { Value = User.ID });
        dbCommand.Parameters.Add(new SqlParameter("@Wallpaper", System.Data.SqlDbType.Int) { Value = ID });

        dbCommand.Prepare();

        int res = await dbCommand.ExecuteNonQueryAsync();
        return (res > 0);
    }
}

Я бы ожидал, что он на самом деле изменит столбец Wallpaper на ID, предоставленный постоянно.

1 Ответ

1 голос
/ 07 мая 2019

Оооочень ... Я нашел решение.

Так что после нескольких дней работы я полностью переписал весь класс UserDataService (который содержал такие задачи.

И изменилсякоманды к следующему:

using (TransactionScope scope = new TransactionScope(TransactionScopeAsyncFlowOption.Enabled))
        {
            using (DbConnection connection = DbProviderFactory.CreateConnection())
            {
                connection.ConnectionString = SQLConnectionString;
                await connection.OpenAsync();
                DbCommand command = connection.CreateCommand();
                command.CommandText = "UPDATE Users SET Wallpaper=@WallpaperID WHERE DiscordID=@DiscordID";
                command.Parameters.Add(new SqlParameter("@DiscordID", SqlDbType.BigInt) { Value = UserID });
                command.Parameters.Add(new SqlParameter("@WallpaperID", SqlDbType.BigInt) { Value = WallpaperID });
                await command.ExecuteNonQueryAsync();
                scope.Complete();
                return true;
            }
        }

Что, похоже, помогло!

Спасибо @RazvanSocol за то, что направили меня в правильном направлении!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...