Как я могу изменить логическое значение на 0 или 1, могу ли я его разыграть?

У меня есть этот метод:

public void UpdatePhrase(PHRASE phraseColumn, bool value, string phraseId) 
{
   sql = string.Format("UPDATE Phrase SET " + phraseColumn.Text() + " = {0} WHERE PhraseId = '{1}'", value, phraseId);
        App.DB.RunExecute(sql);
}

Это работает неправильно, так как мне кажется, что мне нужно, чтобы значение {0} было 0 или 1.

Есть ли простой способ, которым я могу взять значение и изменить его на 0 или 1?

или использовать фразу?1:0

BugFinder 08.04.2019 14:53

Простой тройной value ? 1 : 0

phuzi 08.04.2019 14:53

Просто поставьте (значение?1:0)

GregorMohorko 08.04.2019 14:53

Немного OT, но не делайте создает подобные SQL-запросы, они склонны к SQL-инъекциям.

phuzi 08.04.2019 14:54

Возможный дубликат С# логическое значение преобразования int

NineBerry 08.04.2019 14:54

Нет лучшего способа, чем использовать параметры. Извините, но ваш App.DB.RunExecute(sql);, похоже, не может получать параметры. Вам нужен определенный уровень рефакторинга здесь

Steve 08.04.2019 14:56

@phuzi советует людям использовать параметры никогда OT... (пока вопрос действительно относится к SQL, я полагаю...)

Marc Gravell 08.04.2019 15:08
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
6
7
613
8
Перейти к ответу Данный вопрос помечен как решенный

Ответы 8

Ответ принят как подходящий

Просто сделайте value ? 1 : 0, это так просто!

value ? 1 : 0

как в ответе @Sean или

Convert.ToInt32(value)

ToInt32(Boolean) Converts the specified Boolean value to the equivalent 32-bit signed integer.

@Sean дал вам естественное решение вашей проблемы, но, на мой взгляд, вам действительно нужно здесь реорганизовать ваш App.Db.RunExecute для получения параметров, чтобы вы могли написать

public void UpdatePhrase(PHRASE phraseColumn, bool value, string phraseId) 
{
   sql = "UPDATE Phrase SET " + phraseColumn.Text() + " = @v WHERE PhraseId = @id";
   List<SqlParameter> prms = new List<SqlParameter>
   {
      new SqlParameter {ParameterName = "@v", SqlDbType = SqlDbType.Boolean, Value = value},
      new SqlParameter {ParameterName = "@id", SqlDbType = SqlDbType.NVarChar, Value = phraseId}
   };
   App.DB.RunExecute(sql, prms);
}

Это устранит частично проблему Sql Injection (я говорю частично, потому что фразаКолонка.Текст() по-прежнему является источником проблем, если его значение исходит из пользовательского ввода)

Теперь ВыполнитьВыполнить должен измениться на

void RunExecute(string sqlCommand, List<SqlParameter> prms = null)
{
     // usual code to open connection and create a command
     ......

     // If the caller passes a parameters list, add them to the command
     if (prms != null)
        cmd.Parameters.AddRange(prms.ToArray());

     // Now execute the command
     cmd.ExecuteNonQuery();
}

Изменение на ВыполнитьВыполнить использует необязательный аргумент, поэтому на ваш текущий код не влияет наличие нового аргумента, но теперь вы сможете писать более качественный код Sql.

Я хотел бы знать причину минуса. Если в этом ответе что-то не так, я думаю, нам всем нужно знать и избегать этого.

Steve 08.04.2019 15:46

Отличный ответ. Это не только помогает ответить на вопрос ОП, добавление SqlParameters в список, а затем использование cmd.Parameters.AddRange(list.ToArray()) — это новая концепция (для меня), которая кажется чрезвычайно полезной и чистой: +1

Jaskier 08.04.2019 21:45

Я бы предположил, что причина отрицательного ответа заключается в том, что вы на самом деле не отвечаете на вопрос, который теперь заключается в преобразовании логического значения либо в 1, либо в 0. Хотя ваш ответ представляет собой отличный пример использования параметризованных запросов, он не один раз ответьте на исходный вопрос.

Sean 09.04.2019 09:52

В этом есть смысл, @Sean. Я не ответил на это, потому что у нас уже есть что-то вроде 3 ответов, которые объясняют, как преобразовать логическое значение в целое число. (а два - просто плохая копия вашего). Мне нет смысла повторять снова первый естественный фикс. Поэтому я думаю, что, чтобы сделать мой ответ лучше, мне просто нужно признать вашу работу.

Steve 13.04.2019 09:49
public void UpdatePhrase(PHRASE phraseColumn, bool value, string phraseId) 
{
   sql = string.Format("UPDATE Phrase SET {phraseColumn} = {value ? 1 : 0} WHERE PhraseId = '{phraseId}'");
        App.DB.RunExecute(sql);
}

Но это может быть объектом атак SQL-инъекций, поэтому лучше написать его как параметризованный запрос.

(int)value даже не компилируется
HimBromBeere 08.04.2019 15:17

Правда, какое-то время я думал на C. Фиксированный.

Steve Todd 08.04.2019 15:53

Для сценариев, требующих экстремальная производительность, вы можете использовать пакет System.Runtime.CompilerServices.Unsafe для выполнения этого преобразования непосредственно в процессе работы. Это приведет к машинному коду, который не содержит ветвлений или вызовов функций.

using System.Runtime.CompilerServices;

/// ...

bool _bool;
byte _byte;

_bool = true;
_byte = Unsafe.As<bool, byte>(ref _bool);
Console.WriteLine(_byte);           //  -->  1

_bool = false;
_byte = Unsafe.As<bool, byte>(ref _bool);
Console.WriteLine(_byte);           //  -->  0

Вы также можете использовать этот метод для настройки переменной ref local byte, которая экзистенциально представляет мгновенная идентичностьBoolean, но рассматривается как byte. Это может быть полезно для постоянного наблюдения за изменением { false, true } с использованием { 0, 1 } интерпретации.

class Program
{
    static bool _bool;

    static void Main()
    {
        Task.Factory.StartNew(() => { while (true) _bool = !_bool; });

        // define a "ref local" that persistently views Boolean value '_bool' as a byte
        ref byte _byte = ref Unsafe.As<bool, byte>(ref _bool);

        while (true)
            Console.Write(_byte + " ");
    }
};

Если вы не знакомы с ref, с помощью только что показанной техники нет «машин», участвующих в каком-либо «обновлении» или «преобразовании» всякий раз, когда значение изменяется, потому что ref byte на самом деле просто другой «вид» оригинала. Boolean сама сущность.

Результат несколько завораживает.

Вы можете использовать int count = updateCommand.ExecuteNonQuery;, чтобы if count>0, это означало, что наша миссия выполнена 1 (Истина), иначе 0 (Ложь)

updateCommand.Parameters.AddWithValue("@Var" , "Johne");

    try
    {
        connection.Open();
        int count = updateCommand.ExecuteNonQuery;
        if (count > 0)
            return true;
        else
            return false;
    }
    catch (SqlException ex)
    {
        throw ex;
    }
    finally
    {
        connection.Close();
    }
}

Надеюсь, вы поняли суть ^_^.

вы можете сделать (GetHashCode для логических значений возвращает константу 1/0, без расчета):

true.GetHashCode() // 1
false.GetHashCode() // 0
 public object VerySimplyCompactFastTrueBestConvertObjectToInt(object whatNeedToConvertBro, object whatTypeIsYoNeedBro)
    {
        var typeOfConvertingObject = whatNeedToConvertBro.GetType();
        var objWhatWillBeaReturnedInOut = new object();
        if ((typeOfConvertingObject == whatTypeIsYoNeedBro.GetType()) == true)
        {
            objWhatWillBeaReturnedInOut = Convert.GetTypeCode(whatTypeIsYoNeedBro);
        }
        return objWhatWillBeaReturnedInOut;
    }

   

}

Другие вопросы по теме