У меня есть этот метод:
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?
Простой тройной value ? 1 : 0
Просто поставьте (значение?1:0)
Немного OT, но не делайте создает подобные SQL-запросы, они склонны к SQL-инъекциям.
Возможный дубликат С# логическое значение преобразования int
Нет лучшего способа, чем использовать параметры. Извините, но ваш App.DB.RunExecute(sql);, похоже, не может получать параметры. Вам нужен определенный уровень рефакторинга здесь
@phuzi советует людям использовать параметры никогда OT... (пока вопрос действительно относится к SQL, я полагаю...)
Просто сделайте 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.
Я хотел бы знать причину минуса. Если в этом ответе что-то не так, я думаю, нам всем нужно знать и избегать этого.
Отличный ответ. Это не только помогает ответить на вопрос ОП, добавление SqlParameters
в список, а затем использование cmd.Parameters.AddRange(list.ToArray())
— это новая концепция (для меня), которая кажется чрезвычайно полезной и чистой: +1
Я бы предположил, что причина отрицательного ответа заключается в том, что вы на самом деле не отвечаете на вопрос, который теперь заключается в преобразовании логического значения либо в 1, либо в 0. Хотя ваш ответ представляет собой отличный пример использования параметризованных запросов, он не один раз ответьте на исходный вопрос.
В этом есть смысл, @Sean. Я не ответил на это, потому что у нас уже есть что-то вроде 3 ответов, которые объясняют, как преобразовать логическое значение в целое число. (а два - просто плохая копия вашего). Мне нет смысла повторять снова первый естественный фикс. Поэтому я думаю, что, чтобы сделать мой ответ лучше, мне просто нужно признать вашу работу.
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
даже не компилируется
Правда, какое-то время я думал на C. Фиксированный.
Для сценариев, требующих экстремальная производительность, вы можете использовать пакет 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;
}
}
или использовать фразу?1:0