Проблема ADODB в C# - подозрительная проблема - преобразование данных - PullRequest
0 голосов
/ 31 марта 2020

Я смотрю на очень старое приложение windows и пытаюсь выяснить проблему.

Я получаю сообщение об ошибке «Ошибки, вызванные многошаговой операцией. Проверьте каждое значение состояния».

А код и другие подробности приведены ниже

public static bool CopyFromType(object newValues, ref ADODB.Recordset20 returnValues)
    {

        bool flag = false;

        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())
                {
                    if (property.GetValue(newValues, null) != null && property.GetValue(newValues, null).ToString() != "")
                    {
                        //cast old value type to new value
                        aField.Value = property.GetValue(newValues, null);

                        flag = true;
                    }
                }
                else
                {
                }
            }

        }
        returnValues.Update();

        return flag;
    }

Ошибка возникает в строке aField.Value = property.GetValue (newValues, null); для указанного поля c (PROJECT_ID). Тип данных в базе данных: adNumeri c. Я пытался преобразовать в Int при присвоении значения, но все еще бесполезно.

enter image description here

Любая помощь будет отличной. Спасибо.

1 Ответ

0 голосов
/ 31 марта 2020

Какое бы свойство не возвращало 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;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...