DataTable load()约束错误
本文关键字:约束 错误 load DataTable | 更新日期: 2023-09-27 18:02:28
我在下面写了一个方法,使用反射来加载。net应用程序中的几个强类型数据表。如果我像下面这样运行,一切都可以工作-包括没有抛出异常。但是,如果我使用注释部分而不是(保持其他所有内容相同),那么我得到未能启用约束这里描述的错误:在这里输入链接描述。
如果我看一下errors数组里面的内容,它总是如下所示:
"Column 'AEDelegateName' does not allow DBNull.Value."
和错误的ItemArray看起来像这样:
[0] = {}
[1] = "Some Value"
这让我感到惊讶,因为我只期望在选择1列的脚本中有1列,而不是像上面所指示的那样有2列。我还认为这很接近问题,因为其中一个似乎是空的。
我的脚本不返回null,我可以快速和直观地确认它,以及在我使用的查询中说像 not null 之类的东西。
private void GetData(string query, Component tableAdapter)
{
OracleCommand command = new OracleCommand();
command.Connection = conn;
command.CommandText = query;
command.CommandType = CommandType.Text;
command.CommandTimeout = 3000;
OracleDataReader reader = command.ExecuteReader(CommandBehavior.SingleResult);
MethodInfo[] methods = tableAdapter.GetType().GetMethods();
MethodInfo getDataMethod = tableAdapter.GetType().GetMethod("GetData");
DataTable table = (DataTable)getDataMethod.Invoke(tableAdapter, null);
Type[] paramTypes = new Type[] { table.GetType() };
MethodInfo updateMethod = tableAdapter.GetType().GetMethod("Update", paramTypes);
foreach (DataRow row in table.Rows)
{
row.Delete();
}
//try
//{
// if (reader.HasRows)
// {
// table.Load(reader, LoadOption.OverwriteChanges, FillErrorHandler);
// }
//}
//catch (Exception e)
//{
// DataRow[] errors = table.GetErrors();
//}
while (reader.Read())
{
try
{
List<object> newRow = new List<object>();
for (int i = 0; i < reader.FieldCount; ++i)
{
object currentValue = reader.GetValue(i);
Debug.WriteLine("Value: "+currentValue);
newRow.Add(currentValue);
}
table.Rows.Add(newRow.ToArray());
}
catch (ConstraintException e)
{
DataRow[] errors = table.GetErrors();
}
}
updateMethod.Invoke(tableAdapter, new object[]{table});
reader.Close();
}
根据DataTable的文档。加载方法(IDataReader, LoadOption),我怀疑您可能会遇到下面摘录中描述的行为。您是否检查了从查询返回的列数与DataTable上的列数?从查询返回的列名是否与DataTable中所需的列名匹配?
Condition:模式是兼容的,但是加载的结果集模式比DataTable包含的列少。
行为:如果缺失的列定义了默认值或列的数据类型为空,则Load方法允许行为空添加,为缺失的列替换默认值或空值。如果没有默认值或可以使用null,则Load方法会抛出一个例外。如果没有提供特定的默认值,则Load方法使用空值作为隐含的默认值。
while循环中的代码可能正在工作,因为它没有尝试匹配模式。它只是按位置填充值,只要类型兼容,不违反约束,并且数组包含的项不超过行所包含的列,它就会成功。