【发布时间】:2021-11-28 00:54:08
【问题描述】:
我正在使用 DataColumn 为 DataTable 创建一个新列。我使用AllowDBNull 指定列可以有NULL 值。
这很好用,除非我有一个 uniqueidentifier 类型的列我正在做的地方
public static Type GetClrType(SqlDbType sqlType, bool isNullable)
{
switch (sqlType)
{
case SqlDbType.UniqueIdentifier:
return isNullable ? typeof(Guid?) : typeof(Guid);
......other types......
}
}
DataColumn columnValue = DataColumn(column.Name, GetClrType(columnType, IsNullable))
dt.Columns.Add(columnValue);
我在尝试使用 CsvHelper 加载数据表并看到错误时遇到问题
未处理的异常。 System.AggregateException:一个或多个错误 发生了。 (Guid 应包含 32 位数字和 4 个破折号 (xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx)。无法将
<NULL>存储在 MyGuIdColumn 列。预期类型是 Guid。)
感谢任何解决此问题的帮助。
更新(更多详情):
CSV 文件记录是这样的:
Id (uniqueidentifier, Not null) | Name (Nvarchar, null) | OtherId (uniqueidentifier, null)
deb01846-c208-ec01-a4e4-005056bc1234 | TestName | NULL
我正在读取这样的 csv 文件:
var dt = new DataTable();
// get the table def -> will have all column props
foreach (column in columns)
{
var columnType = column.DataType; // (uniqueidentifier) I get this value from table schema
var dataType = Map.GetClrType(columnType); // (GUID) from a SqlDbType -> c# map
DataColumn columnValue = new DataColumn(column.Name, dataType);
columnValue.AllowDBNull = true; // comes from IS Nullable column of table schema
columnValue.DefaultValue = if is nullable => Guid.Empty/Null/DbNUll.Value; // tried these
dt.Columns.Add(columnValue);
}
using (var reader = new StreamReader(filePath))
using (var csv = new CsvReader(reader, CultureInfo.InvariantCulture))
{
using (var dr = new CsvDataReader(csv))
{
dt.Load(dr); // error here
return dt;
}
}
【问题讨论】:
-
分享异常代码
-
更新了更多细节
-
您的架构标记为
NOT NULL,并且您在.NET 端指定typeof(Guid)(不是typeof(Guid?))。这些都不支持NULL -
@Flydog57 更新了我的帖子。我确实有你提到的方式。
标签: c# bulkinsert sqlbulkcopy csvhelper