Какое бы свойство не возвращало property.GetValue (newValues, null) превышает допустимую определенную длину поля, и / или вам необходимо проверить и привести возвращаемое значение к типу int.
Также не уверен, что этот флаг закодирован правильно, потому что, если одна итерация не удалась, но следующая прошла успешно, она устанавливает флаг в true. Если вы хотите проверить, не удалось ли ЛЮБОЕ из значений, вы должны вернуться после первого сбоя, отменяя вставку.
Приведенный ниже код также устраняет необходимость проверки на наличие строки нулевой или нулевой длины.
public static bool CopyFromType(object newValues, ref ADODB.Recordset20 returnValues)
{
returnValues.AddNew();
foreach (ADODB.InternalField aField in returnValues.Fields)
{
Type type = newValues.GetType();
PropertyInfo[] properties = type.GetProperties();
foreach (PropertyInfo property in properties)
{
if (property.Name.ToUpper() == aField.Name.ToUpper())
{
//cast old value type to new value
int rst;
if (int.TryParse(property.GetValue(newValues, null), out rst))
{
aField.Value = rst;
flag = true;
}
else
{
//Something wrong won't cast to int
//Kick out of function
returnValues.CancelUpdate();
return = false;
}
}
}
}
}
returnValues.Update();
return true;
}