Преобразовать Да / Нет / Нуль из SQL в Истину / Ложь в DataTable - PullRequest
4 голосов
/ 25 марта 2010

У меня есть база данных Sql (которую я не контролирую по схеме), в которой есть столбец со значением varchar "Да", "Нет" или оно будет нулевым. Для того, что я делаю, null будет обработан как №

Я программирую в c # net 3.5, используя таблицу данных и адаптер таблицы, чтобы извлечь данные. Я хотел бы напрямую связать столбец, используя источник привязки, с флажком, установленным в моей программе, однако я не знаю, как или где разместить логику для преобразования строки Да / Нет / нуль в логическое значение Истина / Ложь;

Чтение нулевого значения с сервера SQL и запись ответа «Нет» в обновлении является приемлемым поведением.

Любая помощь очень ценится.

РЕДАКТИРОВАТЬ - Это разрабатывается для Windows.

Ответы [ 5 ]

9 голосов
/ 25 марта 2010

Измените запрос, который заполняет ваш DataTable, чтобы включить соответствующую логику:

SELECT col1, col2, CAST(CASE YesNoNullCol WHEN 'yes' THEN 1 WHEN 'no' THEN 0 ELSE 0 END AS BIT) FROM SomeTable

РЕДАКТИРОВАТЬ: Забыл, что вы также должны предоставить команды вставки / обновления / удаления в DataAdapter.

Чтобы заставить коммиты работать с использованием вышеуказанного, вам нужно указать пользовательские команды для обновления БД:

SqlCommand insert_cmd = connection.CreateCommand();
insert_cmd.CommandText = "INSERT INTO SomeTable(col1, col2, YesNoNullCol) VALUES (@col1, @col2, CASE @yesnonullcol WHEN 1 THEN 'Yes' WHEN 0 THEN 'No' ELSE 'No' END)";
var yesno_col = insert_cmd.CreateParameter();
yesno_col.Name = "@yesnonullcol";
insert_cmd.Parameters.Add(col1_parm);
myAdapter.InsertCommand = insert_cmd;

И, конечно, вам необходимо указать параметры и для @col1 и @col2. А затем вам нужно создать команды для обновления и удаления, если вы хотите поддерживать эти операции.

1 голос
/ 25 марта 2010

Этот код преобразует строку в bool? это можно использовать. Типы Nullabe имеют свойство HasValue, которое указывает, являются ли они нулевыми или нет.

public bool TryParseNullableBool (string value, out bool? result)
{
  result = false;
  if (string.IsNullOrEmpty (value))
  {
    result = null;
    return true;
  }
  else
  {
    bool r;
    if (bool.TryParse (value, out r))
    {
      result = r;
      return true;
    }
  }
  return false;
}
1 голос
/ 25 марта 2010

Это легко сделать без предварительного изменения данных. Вы можете связать непосредственно с вашим флажком, затем в DataBindings | Дополнительно вы можете указать, что использовать для нулевого значения.

Извините, я не заметил, что вам нужно преобразовать varchar. Да и нет. Ответ Дафана даст правильные данные, но я уверен, что вам придется вручную обновлять значения с помощью пользовательского метода сохранения. *

1 голос
/ 25 марта 2010

Если вы можете изменить SQL, который вы используете для извлечения данных, сделайте что-то вроде ..

Select isnull(MyColumn,'No') as MyColumn
0 голосов
/ 25 марта 2010

Первоначально я использовал решение Дафана, однако мой флажок не будет выдвигать его обновления в таблицу данных, к которой он был привязан, при попытке решить эту проблему я узнал о Binding.Parse и Binding.Format. Теперь я оставляю запрос в нормальном состоянии и использую это:

Public Form1()
{
    InitializeComponent();
    cbxKeepWebInfinityChanges.DataBindings["Checked"].Parse += new ConvertEventHandler(cbxKeepWebInfinityChanges_Parse);
    cbxKeepWebInfinityChanges.DataBindings["Checked"].Format += new ConvertEventHandler(cbxKeepWebInfinityChanges_Format);
}

void cbxKeepWebInfinityChanges_Parse(object sender, ConvertEventArgs e)
{
    if ((bool)e.Value == true)
        e.Value = "Yes";
    else
        e.Value = "No";
}
void cbxKeepWebInfinityChanges_Format(object sender, ConvertEventArgs e)
{
    if ((string)e.Value == "Yes")
        e.Value = true;
    else
        e.Value = false;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...