在DataTable中将Yes / No / Null从SQL转换为True / False

时间:2010-03-25 15:35:40

标签: c# sql sql-server datatable

我有一个Sql数据库(我无法控制架构),它有一个将具有varchar值为“是”,“否”的列,或者它将为null。出于我正在做的目的,null将被处理为No。

我使用数据表和表适配器在c#net 3.5中编程来提取数据。我想使用绑定源将列直接绑定到我的程序中的复选框但是我不知道如何或在何处将逻辑转换为字符串Yes / No / null为布尔值True / False;

从SQL服务器读取空值并在更新时写回“否”是可接受的行为。

非常感谢任何帮助。

编辑 - 这是为Windows开发的。

5 个答案:

答案 0 :(得分:8)

修改填充DataTable的查询以包含相应的逻辑:

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

编辑:忘了你还必须在DataAdapter上提供插入/更新/删除命令。

为了使用上述功能提交工作,您需要指定自定义命令来执行对DB的更新:

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 :(得分:1)

如果您可以修改用于检索数据的SQL,请执行类似..

的操作
Select isnull(MyColumn,'No') as MyColumn

答案 2 :(得分:1)

这可以在不首先修改数据的情况下轻松完成。您可以直接绑定到您的复选框,然后绑定到 DataBindings |高级您可以指定用于空值的内容。

抱歉,我没有注意到您需要转换varchar是和否.Dathan的答案将正确获取您的数据,但我很确定您将不得不使用自定义保存方法手动更新值。

答案 3 :(得分:1)

此代码将字符串转换为bool?可以使用。可空类型具有'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;
}

答案 4 :(得分:0)

我最初使用过Dathan的解决方案但是我的复选框不会将其更新推送到它所绑定的数据表,同时尝试解决我发现的关于Binding.ParseBinding.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;
}