我正在尝试将一些旧的CSV文件导入到我的数据库中,这些文件使用位/布尔值导出为1和0而不是True / False。
我需要与期望DataRow
的系统进行交互,因此我使用DataTable.Row.Add(params object[] values)
重载,它允许您传入一组对象,然后将这些对象映射到列中,以创建我的DataRows
。 DataTable
设置了Columns
,其架构与目标数据库匹配。
除了这些位/布尔值之外,这一切都适用于每个列类型,它抱怨它无法使用以下异常进行转换:
System.ArgumentException:'字符串未被识别为有效的布尔值。不能存储< 1>在IsEnabled专栏中。预期的类型是布尔值。'
我想找到一种方法来自定义转换代码,以便它知道如何将数字(存储为字符串)转换为bool。有没有办法做到这一点?
更新:具体来说,我希望尽可能避免手动转换object[]
数组中的数据。
答案 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);