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

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

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

从SQL Server读取null并在更新上写回No是可接受的行为。

任何帮助是极大的赞赏。

编辑 – 这是为Windows开发的。

修改填充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提供参数。 然后,如果要支持这些操作,则需要创建用于更新和删除的命令。

如果您可以修改用于检索数据的SQL,请执行以下操作:

 Select isnull(MyColumn,'No') as MyColumn 

无需先修改数据即可轻松完成。 您可以直接绑定到您的复选框,然后绑定DataBindings中 高级您可以指定用于空值的内容。

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

这段代码将字符串转换为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; } 

我最初使用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; }