如何使用DataRowCollection.Add创建DataRow时将1和0转换为bool?

时间:2017-05-18 00:23:49

标签: c# .net system.data

我正在尝试将一些旧的CSV文件导入到我的数据库中,这些文件使用位/布尔值导出为1和0而不是True / False。

我需要与期望DataRow的系统进行交互,因此我使用DataTable.Row.Add(params object[] values)重载,它允许您传入一组对象,然后将这些对象映射到列中,以创建我的DataRowsDataTable 设置了Columns,其架构与目标数据库匹配。

除了这些位/布尔值之外,这一切都适用于每个列类型,它抱怨它无法使用以下异常进行转换:

  

System.ArgumentException:'字符串未被识别为有效的布尔值。不能存储< 1>在IsEnabled专栏中。预期的类型是布尔值。'

我想找到一种方法来自定义转换代码,以便它知道如何将数字(存储为字符串)转换为bool。有没有办法做到这一点?

更新:具体来说,我希望尽可能避免手动转换object[]数组中的数据。

2 个答案:

答案 0 :(得分:0)

以下是其他一些想法。首先,您可以将所有“0”或“1”字符串转换为bool

// A list representing one row (for example)
var data = new List<string> { "1", "Hello World", "true" };

// Retrun all items as strings unless it can be parsed to  
// a '1' or a '0', in which case convert it to a boolean
int tmp;
object[] result = data.Select(d =>
    int.TryParse(d, out tmp) && (tmp == 1 || tmp == 0)
        ? (object) Convert.ToBoolean(tmp)
        : d)
    .ToArray();

DataTable.Row.Add(result);

或者,如果您知道每列的类型,则可以为数据行中的所有项创建“类型映射”。然后,您可以将字符串数据转换为强类型数据,并将它们存储在对象数组中:

// A list of items representing the type of each column in a row
var typeMap = new List<Type> {typeof(int), typeof(string), typeof(bool)};

// A list representing one row (for example)
var data = new List<string> {"1", "Hello World", "true"};

// The array of converted data to add to your DataTable
var result = new object[data.Count];

// Convert each string to it's corresponding type
for(int i = 0 ; i < data.Count; i++)
{
    result[i] = Convert.ChangeType(data[i], typeMap[i]);
}

DataTable.Row.Add(result);

答案 1 :(得分:0)

另一种方法是使用Add方法的重载,需要DataRow

DataTable dt  = new DataTable();
var row  = dt.NewRow();
//considering your input value can be 1 or 0 and colName is of bool type
row["colName"] = (1 == yourInputVal); 
//your other col mappings and any other customization you may need
dt.Rows.Add(row);