如果dt具有longtext
列,则在修改datable中的数据时会发生此错误。
首先我加载数据表:
var command = new MySqlCommand(queryTableData, connection);
DataTable table = new DataTable();
try
{
connection.Open();
table.Load(command.ExecuteReader());
}
当我尝试修改任何列数据时:
table.BeginLoadData();
for (var i = 0; i < table.Rows.Count; i++)
{
table.Rows[i]["columnName"] = value;
}
table.EndLoadData();
它在table.EndLoadData();
上失败并显示错误:RowError: "Column 'longtext_val' exceeds the MaxLength limit."
它还将MaxLength: 0
列的longtext
属性设置为0,其他属性具有正常的最大长度。在数据库中,它被设置为'4294967295'。
我可以通过删除约束来避免这种情况:
using (var reader = command.ExecuteReader())
{
DataSet dataSet = new DataSet();
dataSet.Tables.Add(table);
dataSet.EnforceConstraints = false;
table.Load(reader);
}
最后一个片段来自mysql site
但在我的情况下,它不是一个选项,可以更改此列的最大长度?或者有解决方案吗?
P.S。 MySQL中的DataType如下所示:
name:'longtext_val',
默认值:NULL,
is_nullable:'是',
data_type:'longtext',
character_max_length:'4294967295',
character_set_name:'utf8',
collation_name:'utf8_general_ci',
column_type:'longtext'
请注意,我事先并不知道架构,此数据库仅用于测试目的。
P.S.S。 我找不到确切的解决方案所以我不得不做一个解决方法。
我想到了两件事:
1.仅选择不是longtext
的列
2.处理实际问题 - 更新数据表。
MySQL数据表会抛出基于行的错误,因此如果您的列上有任何错误并且您尝试修改任何其他列 - 您将获得异常。
MsSQL在基于列的基础上引发了异常。因此,如果您尝试修改非错误列,它不会抛出异常。
因此,我得到所有不同的列都有错误,如果我感兴趣的列引发了异常,我会处理:
var errorColumns = table.GetErrors()
.SelectMany(row => row.GetColumnsInError()).Distinct().ToList();
if (errorColumns.Any(column => column.ColumnName == columnMeta.ColumnName))
{
//handle
}